Dayu 三方消息发送客户端封装

背景
现在移动互联网已经普及,越来越多的项目会把重心向移动端倾斜,例如企业微信端、微信小程序端、钉钉端、微信公众号等,涉及客户端的服务,消息通知是必不可少的业务功能,但是面对如此多客户端的消息通知服务,每套系统都需要做对应API的适配开发,对没有使用过对应客户端接口的团队更是需要花费一定时间对API使用方式进行调研,工作重复且非常繁琐。
为解决以上问题,客户端消息推送组件的出现就十分必要,该组件作为一个独立代码包,可以集成到项目主服务上,为其提供各客户端的消息推送服务,统一封装消息推送接口调用逻辑,标准化接口的输入和输出,方便业务系统直接使用,无需关注具体实现细节,更专注业务本身,减少重复工作,提升效率。
市场前景
在涉及到客户端通知业务的项目上,客户端消息推送组件可以为原系统提供市面上各主流客户端消息通知发送业务的快速集成能力,减少此类工作的调研及接入等重复工作,在后续的扩展中,还可以增加市面上主流短信平台的短信推送业务,进一步完善组件功能。
在越来越重视客户端的新零售项目上,客户端消息推送组件的出现势在必行。
项目定位
项目以jar包引入的形式提供服务。
spring-boot-simple下载
📎message-push-simple-app.zip
客户端类型
注意:该步骤还是需要配置的可以帮你你管理token的有效期,token的有效期设置为默认提供的
引入本地缓存caffeine

<dependency>
    <groupId>com.aliyun.gts.bpaas</groupId>
    <artifactId>aliyun-gts-middleware-cache-starter</artifactId>
    <version>2.1.13.8-SNAPSHOT</version>
</dependency>
gts:
  cache:
    type: caffeine

企业微信
1.pom引入

<dependency>
    <groupId>com.aliyun.gts.bpass</groupId>
    <artifactId>message-push-wechat-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2.AK配置
AK配置分为2种方式。

  1. 配置文件配置
gts:
  push:
    wechat:
      corpid: xxxx
      corpsecret: xxxxxx

2.静态方法引入

WeChatMessagePushClient.setWeChatSources(DefaultSources.WeChatSources.builder().corpId("x")
                .corpSecret("xxx").build());

3.消息类型参数配置
1.Text

WeChatMessageCorpconversationAsyncsendV2Request.Msg msg=new WeChatMessageCorpconversationAsyncsendV2Request.Msg();
WeChatMessageCorpconversationAsyncsendV2Request.Text text=new WeChatMessageCorpconversationAsyncsendV2Request.Text();
text.setContent("lalalalalalalalala");
msg.setText(text);
msg.setMsgtype("text");
weChatMessageClientSendRequest.setMsg(msg);

2.markdown

WeChatMessageCorpconversationAsyncsendV2Request.Msg msg=new WeChatMessageCorpconversationAsyncsendV2Request.Msg();
WeChatMessageCorpconversationAsyncsendV2Request.Markdown markdown=new WeChatMessageCorpconversationAsyncsendV2Request.Markdown();
markdown.setContent("lalalalalalalala");
msg.setMsgtype("markdown");
msg.setMarkdown(markdown);
weChatMessageClientSendRequest.setMsg(msg);

3.其他类型的敬请期待会不断完善的
4.发送参数配置

/**
     * 指定接收消息的成员,成员ID列表(多个接收者用‘|’分隔,最多支持1000个)
     */
    private String touser;
    /**
     * 指定接收消息的部门,部门ID列表,多个接收者用‘|’分隔,最多支持100个。
     */
    private String toparty;
    /**
     * 指定接收消息的标签,标签ID列表,多个接收者用‘|’分隔,最多支持100个
     */
    private String totag;
    /**
     * 企业应用的id
     */
    private Long agentId;
    /**
     * 消息体
     */
    private WeChatMessageCorpconversationAsyncsendV2Request.Msg msg;
WeChatMessageClientSendRequest weChatMessageClientSendRequest=new WeChatMessageClientSendRequest();
weChatMessageClientSendRequest.setAgentId(XXX);
weChatMessageClientSendRequest.setTouser("xxx");
weChatMessageClientSendRequest.setMsg(msg);

5.发送接口调用

@Autowired
private MessagePushService messagePushService;


messagePushService.getService(ServiceNameEnum.wechat.name()).sendMessage(weChatMessageClientSendRequest)

6.返回响应结果结构

{
    "requestId":"5c53c1c0-467d-427e-8ea8-214add4fd525",
    "code":"",
    "message":"success",
    "success":true,
    "meta":null,
    "data":"ok"
}

钉钉端
1.pom引入

<dependency>
    <groupId>com.aliyun.gts.bpass</groupId>
    <artifactId>message-push-dingtalk-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2.AK配置
AK配置分为2种方式。

  1. 配置文件配置
gts:
  push:
    dingtalk:
      appKey: xxxx
      appSecret: xxxxxx

