简介

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

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

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

消息模板配置

操作示例

1. 进入开发者后台 -> 套件 -> 消息服务 -> 添加消息

地址:http://pai.flyrise.cn/developer/auth

2. 先添加消息配置,再添加消息模板

3. 可添加多种推送方式消息的模板,每种推送方式只能有一条。包含几种推送方式,则发送时会以这种方式发送。例如上图包含应用消息和app推送,消息发送时会同时发送到pc端和app端。

4. 得到消息编号

5.查询自己套件的套件标识

点击复制,发送消息时使用,例如:outerUserBody.setBusinessSystemId(“cn.flyrise.cy”);

套件后端工程处理

操作示例

1. 引入依赖pom.xml

<dependency>
    <groupId>cn.flyrise</groupId>
    <artifactId>pai-common-mc</artifactId>
    <version>1.1.0-SNAPSHOT</version>
</dependency>

2. 定义常量

    //新建模板时得到的消息编号
    public final static String CATEGORY_CODE = "MP_10000021";

发送不同渠道消息

系统发送消息给外部用户

目前支持发送短信和邮件给外部用户

消息配置下只添加了推送方式为短信的模板

在消息服务——>模板管理,自定义的短信模板需要人工到阿里云申请,因此从模板库引入一个系统内置的短信模板


系统模板不可修改,查看模板

上图模板使用了{sms_code},使用阿里云短信平台,参数必须一一对应,因此短信模板的占位符都以sms开头区分其他模板的占位符,map中需要赋值

    Map<String, String> map = new HashMap<>();
    //sms_code将替换消息体的{sms_code}占位符,value由业务系统生成
    map.put("sms_code", "02468");
    OuterUserBody outerUserBody = new OuterUserBody();
    //接收人手机号
    outerUserBody.setReceiveMobiles(new String[]{"18986931905"});
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    outerUserBody.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    outerUserBody.setParkId("parkId");
    /**需要延时发送时,设置延时发送时间
    outerUserBody.setDelayedSendTime(DateUtils.parseDate("2020-08-15 16:35:00"));*/
    //设置模版参数,替换模板中的占位符
    outerUserBody.setParam(map);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    outerUserBody.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendOuterUser(outerUserBody);

消息配置下只添加了推送方式为邮件的模板

在消息服务——>模板管理,添加一个自定义邮件模板,编辑模板如图:

上图模板使用了{userName},{address},map中需要赋值

     Map<String, String> map = new HashMap<>();
     map.put("userName", "张三");
     map.put("address","南方软件园");
     OuterUserBody outerUserBody = new OuterUserBody();
     //接收人邮箱地址
     outerUserBody.setReceiveMails(new String[]{"444535180@qq.com"});
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
     //企业id,可以为空,为空时使用开发者配置的模板
    outerUserBody.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    outerUserBody.setParkId("parkId");
     //设置模版参数,替换模板中的占位符
     outerUserBody.setParam(map);
     //常量CATEGORY_CODE,新建模板时得到的消息编号
     outerUserBody.setCategoryCode(CATEGORY_CODE);
     //调用发送方法
     Reply reply = mcTemplateService.sendOuterUser(outerUserBody);

消息配置下添加了推送方式为短信和邮件的模板

