- 简介
- 消息模板配置
- 操作示例
- 1. 进入开发者后台 -> 套件 -> 消息服务 -> 添加消息
- 2. 先添加消息配置,再添加消息模板
- 3. 可添加多种推送方式消息的模板,每种推送方式只能有一条。包含几种推送方式,则发送时会以这种方式发送。例如上图包含应用消息和app推送,消息发送时会同时发送到pc端和app端。
- 4. 得到消息编号
- 5.查询自己套件的套件标识
- 套件后端工程处理
- 操作示例
- 1. 引入依赖pom.xml
- 2. 定义常量
- 发送不同渠道消息
- 系统发送消息给外部用户
- 消息配置下只添加了推送方式为短信的模板
- 消息配置下只添加了推送方式为邮件的模板
- 消息配置下添加了推送方式为短信和邮件的模板
- 通过用户id发送消息给内部用户
- 消息配置下只添加了推送方式为短信的模板
- 消息配置下只添加了推送方式为邮件的模板
- 消息配置下只添加了推送方式为应用消息的模板
- 消息配置下只添加了推送方式为app推送的模板
- 消息配置下添加了推送方式为短信和邮件的模板
- 消息配置下添加了推送方式为应用消息和app推送的模板
- 消息配置下添加了推送方式为短信、邮件、应用消息和app推送的模板
- 通过组织id发送消息给内部用户
- 短信模板审核
- 发送结果订阅
简介
消息中心承担应用系统与消息终端之间的桥接工作,有以下能力:
- 提供统一的消息接口服务给应用系统,接受应用系统发送过来的消息;
- 按照设定的规则将消息分发给消息终端;
- 将用户通过消息终端反馈的信息推送给应用系统或者其他消息终端
消息中心使用统一格式标准接收消息数据,集中分发各类消息到各类设备和即时消息系统,起到消息总线的作用,解决应用系统直接与各类设备或即时消息系统通讯带来的复杂性。
消息模板配置
操作示例
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”