小程序订阅消息与消息触达体系

系统讲解微信小程序订阅消息与消息触达体系:一次性与长期订阅的权限机制、模板消息演进到订阅消息、订阅授权时机设计、发送频率控制、服务通知合规要求,以及结合订单、物流、活动等场景搭建完整触达链路。

小程序是典型的「用完即走」应用:用户低频打开、容易遗忘,而微信又不允许小程序像 App 一样随意推送。**订阅消息(Subscribe Message)**正是微信给小程序提供的一条受控触达通道——只有用户主动授权订阅,小程序才能在服务通知里发送模板消息。这一机制在保护用户不被骚扰的同时,也是小程序做留存、复购和召回最关键的运营抓手。本文系统梳理订阅消息的权限模型、发送链路与合规边界。

一、触达体系全景:为什么小程序只有订阅消息

1.1 小程序触达方式对比

触达方式触发条件能力局限
订阅消息用户逐次授权服务通知栏触达,长期保留每次订阅只能推送一次
客服消息用户 48h 内与客服互动小程序内会话依赖用户主动开口
模板消息(旧)用户在小程序内触发一次性推送已被订阅消息取代
公众号模板关注公众号群发/模板需公众号关联
短信/电话用户留手机号强触达成本高、合规严

订阅消息是唯一不需要用户当前在线的触达通道,消息进入微信「服务通知」列表,用户随时可见,召回价值最高。

1.2 从模板消息到订阅消息的演进

2019 年微信下线了旧的模板消息(用户操作一次即可长期推送),改为订阅消息:

旧模板消息:用户在小程序里点一次 → 小程序可在任意时间无限推送
新订阅消息:用户每订阅一次 → 小程序最多推送一条(一次性订阅)

这一转变的核心考量是控制骚扰:把「推送权」从开发者手里交还到用户手里,每次触达都需要一次显式授权。对开发者而言,这意味着订阅时机与消息内容设计变得极其重要。

二、订阅消息的两种类型

2.1 一次性订阅

用户每授权一次,小程序获得一次推送机会,用完后需要再次引导订阅:

// 服务端发送订阅消息(send 后消耗一次授权)
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send
{
  "touser": "OPENID",
  "template_id": "TEMPLATE_ID",
  "page": "pages/order/detail?orderId=123",
  "data": {
    "order_no": { "value": "20260928001" },
    "status": { "value": "已发货" },
    "express_company": { "value": "顺丰速运" },
    "express_no": { "value": "SF1234567890" }
  }
}

适用于「一次性结果通知」:支付成功、发货提醒、审核结果、开奖通知等——每个需要通知的关键节点单独引导订阅一次。

2.2 长期订阅

2022 年微信开放了长期订阅,一次授权可在长期内多次推送,但仅对特定类目开放:

类目长期订阅开放情况
医疗问诊结果、复诊提醒等可长期订阅
政务民生办事进度、缴费提醒
教育课程表、作业提醒
金融账单提醒、还款通知
其他泛类目通常仅支持一次性订阅

判断标准:长期订阅面向「天然需要重复触达的高频场景」,比如每天/每周必须提醒用户一次。多数电商、内容类小程序只能用一次性订阅组合出类似效果。

三、订阅授权时机的设计

3.1 错误示范:一进来就让用户订阅

用户还没感知价值就弹订阅授权,转化率通常极低(< 5%),且多次弹出会被微信风控限流。正确做法是在价值即将兑现的瞬间引导订阅:

3.2 正确的订阅时机矩阵

场景订阅时机话术设计
订单支付支付成功页「下单后我们会提醒你发货与物流」
物流更新下单流程中「发货后第一时间通知你」
优惠活动领券后「活动开抢前提醒你」
内容更新收藏/关注后「你收藏的专题更新时通知你」
// 在小程序端引导订阅(onShareAppMessage 同级的授权 API)
Page({
  async onOrderPaid() {
    // 支付成功瞬间,用户刚完成行为,订阅意愿最强
    const res = await wx.requestSubscribeMessage({
      tmplIds: ['TEMPLATE_1', 'TEMPLATE_2']
    });
    // 返回 res['TEMPLATE_1'] === 'accept' 表示授权成功
    if (res['TEMPLATE_1'] === 'accept') {
      wx.showToast({ title: '已订阅发货提醒' });
    }
  }
});

3.3 订阅次数的运营积累

