小程序订阅消息

完整流程图

其中黄色为需要客户研发部分

第一、客户研发部分

小程序订阅消息功能的对接有以下一些特殊性:

由于该功能在第三方平台权限集是互斥权限集,所以不能以第三方平台授权方式研发,需要请客户对接微信小程序(下文简称小程序)的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)调起客户端小程序订阅消息界面。

intro

第二、配置部分

系统配置图:


一、订阅消息对接准备——配置token

1、绑定小程序到我方系统

使用小程序订阅消息功能,首先需要绑定小程序到我方系统。

2、在小程序详情页,点击小程序账号配置页,

填写小程序access_token调用地址和加密秘钥。加密秘钥由每个客户自己生成。

这里如果token获取有问题,后文发送步骤中订阅消息模板会获取不到。

二、回调配置

1、第三方系统回调配置(即方式1)

拷贝我方提供的回调地址并填入客户服务器即可。

2、微信回调配置(即方式2)

打开小程序账号配置页

打开微信小小程序后台开发管理-开发设置-消息推送

选择加密方式为安全模式,数据格式为XML;

拷贝我方回调地址填入微信后台;

在微信后台填写令牌,和生成秘钥,再填回我方页面。

三、小程序后台配置订阅消息

客户进入小程序后台,选用需要的订阅消息。

第三部分:发送订阅消息

一、客户旅程发送订阅消息

1、客户旅程小程序触发器增加“调起订阅消息界面”事件,配合事件判断器,可对同意接受订阅消息的用户做营销。

2、客户旅程中,增加“发送订阅消息”执行动作

这里可选择消息模板、配置字段映射、设置需要跳转的小程序页面、并可预览

预览需填写用户在小程序的openid,该openid的获取,需要预先设立动态组,用动态组侦听调起订阅消息事件,根据订阅时间找到对应的人,再查人的小程序身份openid。


二、群发小程序订阅消息

小程序详情中,点击群发订阅消息豆腐块

进入群发列表

新建订阅消息和旅程中不同的是,可以选择全部订阅用户,或具体群组。

第四部分:消息侦听和事件记录

用户在手机端订阅后,我方获得回调,记录“调起订阅消息界面”事件;

MA中发送订阅消息后,记录“发送订阅消息”事件;

群发订阅消息不记录事件;

用户接收订阅消息后,记录“接收订阅消息”事件。

“调起订阅消息界面”事件只记模板ID,不记模板名称,因为对接时客户往往没对接token就推该事件,导致我方模板名称拿不到也不方便补,所以需要客户用维度表或字典表处理模板ID转义。

发送和接收订阅消息由于客户一定是在我系统发送,所以都会记模板名称。