小程序订阅消息

小程序的订阅通知,可以极大提升用户的使用体验感,消息能力是小程序能力中的重要组成。

小程序的订阅通知权限申请会以卡片的形式从底部弹出,用户点击订阅消息按钮之后,微信会向开发者服务器推送消息。

消息类型

1. 一次性订阅消息

一次性订阅,相当于用户给使用的小程序门票,用户每约定一次,开发者就会有一次向用户发送消息的机会,开发者不可无限制的i向用户发送消息,每条消息可单独订阅或退订。

2. 长期订阅消息

一次性订阅消息可满足小程序的大部分服务场景需求,用户订阅一次后,开发者可长期下发多条消息。

目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

使用说明

1.获取模板id

在微信公众平台手动配置获取模板 ID:

登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。

 

2.获取下发权限

一次性订阅消息、长期订阅消息,详见接口 wx.requestSubscribeMessage

设备订阅消息,详见接口 wx.requestSubscribeDeviceMessage

3.调用接口下发订阅消息

一次性订阅消息、长期订阅消息,详见服务端接口 subscribeMessage.send,次数限制:开通支付能力的小程序下发上限是3kw/日,没开通的是1kw/日。

注意事项

  • 用户勾选 “总是保持以上选择,不再询问” 之后,下次订阅调用 wx.requestSubscribeMessage 不会弹窗,保持之前的选择,修改选择需要打开小程序设置进行修改。

订阅消息事件推送

1、当用户触发订阅消息弹框后,用户的相关行为事件结果会推送至开发者所配置的服务器地址或微信云托管服务。

XML格式示例

<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969440</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_popup_event]]></Event>
    <SubscribeMsgPopupEvent>
        <List>
            <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <SubscribeStatusString><![CDATA[accept]]></SubscribeStatusString>
            <PopupScene>2</PopupScene>
        </List>
        <List>
            <TemplateId><![CDATA[9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI]]></TemplateId>
            <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
            <PopupScene>2</PopupScene>
        </List>
    </SubscribeMsgPopupEvent>
</xml>

JSON 格式示例

{
  "ToUserName": "gh_123456789abc",
  "FromUserName": "o7esq5OI1Uej6Xixw1lA2H7XDVbc",
  "CreateTime": "1620973045",
  "MsgType": "event",
  "Event": "subscribe_msg_popup_event",
  "List": [   {
        "TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
        "SubscribeStatusString": "accept",
        "PopupScene": "0"
    }],
 }

若 "List" 只有一个对象,则只返回对象本身;若 "List" 多于一个对象,则返回一个包含所有对象的数组。

参数说明

参数说明
ToUserName小程序帐号ID
FromUserName用户openid
CreateTime时间戳
TemplateId模板id(一次订阅可能有多个id)
SubscribeStatusString订阅结果(accept接收;reject拒收)
PopupScene弹框场景,0代表在小程序页面内,小程序外为空
MsgType消息类型
Event事件类型

参数处理

xml转map工具类

public static Map<String, String> xmlToMap(String xml) throws Exception {
    Map<String, String> map = new HashMap<String, String>();
    Document document = DocumentHelper.parseText(xml);
    Element root = document.getRootElement();
    List<Element> elements = root.elements();
    for (Element element : elements) {
        map.put(element.getName(), element.getText());
    }
    return map;
}

因为推送的是时间戳格式,转换成"yyyy-MM-dd:HH-mm-ss"格式

long timestamp = Long.parseLong(subscribeTimeStamp);//将时间戳转换为long类型
Date date = new Date(timestamp * 1000);//将时间戳转换为Date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");//设置时间格式
String subscribeTime = sdf.format(date);//将时间戳转换为String类型

当用户在手机端服务通知里消息卡片右上角“...”管理消息时,相应的行为事件会推送至开发者所配置的服务器地址或微信云托管服务。(目前只推送取消订阅的事件,即对消息设置“拒收”)

