一、简介

消息中心承担应用系统与消息终端之间的桥接工作,有以下能力:

  • 提供统一的消息接口服务给应用系统,接受应用系统发送过来的消息;
  • 按照设定的规则将消息分发给消息终端;
  • 将用户通过消息终端反馈的信息推送给应用系统或者其他消息终端

消息中心使用统一格式标准接收消息数据,集中分发各类消息到各类设备和即时消息系统,起到消息总线的作用,解决应用系统直接与各类设备或即时消息系统通讯带来的复杂性。

二、消息模板配置

操作示例

1. 添加消息

  • 添加消息

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);
}
文档更新时间: 2023-02-28 11:39   作者:欧阳少海