短信和邮件模板共使用了{sms_code},{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("sms_code", "02468");
    map.put("userName", "张三");
    map.put("address","南方软件园");
    OuterUserBody outerUserBody = new OuterUserBody();
    //接收人邮箱地址
    outerUserBody.setReceiveMails(new String[]{"444535180@qq.com"});
    //接收人电话号码
    outerUserBody.setReceiveMobiles(new String[]{"18986931905"});
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    outerUserBody.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    outerUserBody.setParkId("parkId");
    //设置模版参数,替换模板中的占位符
    outerUserBody.setParam(map);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    outerUserBody.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendOuterUser(outerUserBody);

通过用户id发送消息给内部用户

发送短信和邮件也可以使用外部用户的方式,直接根据手机号和邮件发送消息

消息配置下只添加了推送方式为短信的模板


与发送短信给外部用户一样,使用了{sms_code},map中需要赋值

    Map<String, String> map = new HashMap<>();
    //sms_code将替换消息体的{sms_code}占位符,value由业务系统生成
    map.put("sms_code", "02468");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300392152249012224"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

消息配置下只添加了推送方式为邮件的模板


与发送邮件给外部用户一样,使用了{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300392152249012224"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

消息配置下只添加了推送方式为应用消息的模板


应用消息的模板使用了{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //发送人id
    innerUser.setSendUserId("test");
    //发送人
    innerUser.setSendUserName("test");
    //发送人组织id
    innerUser.setSendUserOrgId("test");
    //发送人组织
    innerUser.setSendUserOrgName("test");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //设置pc端点击消息,需要跳转的路径
    innerUser.setWsUrl(WS_URL);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

pc端需要与消息中心建立websocket连接才能接收到消息,以下代码在浏览器中打开,点击连接按钮,即可建立连接。其中userId修改为接收人的id,后端发送消息,就会在页面显示出来

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="keywords" content="jQuery" />
<title>使用HTML5的WebSocket实现服务端和客户端数据通信</title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">

<style>
    #result{padding: 20px 0; color: #360; font-weight: bold; font-size: 16px}
</style>
</head>
<body>
<div class="container">
    <header>
    </header>
    <div class="row main" style="min-height: 450px">
        <div class="col-md-12">
            <h2 class="top_title"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span>使用HTML5的WebSocket实现服务端和客户端数据通信</h2>
            <div class="col-md-10 col-md-offset-3 col-sm-12" style="padding-top: 40px;">
             url:<input id="url" size="50" value="pai.flyrise.cn/mc-sender-api"><br/><br/>
            userId:<input id="userId" size="30" value="1284040916717408256">
            <button type="button" onclick="myFunction()">连接</button>
            <br/><br/>
                <div>消息:</div>
                <div id="result"></div>
            </div>
            <div style="clear: both"></div>
            <br/>
        </div>
    </div>
</div>
<script>
function myFunction() {
    var url, userId;
    url = document.getElementById("url").value;
    userId = document.getElementById("userId").value;
    var wsulr = "ws://"+url+"/message/websocket/"+userId;
    if ("WebSocket" in window) {
    console.log(wsulr);
    var ws = new WebSocket(wsulr);

    var result = document.querySelector('#result');

    ws.onopen = function() {
        result.innerHTML = '已连接上!';
        console.log('已连接上!');
        console.log(new Date());
    }

    ws.onmessage = function(e) {
        console.log(e.data);
        result.innerHTML = e.data;
    }
    ws.onclose = function(e) {
         console.log('websocket 断开: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
         result.innerHTML = '已断开!';
         console.log(new Date());
    }
} else {
    alert('您的浏览器不支持 WebSocket!');
}
}

</script>
</body>
</html>

消息配置下只添加了推送方式为app推送的模板


应用消息的模板使用了{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //发送人id
    innerUser.setSendUserId("test");
    //发送人
    innerUser.setSendUserName("test");
    //发送人组织id
    innerUser.setSendUserOrgId("test");
    //发送人组织
    innerUser.setSendUserOrgName("test");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //设置app端点击消息,需要跳转的路径
    innerUser.setJpushUrl(JPUSH_URL);
    //跳转的页面类型:app指原生页面,h5指H5页面,micro指小程序页面
    innerUser.setPageType("micro");
    //页面类型为小程序,需要设置小程序的ID
    innerUser.setMicroAppCode(MIRCO_APP_ID);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

消息配置下添加了推送方式为短信和邮件的模板

短信和邮件模板共使用了{sms_code},{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("sms_code", "02468");
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300392152249012224"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

消息配置下添加了推送方式为应用消息和app推送的模板

应用消息和app推送模板使用了{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //发送人id
    innerUser.setSendUserId("test");
    //发送人
    innerUser.setSendUserName("test");
    //发送人组织id
    innerUser.setSendUserOrgId("test");
    //发送人组织
    innerUser.setSendUserOrgName("test");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //设置pc端点击消息,需要跳转的路径
    innerUser.setWsUrl(WS_URL);
    //设置app端点击消息,需要跳转的路径
    innerUser.setJpushUrl(JPUSH_URL);
    //跳转的页面类型:app指原生页面,h5指H5页面,micro指小程序页面
    innerUser.setPageType("micro");
    //页面类型为小程序,需要设置小程序的ID
    innerUser.setMicroAppCode(MIRCO_APP_ID);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

消息配置下添加了推送方式为短信、邮件、应用消息和app推送的模板

短信、邮件、应用消息和app推送的模板共使用了{sms_code},{userName},{address},map中需要赋值

    Map<String, String> map = new HashMap<>();
    map.put("sms_code", "02468");
    map.put("userName", "张三");
    map.put("address", "南方软件园");
    InnerUserBody innerUser = new InnerUserBody();
    //来源业务系统套件标识,用于将消息发送结果发布到topic,为空时不发布结果
    outerUserBody.setBusinessSystemId("cn.flyrise.cy");
    //企业id,可以为空,为空时使用开发者配置的模板
    innerUser.setEnterpriseId("entId");
     /**
     * 运营企业运营的园区id
     * 园区id可以为空,为空时使用企业配置的模板
     * 若企业id也为空,使用开发者配置的模板
     */
    innerUser.setParkId("parkId");
    //接收人id
    innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});
    //接收人类别,员工staff、用户user
    innerUser.setReceiveUserType("user");
    //发送人id
    innerUser.setSendUserId("test");
    //发送人
    innerUser.setSendUserName("test");
    //发送人组织id
    innerUser.setSendUserOrgId("test");
    //发送人组织
    innerUser.setSendUserOrgName("test");
    //设置模版参数,替换模板中的占位符
    innerUser.setParam(map);
    //设置pc端点击消息,需要跳转的路径
    innerUser.setWsUrl(WS_URL);
    //设置app端点击消息,需要跳转的路径
    innerUser.setJpushUrl(JPUSH_URL);
    //跳转的页面类型:app指原生页面,h5指H5页面,micro指小程序页面
    innerUser.setPageType("micro");
    //页面类型为小程序,需要设置小程序的ID
    innerUser.setMicroAppCode(MIRCO_APP_ID);
    //常量CATEGORY_CODE,新建模板时得到的消息编号
    innerUser.setCategoryCode(CATEGORY_CODE);
    //调用发送方法
    Reply reply = mcTemplateService.sendInnerUser(innerUser);

通过组织id发送消息给内部用户

通过组织id发送消息给内部用户,只需要将

    //设置接收人
    innerUser.setReceiveUserIds(new String[]{"1300385167474561024"});

替换为

    //设置接收组织
    innerUser.setReceiveOrgIds(new String[]{"1308335669181026304"});

也可同时保留接收人、和接收组织,发送时先找到接收人,再找到接收组织下所有人,去重之后发送消息

短信模板审核

等待运营人员审核模板成功后,方可使用短信模板发送。

发送结果订阅

1.接入消息订阅能力消息订阅能力,主要看消费者的接入
2.消费者代码

@Service
public class PulsarConsumer {
    /*
    *订阅套件标识为"cn.flyrise.mc"的套件(消息中心的套件),发布的主题"mc_result"(消息发送结果对应的主题)
    */
    @PulsarListener(suiteKey = "cn.flyrise.mc",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("PulsarConsumer Listener:" + result);
    }

}

注意:在发送消息时需要提供businessSystemId(来源业务系统套件标识),这样消息中心才会讲结果发布到主题”mc_result”

文档更新时间: 2023-06-06 15:54   作者:姚连洲