XML 格式示例

<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969440</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_change_event]]></Event>
    <SubscribeMsgChangeEvent>
        <List>          <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
        </List>
    </SubscribeMsgChangeEvent>
</xml>

JSON 格式示例

{
      "ToUserName": "gh_123456789abc",
      "FromUserName": "o7esq5OI1Uej6Xixw1lA2H7XDVbc",
      "CreateTime": "1610968440",
      "MsgType": "event",
      "Event": "subscribe_msg_change_event",
      "List": [  {
                "TemplateId":"BEwX0BOT3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8",
                "SubscribeStatusString": "reject"
      }],
}

这里变换的只有SubscribeStatusString参数reject为拒收accept为接收

调用订阅消息接口发送消息给用户的最终结果,会推送下发结果事件至开发者所配置的服务器地址或微信云托管服务。

XML 格式示例

<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969468</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_sent_event]]></Event>
    <SubscribeMsgSentEvent>
        <List>       <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <MsgID>1700827132819554304</MsgID>
            <ErrorCode>0</ErrorCode>
            <ErrorStatus><![CDATA[success]]></ErrorStatus>
        </List>
    </SubscribeMsgSentEvent>
</xml>

JSON 格式示例

{
    "ToUserName": "gh_123456789abc",
    "FromUserName": "o7esq5PHRGBQYmeNyfG064wEFVpQ",
    "CreateTime": "1620963428",
    "MsgType": "event",
    "Event": "subscribe_msg_sent_event",
    "List": {
        "TemplateId": "BEwX0BO-T3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8",
        "MsgID": "1864323726461255680",
        "ErrorCode": "0",
        "ErrorStatus": "success"
      }
      
}

"ErrorCode": "0" 表示成功

