小程序订阅消息
完整流程图
其中黄色为需要客户研发部分
第一、客户研发部分
小程序订阅消息功能的对接有以下一些特殊性:
由于该功能在第三方平台权限集是互斥权限集,所以不能以第三方平台授权方式研发,需要请客户对接微信小程序(下文简称小程序)的access_token(下文简称token)再中转给我方:
- 客户需要研发获取小程序token的接口,获取小程序token并保存后,我方或其他供应商再调用该接口获取token。这样即保障了token安全,也避免了多个供应商各自直接请求微信API造成的token失效。
- 回调的处理有两种方式,方式1是由客户对接小程序订阅消息事件推送,将我方需要的消息内容转发到指定地址;方式2是我方直接对接小程序订阅消息事件推送。
- 客户需要在小程序中开发用户订阅弹窗。
数据流转图:
1、调用和存储access_token:
接口https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
2、提供第三方获取access_token的API,我方请求规范如下:
请求方式:GET
请求参数:小程序appId
期望的返回值结果
{"access_token": "加密后的token", "expires_in": 8809000}
expires_in为token过期的毫秒数
token传输需要加密,秘钥16个字节由客户自定义,加密解密代码如下:
String originalString = "Hello, this is a secret message!";
String preSharedKey = "1yo0VURmWmDLzCDG"; // 自定义密钥
byte[] keyBytes = preSharedKey.getBytes();
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES");
// 加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(originalString.getBytes());
String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString));
String decryptedString = new String(decryptedBytes);
System.out.println("Original: " + originalString);
System.out.println("Encrypted: " + encryptedString);
System.out.println("Decrypted: " + decryptedString);
3、订阅消息事件回调转发:
a、方式1对接,客户对接小程序订阅消息,验签后将消息内容转推给我方
接口:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
验签后将相关推送(用户唤起弹窗、拒收、订阅结果)直接以XML格式明文推送给我方。
推送方式:POST
消息加解密方式:明文模式
消息格式:XML模式
内容示例:
String xml = """
<xml>
<ToUserName><![CDATA[gh_5959dce401ac]]></ToUserName>
<FromUserName><![CDATA[owvDD5f7Iuk6no0nQINCRY8DrT9Q]]></FromUserName>
<CreateTime>1695785001</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe_msg_sent_event]]></Event>
<SubscribeMsgSentEvent>
<List>
<TemplateId><![CDATA[JVrpeYFBIkONm78dzmus7S_i4smycTQx_pq_zip8m-Q]]></TemplateId>
<MsgID>3123795658135683075</MsgID>
<ErrorCode>0</ErrorCode>
<ErrorStatus><![CDATA[success]]></ErrorStatus>
</List>
</SubscribeMsgSentEvent>
</xml>
""";
b、方式2对接不需要客户研发。
4、在小程序中研发订阅消息窗口唤起
在小程序内,通过某个菜单或用户行为,触发调用wx.requestSubscribeMessage(Object object)调起客户端小程序订阅消息界面。
第二、配置部分
系统配置图:
一、订阅消息对接准备——配置token
1、绑定小程序到我方系统
使用小程序订阅消息功能,首先需要绑定小程序到我方系统。
2、在小程序详情页,点击小程序账号配置页,
填写小程序access_token调用地址和加密秘钥。加密秘钥由每个客户自己生成。
这里如果token获取有问题,后文发送步骤中订阅消息模板会获取不到。
二、回调配置
1、第三方系统回调配置(即方式1)
拷贝我方提供的回调地址并填入客户服务器即可。
2、微信回调配置(即方式2)
打开小程序账号配置页
打开微信小小程序后台开发管理-开发设置-消息推送
选择加密方式为安全模式,数据格式为XML;
拷贝我方回调地址填入微信后台;
在微信后台填写令牌,和生成秘钥,再填回我方页面。
三、小程序后台配置订阅消息
客户进入小程序后台,选用需要的订阅消息。
第三部分:发送订阅消息
一、客户旅程发送订阅消息
1、客户旅程小程序触发器增加“调起订阅消息界面”事件,配合事件判断器,可对同意接受订阅消息的用户做营销。
2、客户旅程中,增加“发送订阅消息”执行动作
这里可选择消息模板、配置字段映射、设置需要跳转的小程序页面、并可预览
预览需填写用户在小程序的openid,该openid的获取,需要预先设立动态组,用动态组侦听调起订阅消息事件,根据订阅时间找到对应的人,再查人的小程序身份openid。
二、群发小程序订阅消息
小程序详情中,点击群发订阅消息豆腐块
进入群发列表
新建订阅消息和旅程中不同的是,可以选择全部订阅用户,或具体群组。
第四部分:消息侦听和事件记录
用户在手机端订阅后,我方获得回调,记录“调起订阅消息界面”事件;
MA中发送订阅消息后,记录“发送订阅消息”事件;
群发订阅消息不记录事件;
用户接收订阅消息后,记录“接收订阅消息”事件。
“调起订阅消息界面”事件只记模板ID,不记模板名称,因为对接时客户往往没对接token就推该事件,导致我方模板名称拿不到也不方便补,所以需要客户用维度表或字典表处理模板ID转义。
发送和接收订阅消息由于客户一定是在我系统发送,所以都会记模板名称。