- 一、简介
- 二、消息模板配置
- 操作示例
- 1. 添加消息
- 2. 添加消息模版
- 3. 获取编号
- 三、套件后端工程处理
- 准备工作
- 1. 引入依赖pom.xml
- 2. 配置短信
- 3. 定义消息编号常量
- 4. 业务消息模板
- 系统发送消息给外部用户
- 1. 消息配置下只添加了推送方式为短信的模板
- 2. 消息配置下只添加了推送方式为邮件的模板
- 3. 消息配置下添加了推送方式为短信和邮件的模板
- 通过用户id发送消息给内部用户
- 1. 消息配置下只添加了推送方式为短信的模板
- 2. 消息配置下只添加了推送方式为邮件的模板
- 3. 消息配置下只添加了推送方式为应用消息的模板
- 4. 消息配置下只添加了推送方式为app推送的模板
- 5. 消息配置下添加了推送方式为短信和邮件的模板
- 6. 消息配置下添加了推送方式为应用消息和app推送的模板
- 7. 消息配置下添加了短信、邮件、应用消息和app推送4种方式的模板
- 通过组织id发送消息给内部用户
- 四、版本调整
- 配置页面调整
- 1. 如果涉及消息页面跳转,则必须要配置页面标识即页面管理中的页面标识(开发者后台->应用套件->页面管理)
- 2. 业务标识字段则根据业务需求自行决定,可填可不填。
- innerUser对象调整
- 五、短信模板审核
- 六、发送结果订阅
- 1. 开启套件订阅服务
- 2. 引入依赖pom.xml
- 3. 开启mq配置
- 4. 代码实现
一、简介
消息中心承担应用系统与消息终端之间的桥接工作,有以下能力:
- 提供统一的消息接口服务给应用系统,接受应用系统发送过来的消息;
- 按照设定的规则将消息分发给消息终端;
- 将用户通过消息终端反馈的信息推送给应用系统或者其他消息终端
消息中心使用统一格式标准接收消息数据,集中分发各类消息到各类设备和即时消息系统,起到消息总线的作用,解决应用系统直接与各类设备或即时消息系统通讯带来的复杂性。
二、消息模板配置
操作示例
1. 添加消息
- 进入开发者后台进入首页——>我的套件——>开发管理——>消息配置
- 地址:http://pai.flyrise.cn/developer/auth
- 添加消息
2. 添加消息模版
- 模板管理,先添加消息,再管理消息模板,可添加多种推送方式消息的模板,每种推送方式只能有一条。包含几种推送方式,则发送时会以这种方式发送。例如下图包含短信,邮件,应用消息,app推送4种模板,消息发送时会同时发送到短信,邮件,应用消息,app推送。
- 创建模版
- 从模板库引用
3. 获取编号
- 获取后端工程发送消息会使用到的标识信息
- 消息编号
- 套件标识
三、套件后端工程处理
准备工作
1. 引入依赖pom.xml
<!-- 消息发送依赖包 -->
<dependency>
<groupId>cn.flyrise</groupId>
<artifactId>pai-common-mc</artifactId>
<version>1.6.0</version>
</dependency>
2. 配置短信
application.yml or nacos->pai-xxx-xx.yaml
pai.sms.enable=false,默认值是true,false的时候关闭短信的发送
pai.sms.fixed-code,默认值是1234,使用verificationGeneratorHelper工具类获取随机的验证码
当enable为false的时候,验证码是当前设置的fixedCode
pai:
sms:
enable: true
fixed-code: 1234
verificationGeneratorHelper获取验证码示例
//注入工具类
@Resource
private VerificationGeneratorHelper verificationGeneratorHelper;
//获取数字的验证码
String code = verificationGeneratorHelper.getNumberCode();
String code = verificationGeneratorHelper.getNumberCode(Integer);
//获取字符的随机验证码
String code = verificationGeneratorHelper.getCode();
String code = verificationGeneratorHelper.getCode(Integer);
3. 定义消息编号常量
@Resource
private McTemplateService mcTemplateService;
//发送消息给外部用户-短信
public static final String MP_OUT_SMS = "MP_10000302";
//发送消息给外部用户-邮件
public static final String MP_OUT_EMAIL = "MP_10000303";
//发送消息给外部用户-短信和邮件
public static final String MP_OUT_SMS_AND_EMAIL = "MP_10000304";
//发送消息给内部用户-短信
public static final String MP_INNER_SMS = "MP_10000305";
//发送消息给内部用户-邮件
public static final String MP_INNER_EMAIL = "MP_10000306";
//发送消息给内部用户-应用消息
public static final String MP_INNER_COMPUTER_APP = "MP_10000307";
//发送消息给内部用户-app推送
public static final String MP_INNER_MOBILE_APP = "MP_10000308";
//发送消息给内部用户-短信和邮件
public static final String MP_INNER_SMS_AND_EMAIL = "MP_10000305";
//发送消息给内部用户-应用消息和app推送
public static final String MP_INNER_COMPUTER_AND_MOBILE_APP = "MP_10000307";
//发送消息给内部用户-短信、邮件、应用消息和app推送
public static final String MP_INNER_ALL = "MP_10000311";
4. 业务消息模板
- 短信模板
自定义的短信模板需要人工到阿里云申请,因此从模板库引入一个系统内置的短信模板
- 邮件模板
- 应用消息模板
- app推送模板
系统发送消息给外部用户
1. 消息配置下只添加了推送方式为短信的模板
@ApiOperation("发送消息给外部用户-短信")
@PostMapping("/sendOutSms")
public Reply sendOutSms(){
Map<String, String> map = new HashMap<>();
//短信模板使用了{sms_code}占位符,value由业务系统生成
map.put("sms_code", "02468");
OuterUserBody outerUserBody = new OuterUserBody();
//接收人手机号
outerUserBody.setReceiveMobiles(new String[]{"17715810635"});
//来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
outerUserBody.setBusinessSystemId("cn.flyrise.yyh.park");
//企业id,可以为空,为空时使用开发者配置的模板
outerUserBody.setEnterpriseId("entId");
//运营企业运营的园区id 园区id可以为空,为空时使用企业配置的模板
//若企业id也为空,使用开发者配置的模板
outerUserBody.setParkId("parkId");
//需要延时发送时,设置延时发送时间
//outerUserBody.setDelayedSendTime(DateUtils.parseDate("2020-08-15 16:35:00"));
//设置模版参数,替换模板中的占位符
outerUserBody.setParam(map);
//新建模板时得到的消息编号
outerUserBody.setCategoryCode(MP_OUT_SMS);
//调用发送方法
Reply reply = mcTemplateService.sendOuterUser(outerUserBody);
return reply;
}
2. 消息配置下只添加了推送方式为邮件的模板
@ApiOperation("发送消息给外部用户-邮件")
@PostMapping("/sendOutEmail")
public Reply sendOutEmail(){
Map<String, String> map = new HashMap<>();
//邮件模板使用了{title},{content}占位符,map中需要赋值
map.put("title", "测试邮件");
map.put("content", "这是一个测试邮件的内容");
OuterUserBody outerUserBody = new OuterUserBody();
//接收人手机号
outerUserBody.setReceiveMails(new String[]{"457857183@qq.com"});
//来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
outerUserBody.setBusinessSystemId("cn.flyrise.yyh.park");
//企业id,可以为空,为空时使用开发者配置的模板
outerUserBody.setEnterpriseId("entId");
//运营企业运营的园区id 园区id可以为空,为空时使用企业配置的模板
//若企业id也为空,使用开发者配置的模板
outerUserBody.setParkId("parkId");
//需要延时发送时,设置延时发送时间
//outerUserBody.setDelayedSendTime(DateUtils.parseDate("2020-08-15 16:35:00"));
//设置模版参数,替换模板中的占位符
outerUserBody.setParam(map);
//新建模板时得到的消息编号
outerUserBody.setCategoryCode(MP_OUT_EMAIL);
//调用发送方法
Reply reply = mcTemplateService.sendOuterUser(outerUserBody);
return reply;
}
3. 消息配置下添加了推送方式为短信和邮件的模板
@ApiOperation("发送消息给外部用户-短信和邮件")
@PostMapping("/sendOutSmsAndEmail")
public Reply sendOutSmsAndEmail(){
Map<String, String> map = new HashMap<>();
//短信模版使用了{sms_code}占位符,value是业务系统生成,map中需要赋值
map.put("sms_code", "02468");
//邮件模板使用了{title},{content}占位符,map中需要赋值
map.put("title", "测试邮件");
map.put("content", "这是一个测试邮件的内容");
OuterUserBody outerUserBody = new OuterUserBody();
//接收人手机号
outerUserBody.setReceiveMobiles(new String[]{"17715810635"});
//接收人邮箱地址
outerUserBody.setReceiveMails(new String[]{"457857183@qq.com"});
//来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
outerUserBody.setBusinessSystemId("cn.flyrise.yyh.park");
//企业id,可以为空,为空时使用开发者配置的模板
outerUserBody.setEnterpriseId("entId");
//运营企业运营的园区id 园区id可以为空,为空时使用企业配置的模板
//若企业id也为空,使用开发者配置的模板
outerUserBody.setParkId("parkId");
//需要延时发送时,设置延时发送时间
//outerUserBody.setDelayedSendTime(DateUtils.parseDate("2020-08-15 16:35:00"));
//设置模版参数,替换模板中的占位符
outerUserBody.setParam(map);
//新建模板时得到的消息编号
outerUserBody.setCategoryCode(MP_OUT_SMS_AND_EMAIL);
//调用发送方法
Reply reply = mcTemplateService.sendOuterUser(outerUserBody);
return reply;
}
通过用户id发送消息给内部用户
1. 消息配置下只添加了推送方式为短信的模板
与发送短信给外部用户一样,使用了{sms_code},map中需要赋值
@ApiOperation("发送消息给内部用户-短信")
@PostMapping("/sendInnerSms")
public Reply sendInnerSms(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_SMS)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("user")
.receiveUserIds(new String[]{"1460189858932723712"})
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("sms_code", "02468")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
2. 消息配置下只添加了推送方式为邮件的模板
与发送邮件给外部用户一样,使用了{title},{content},map中需要赋值
@ApiOperation("发送消息给内部用户-邮件")
@PostMapping("/sendInnerEmail")
public Reply sendInnerEmail(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_EMAIL)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("title", "测试邮件")
.param("content", "这是一个测试邮件的内容")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
3. 消息配置下只添加了推送方式为应用消息的模板
pc端需要与消息中心建立websocket连接才能接收到消息,以下代码在浏览器中打开,点击连接按钮,即可建立连接。其中userId修改为接收人的id,后端发送消息,就会在页面显示出来
应用消息的模板使用了{title},{content},map中需要赋值
@ApiOperation("发送消息给内部用户-应用消息")
@PostMapping("/sendInnerComputerApp")
public Reply sendInnerComputerApp(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_COMPUTER_APP)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.pageWebId("test")
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("title", "测试应用消息")
.param("content", "这是一个测试应用消息的内容")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
4. 消息配置下只添加了推送方式为app推送的模板
app推送的模板使用了{title},{content},map中需要赋值
@ApiOperation("发送消息给内部用户-app推送")
@PostMapping("/sendInnerMobileApp")
public Reply sendInnerMobileApp(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_MOBILE_APP)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.pageAppId("test")
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("title", "app推送消息")
.param("content", "这是一个app推送消息的内容")
.build();
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
5. 消息配置下添加了推送方式为短信和邮件的模板
@ApiOperation("发送消息给内部用户-短信和邮件")
@PostMapping("/sendInnerSmsAndEmail")
public Reply sendInnerSmsAndEmail(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_SMS_AND_EMAIL)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("sms_code", "02468")
.param("title", "短信和邮件")
.param("content", "这是一个短信和邮件的内容")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
6. 消息配置下添加了推送方式为应用消息和app推送的模板
@ApiOperation("发送消息给内部用户-应用消息和app推送")
@PostMapping("/sendInnerComputerAndMobileApp")
public Reply sendInnerComputerAndMobileApp(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_COMPUTER_AND_MOBILE_APP)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.pageAppId("test")
.pageWebId("test")
.pageH5Id("test")
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("title", "应用消息和app推送消息")
.param("content", "这是一个应用消息和app推送消息的内容")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
7. 消息配置下添加了短信、邮件、应用消息和app推送4种方式的模板
@ApiOperation("发送消息给内部用户-短信、邮件、应用消息和app推送")
@PostMapping("/sendInnerAll")
public Reply sendInnerAll(){
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_ALL)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.pageAppId("test")
.pageWebId("test")
.pageH5Id("test")
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("sms_code", "02468")
.param("title", "短信、邮件、应用消息和app推送")
.param("content", "这是一个短信、邮件、应用消息和app推送的内容")
.build();
//调用发送方法
Reply reply = mcTemplateService.sendInnerUser(innerUser);
return reply;
}
通过组织id发送消息给内部用户
通过组织id发送消息给内部用户,只需要将
//设置接收人
innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});
替换为
//设置接收组织
innerUser.setReceiveOrgIds(new String[]{"1308335669181026304"});
也可同时保留接收人、和接收组织,发送时先找到接收人,再找到接收组织下所有人,去重之后发送消息
四、版本调整
配置页面调整
从1.1.0版本开始,我们将采用配置页面标识字段和业务标识字段来实现消息跳转。
参考地址:消息调整对接
1. 如果涉及消息页面跳转,则必须要配置页面标识即页面管理中的页面标识(开发者后台->应用套件->页面管理)
- pageWebId用于PC端消息跳转
- pageAppId用于小程序消息跳转
- pageH5Id用于小程序消息H5页面跳转
2. 业务标识字段则根据业务需求自行决定,可填可不填。
- actionCode用于页面根据不同的业务消息作出不同的显示或操作比如说:流程的待办消息、已办消息,它所对应的业务标识就是todo、done
HashMap<String, String> map = new HashMap<>(7);
// 设置业务标识
map.put("actionCode", actionCode);
//设置页面标识
map.put("pageAppId", properties.getPageAppId());
map.put("pageWebId", properties.getPageWebId());
map.put("pageH5Id", properties.getPageH5Id());
//消息实体类
innerUserBody.setParam(map);
innerUser对象调整
参数说明:
- businessSystemId :填写套件的标识
- categoryCode :模版编号
- priority :紧急程度 PriorityEnum
- sendUserName :发送人的名称
- sendUserOrgId :发送人的组织
- receiveUserType : ”user“ “staff”,关系到ReceiveUser 接收人的id
- receiveUserIds :接受人的id
- pageAppId :app的页面id
- pageH5Id :h5的页面id
- pageWebId:pc的页面id
- imageUrl :富文本的可以通过传递图片url来覆盖模版的图片
- param :模版中的参数内容 {title}
事例:
InnerUserBody innerUser = InnerUserBody.builder()
.businessSystemId("cn.flyrise.yyh.park")
.categoryCode(MP_INNER_ALL)
.parkId("parkId")
.enterpriseId("entId")
.sendUserId("1460189858932723712")
.priority(PriorityEnum.EXTRA_URGENT)
.sendUserName("yuyh")
.sendUserOrgId("1433623657082400768")
.sendUserOrgName("常规应用组")
.receiveUserType("staff")
.receiveUserIds(new String[]{"1504812619359326208"})
.pageAppId("test")
.pageWebId("test")
.pageH5Id("test")
.imageUrl("https://avatars.githubusercontent.com/u/317776?s=200&v=4")
.param("sms_code", "02468")
.param("title", "短信、邮件、应用消息和app推送")
.param("content", "这是一个短信、邮件、应用消息和app推送的内容")
.build();
五、短信模板审核
等待运营人员审核模板成功后,方可使用短信模板发送
六、发送结果订阅
需要通过套件去订阅mc_result 主题,并且businessSystemId 填写套件的标识,其他配置参考消息订阅能力
目前mc_result主题已经关闭,有需求使用时请联系中台负责人员
1. 开启套件订阅服务
2. 引入依赖pom.xml
<!-- 消息订阅依赖包 -->
<dependency>
<groupId>cn.flyrise</groupId>
<artifactId>pai-common-mq</artifactId>
<version>1.6.0</version>
</dependency>
3. 开启mq配置
pai:
resource:
appId: '1506162495875088385'
appSecret: 'pswxrslh9hjgyy83llswp0juth27crcr'
mq:
enable: true
4. 代码实现
/**
* 订阅套件标识为"cn.flyrise.yyh.park"的套件(消息中心的套件),
* 发布的主题"mc_result"(消息发送结果对应的主题)
*/
@PaiMqListener(suiteCode = "cn.flyrise.yyh.park",topic = "mc_result")
public void consumerMcResult(String msg){
JSONObject jsonObject = JSON.parseObject(msg);
//发送消息时,消息中心返回的id
String msgId = jsonObject.getString("msgId");
//消息的发送结果:全部成功、部分成功、全部失败,根据结果做出相应的处理
String result = jsonObject.getString("result");
System.out.println("MessageTestConsumer Listener:" + result);
}