<think> 我们已经有了关于微信小程序订阅消息的详细开发指南,用户现在想了解使用方法、开发指南及注意事项。根据引用内容,我们可以整合如下: ### 使用方法 1. **配置消息模板**:在微信小程序后台的“订阅消息”中选择公共模板或申请自定义模板,获取模板ID(templateId)[^1]。 2. **前端订阅请求**:使用`wx.requestSubscribeMessage`API触发用户授权弹窗,传入需要订阅的模板ID数组。用户同意后,开发者可在7天内发送一条消息[^1][^3]。 ```javascript wx.requestSubscribeMessage({ tmplIds: ['模板ID1', '模板ID2'], // 最多3个 success(res) { // res格式:{'模板ID1': 'accept', '模板ID2': 'reject'} } }) ``` 3. **服务端发送消息**:通过HTTPS请求调用微信接口,需携带服务端access_token、用户openid、模板ID及填充内容[^1]。 ```python # Python示例 import requests payload = { "touser": "OPENID", "template_id": "模板ID", "page": "页面路径", "data": { "参数1": {"value": "值1"}, "参数2": {"value": "值2"} } } requests.post(f"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=TOKEN", json=payload) ``` ### 开发指南 - **模板参数填充规则**: - 参数值不能包含引号、尖括号等特殊字符 - 金额类参数需为纯数字(如`"100"`而非`"¥100"`) - **设备订阅消息**:适用于智能硬件场景,使用`wx.requestSubscribeDeviceMessage`,绑定设备后可长期发送[^3]。 ```javascript wx.requestSubscribeDeviceMessage({ tmplIds: ['设备消息模板ID'] }) ``` ### 注意事项 1. **授权限制**: - 单次调用最多3个模板ID - 用户拒绝后需引导至小程序设置页手动开启 2. **发送限制**: - 普通订阅消息:每条授权仅可发送1次 - 设备订阅消息:长期有效(用户不退订) 3. **内容规范**: - 禁止诱导订阅、营销信息 - 参数值严格匹配模板定义的数据类型(如时间格式`yyyy-MM-dd`) ### 最佳实践 - **提升授权率**:在支付成功页等关键节点触发订阅,并前置说明消息价值[^1]。 - **错误处理**: - 发送失败时记录日志并重试(建议指数退避策略) - 监控用户订阅状态变化 --- §§相关问题§§ 1. 如何实现订阅消息的定时发送? 2. 用户退订后如何重新引导订阅? 3. 设备订阅消息如何关联硬件设备ID? 4. 服务端发送失败时如何重发消息? </think> ### 微信小程序订阅消息开发指南 #### 一、核心使用方法 1. **配置消息模板** - 在[小程序后台](https://mp.weixin.qq.com/)选择模板或自定义模板,获取唯一标识符 - 模板ID格式:`XXXXXX-XXXX`(如:`A1b2c3d4e5f6g7`) 2. **前端订阅授权** 使用`wx.requestSubscribeMessage`触发用户授权弹窗[^1][^3]: ```javascript wx.requestSubscribeMessage({ tmplIds: ['模板ID1', '模板ID2'], // 最多3个模板 success(res) { // 返回值示例:{ '模板ID1': 'accept', '模板ID2': 'reject' } if (res['模板ID1'] === 'accept') { console.log('用户接受模板1订阅'); } }, fail(err) { console.error('授权失败', err.errMsg); } }); ``` 3. **服务端消息发送** 通过HTTPS调用微信接口(需服务端access_token): ```python # Python示例 import requests url = f"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={ACCESS_TOKEN}" payload = { "touser": "用户OPENID", "template_id": "模板ID", "page": "pages/index/index", // 消息跳转页 "data": { // 模板参数填充 "thing1": {"value": "商品名称"}, "number2": {"value": "100"}, "time3": {"value": "2023-08-20 10:00"} } } response = requests.post(url, json=payload) ``` #### 二、开发指南要点 1. **模板参数规范** | 参数类型 | 示例值 | 非法示例 | |----------|-------------|--------------| | 数字 | `"value": "100"` | `"¥100元"` ❌ | | 时间 | `"2023-08-20"` | `"8月20日"` ❌ | | 文本 | 长度≤20字符 | 含特殊符号❌ | 2. **设备消息订阅**(智能硬件场景)[^3] ```javascript wx.requestSubscribeDeviceMessage({ tmplIds: ['设备模板ID'], success(res) { console.log('设备消息订阅结果', res) } }) ``` 3. **发送频率限制** - 普通订阅消息:每授权仅可发送**1条** - 设备订阅消息:长期有效(用户不退订) - 单用户单模板日上限:**3条** #### 三、关键注意事项 1. **授权策略** - 用户拒绝后需引导至设置页开启:`右上角··· → 设置 → 订阅消息` - 单次调用最多申请3个模板(超量会导致弹窗失败) 2. **内容安全规范** - 禁止诱导订阅(如“订阅领红包”) - 禁止发送营销信息(促销/广告) - 参数值需严格匹配模板定义的数据类型[^1] 3. **有效期规则** $$ \text{发送窗口} = \begin{cases} \text{用户接受后7天内} & \text{(普通订阅)} \\ \text{设备绑定期间持续有效} & \text{(设备订阅)} \end{cases} $$ #### 四、最佳实践建议 1. **提升授权率** - 在支付完成页等关键节点触发订阅 - 前置说明文案示例: > “订阅后及时接收订单发货通知” 2. **错误处理机制** ```python # 消息发送重试逻辑 retry_count = 0 while retry_count < 3: response = requests.post(url, json=payload) if response.json().get('errcode') == 0: break # 发送成功 elif response.json().get('errcode') == 43101: # 用户拒收 log_error("用户已退订") break else: time.sleep(2 ** retry_count) # 指数退避 retry_count += 1 ``` > ⚠️ 违规后果:诱导订阅或发送营销内容将导致**模板封禁**,严重者暂停消息能力[^1] ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值