2.静态方法引入

DingTalkMessagePushClient.setDingTalkSources(DefaultSources.DingTalkSources.builder().appKey("xxx")
                .appSecret("xxxxx").build());

3.消息类型参数配置
1.Text

OapiMessageCorpconversationAsyncsendV2Request.Msg msg=new OapiMessageCorpconversationAsyncsendV2Request.Msg();
OapiMessageCorpconversationAsyncsendV2Request.Text text=new OapiMessageCorpconversationAsyncsendV2Request.Text();
text.setContent("hello dingtalk");
msg.setText(text);
msg.setMsgtype("text");

2.markdown

OapiMessageCorpconversationAsyncsendV2Request.Msg msg=new OapiMessageCorpconversationAsyncsendV2Request.Msg();
OapiMessageCorpconversationAsyncsendV2Request.Markdown markdown=new OapiMessageCorpconversationAsyncsendV2Request.Markdown();
markdown.setText("hello dingtalk");
markdown.setTitle("title");
msg.setMarkdown(markdown);
msg.setMsgtype("markdown");

3.还支持voice、image、oa、file、action_card、link
参考文档:https://developers.dingtalk.com/document/app/asynchronous-sending-of-enterprise-session-messages
4.发送参数配置

/**
     * 微应用的id
     */
    private Long agentId;

    /**
     * 接收者的部门id列表,最大列表长度20。
     *
     * 接收者是部门ID时,包括子部门下的所有用户
     */
    private String deptIdList;

    /**
     * 消息体,具体见文档
     * 文档地址:https://developers.dingtalk.com/document/app/asynchronous-sending-of-enterprise-session-messages
     */
    private OapiMessageCorpconversationAsyncsendV2Request.Msg msg;

    /**
     * 是否发送给企业全部用户。
     * 当设置为false时必须指定userid_list或dept_id_list其中一个参数的值。
     */
    private Boolean toAllUser;

    /**
     * 接收者的userid列表,最大用户列表长度100。
     */
    private String useridList;

    /**
     * 接受者的用户电话,和useridList参数二选一
     */
    private String telephone;
DingTalkMessageClientSendRequest dingTalkMessageClientSendRequest=new DingTalkMessageClientSendRequest();
dingTalkMessageClientSendRequest.setAgentId(xxxx);
dingTalkMessageClientSendRequest.setTelephone("xxxxx");
dingTalkMessageClientSendRequest.setToAllUser(false);
dingTalkMessageClientSendRequest.setMsg(msg);

5.发送接口调用

@Autowired
private MessagePushService messagePushService;


messagePushService.getService(ServiceNameEnum.dingtalk.name()).sendMessage(dingTalkMessageClientSendRequest)

6.返回响应结果结构

{
    "requestId":"054b9e23-9a6b-4ca8-85ea-65932959a05f",
    "code":"",
    "message":"success",
    "success":true,
    "meta":null,
    "data":"ok"
}

微信小程序
1.pom引入

<dependency>
    <groupId>com.aliyun.gts.bpass</groupId>
    <artifactId>message-push-miniwechat-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2.AK配置
AK配置分为2种方式。

  1. 配置文件配置
gts:
  push:
    miniwechat:
      appId: xxxx
      appSecret: xxxxxx

2.静态方法引入

MiniWeChatMessagePushClient.setMiniWeChatSources(DefaultSources.MiniWeChatSources.builder().appId("xxxx")
        .appSecret("xxxx").build());

3.发送参数配置

/**
     * 接收者(用户)的 openid
     */
    private String touser;

    /**
     * 所需下发的订阅模板id
     */
    private String templateId;

    /**
     * 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
     */
    private String page;

    /**
     * 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
     */
    private Object data;

    /**
     * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
     */
    private String miniprogramState;

    /**
     * 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
     * 返回值
     */
    private String lang;
MiniWeChatMessageClientSendRequest miniWeChatMessageClientSendRequest=new MiniWeChatMessageClientSendRequest();
miniWeChatMessageClientSendRequest.setTemplateId("xxx");
miniWeChatMessageClientSendRequest.setTouser("xxxx");
String data="{\n" +
"      \"time1\": {\n" +
"          \"value\": \"2015年01月05日\"\n" +
"      },\n" +
"      \"thing2\": {\n" +
"          \"value\": \"巴西\"\n" +
"      },\n" +
"      \"thing3\": {\n" +
"          \"value\": \"巴西龟\"\n" +
"      } \n" +
"  }";
miniWeChatMessageClientSendRequest.setData(data);

4.发送接口调用

@Autowired
private MessagePushService messagePushService;


messagePushService.getService(ServiceNameEnum.miniwechat.name()).sendMessage(miniWeChatMessageClientSendRequest);

5.返回响应结果结构

{
    "requestId":"054b9e23-9a6b-4ca8-85ea-65932959a05f",
    "code":"",
    "message":"success",
    "success":true,
    "meta":null,
    "data":"ok"
}