一次性订阅是「存量递减」的资源,运营需要持续补量:

  • 下单后:支付成功页常驻「订阅提醒」按钮
  • 取关挽回:用户取关/沉默时,用利益点换一次订阅
  • 活动蓄水:大促前引导订阅「开售提醒」,活动当天统一触达

四、服务端发送链路

4.1 完整调用链路

小程序端订阅授权
      ↓ 授权结果(accept)
服务端存储授权记录(openid + template_id + 剩余次数)
      ↓ 业务事件触发(发货/活动/审核)
服务端调用 subscribe/send 接口
      ↓ access_token 鉴权
微信推送至用户服务通知

4.2 access_token 与重试

// Node.js 服务端:订阅消息发送封装
const axios = require('axios');

class SubscribeMessage {
  constructor(appid, secret) {
    this.appid = appid;
    this.secret = secret;
    this.tokenCache = null;
  }

  async getAccessToken(forceRefresh = false) {
    // access_token 有效期 7200s,需缓存避免频繁刷新
    if (this.tokenCache && !forceRefresh && Date.now() < this.tokenCache.expireAt) {
      return this.tokenCache.value;
    }
    const { data } = await axios.get(
      `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${this.appid}&secret=${this.secret}`
    );
    this.tokenCache = {
      value: data.access_token,
      expireAt: Date.now() + (data.expires_in - 300) * 1000  // 提前 5 分钟刷新
    };
    return data.access_token;
  }

  async send(openid, templateId, data, page) {
    const token = await this.getAccessToken();
    const { data: resp } = await axios.post(
      `https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${token}`,
      { touser: openid, template_id: templateId, data, page }
    );
    // errcode 0 成功;43101 表示该用户订阅次数已用完
    if (resp.errcode === 43101) {
      // 次数耗尽:记日志、触发补订阅引导
      await this.notifyNeedResubscribe(openid);
    }
    return resp;
  }
}

4.3 消息不可达的处理

错误码含义处理策略
43101用户订阅次数已用完记录 + 下次引导补订阅
43102模板未配置或下架检查模板管理后台
47003参数格式错误校验 data 字段与模板一致
40037模板 ID 无效更换模板 ID
45009接口调用超限熔断 + 降级

五、消息内容与模板设计

5.1 模板字段与 data 映射

订阅消息的 data 字段必须与模板定义完全一致(字段 key 与最大长度):

{
  "thing1": { "value": "您的包裹已发货" },   // 字符型,最长 20 字
  "character_string2": { "value": "SF123456" }, // 数字/字母组合
  "time3": { "value": "2026-09-28 15:00" }    // 时间型
}

注意:不同模板字段类型(thing/character_string/time/number/amount/phone 等)有各自的长度与格式限制,发送前用「模板字段示例」校验,避免 47003。

5.2 消息文案的最佳实践

  • 一条消息一个动作:每则服务通知只承载一个明确的下一步(「点击查看物流」)
  • 标题即信息:用户只扫标题,把最关键信息放 title 里
  • 页面直达:page 字段指向可执行动作的具体页面,而非首页
  • 克制频率:即使授权充足,每周触达不超过 2-3 次,避免用户主动关闭订阅

六、合规与用户体验红线

6.1 微信平台规范

  • 严禁诱导订阅:不得用积分、红包强制交换订阅授权
  • 严禁混淆授权:订阅话术必须与实际推送内容一致,不可「订阅了 A 却推送 B」
  • 模板审核:模板内容需符合类目规范,医疗/金融等敏感类目要求更高
  • 投诉治理:订阅消息被多次投诉会触发模板封禁与能力降级

6.2 隐私与《个人信息保护法》

订阅消息属于向用户推送服务信息,涉及用户 openid 的收集使用,需在隐私政策中说明:

  • 用户授权记录(openid + 订阅模板 + 时间)需最小化存储
  • 提供取消订阅/退订入口(小程序设置页或消息内操作)
  • 不将订阅数据用于画像、跨平台共享

七、总结

订阅消息是小程序生态里唯一稳定、合规、可长期沉淀的触达通道。授权时机决定触达量,内容设计决定打开率,合规边界决定可持续性。成熟的运营体系会把订阅当成「资源账户」来经营:在每个价值兑现瞬间引导订阅、按业务事件精准触发、用低频高质量的消息维护用户的信任。配合小程序数据分析、用户登录鉴权与支付闭环,订阅消息能把「用完即走」的用户逐步沉淀为可召回、可复购的私域资产。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「miniprogram」更多文章

  1. 小程序数据统计与用户分析
  2. 小程序实时音视频与直播能力
  3. 小程序开放生态与插件体系