小程序是典型的「用完即走」应用:用户低频打开、容易遗忘,而微信又不允许小程序像 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 + 订阅模板 + 时间)需最小化存储
- 提供取消订阅/退订入口(小程序设置页或消息内操作)
- 不将订阅数据用于画像、跨平台共享
七、总结
订阅消息是小程序生态里唯一稳定、合规、可长期沉淀的触达通道。授权时机决定触达量,内容设计决定打开率,合规边界决定可持续性。成熟的运营体系会把订阅当成「资源账户」来经营:在每个价值兑现瞬间引导订阅、按业务事件精准触发、用低频高质量的消息维护用户的信任。配合小程序数据分析、用户登录鉴权与支付闭环,订阅消息能把「用完即走」的用户逐步沉淀为可召回、可复购的私域资产。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。