订阅消息替代了旧模板消息
早期小程序用「模板消息」主动给用户推送,由于发送过于随意,后来被微信收紧。现在统一替换为「订阅消息」:用户必须先明确订阅一次,开发者才有一次(或持续的)下发资格。这一变化的核心是把「主动权」交还给用户,也要求开发者把推送用在真正有价值的服务节点上。
订阅消息不是营销工具,而是服务的延续——订单状态、审批结果、预约提醒,才是它的正确用法。
- 模板在公众平台「订阅消息」里选用公共模板或自建模板,拿到模板 id。
- 字段确认模板内每个字段的类型(名称、时间、数字等)与长度限制。
- 令牌后端能稳定换取
access_token,这是下发的前置。
一次性订阅与长期订阅的区别
一次性订阅是默认形态:用户点一次「允许」,你只能下发一条对应模板的消息,发完即失效,想再发需要用户再次订阅。长期订阅则面向政务、医疗、交通等特定类目,需要提交资质审核通过后才开放,通过后可在一定周期内多次下发。绝大多数普通电商、工具类小程序,能用好一次性订阅就已经足够。
产品设计上的关键判断是:把订阅授权「用在刀刃上」。不要在用户刚打开小程序就弹窗索要订阅,而应在他即将产生需要通知的行为(下单、预约、提交申请)时,顺势弹出「是否在结果出来时通知你」,此时同意率最高,也最符合场景。
前端授权与后端下发的完整链路
前端通过 wx.requestSubscribeMessage 唤起授权弹窗。用户同意后,前端拿到这次订阅资格,把需要通知的业务事件上报给后端;后端在条件满足时(例如订单发货)调用下发接口。下面这段用普通字符串拼接组装数据,避免在界面逻辑里使用大括号模板语法。
// 前端:在用户下单成功页唤起订阅授权
wx.requestSubscribeMessage({
tmplIds: ['TEMPLATE_ID_DELIVERY'],
success(res) {
if (res['TEMPLATE_ID_DELIVERY'] === 'accept') {
wx.request({ url: '/api/subscribe/grant', method: 'POST' });
}
}
});
// 后端(Node 示例):订单发货时下发服务通知
const payload = {
touser: openid,
template_id: 'TEMPLATE_ID_DELIVERY',
page: 'pages/order/detail?id=' + orderId,
data: {
thing1: { value: '包裹已发出' },
time2: { value: new Date().toLocaleString('zh-CN') }
}
};
await sendSubscribeMessage(payload, accessToken);
注意下发接口要求的 access_token 有效期约两小时,后端要集中缓存与刷新,不要每次下发都重新获取,否则容易触发微信的频率限制。
下发配额与次数限制
一次性订阅的本质决定了它的限制:用户授权几次,你最多就能发几次,不能超发。超发会被微信直接拒绝。因此后端要为每个 openid、每个模板维护一个「剩余可发次数」的账本,授权时加一,成功下发时减一。
- 记账订阅授权入库 +1,成功下发 -1,失败不扣。
- 幂等同一业务事件只发一次,防重复触发。
- 兜底次数不足时,改为在小程序内的「消息中心」留痕。
- 节流下发失败要降级重试,而不是无限轰炸接口。
合规要点与用户体验
订阅消息有明确的内容红线:只能用于服务状态通知,不能发营销促销、不能诱导分享、不能把通知当广告位。模板字段的内容要与模板标题语义一致,不能把「备注」字段塞满推广话术。违规会被封模板、限制下发能力,严重的下架小程序。
体验上还有两个细节:一是通知里的 page 要带正确参数,让用户点进来直接落到对应订单页,而不是首页;二是控制频率,即使用户多次订阅,也不要把同一事件重复推送,否则只会换来关闭通知和卸载。
常见报错与排查
最常见的几个返回码:43101 表示用户拒绝订阅或已经关闭了订阅,此时不要反复弹窗,应引导到设置页手动开启;47003 表示模板字段格式不符合要求,多半是内容超长或类型不匹配,按模板说明对齐即可;40001 是 access_token 无效或过期,检查后端刷新逻辑。
排查时的顺序是:先确认前端授权回调真的拿到了 accept,再确认后端账本里该用户确实还有次数,最后才看下发接口的返回。很多「发不出去」的问题,其实出在授权那一步就没有成功,而不是下发接口本身。
// 授权失败时的友好降级
wx.requestSubscribeMessage({
tmplIds: ['TEMPLATE_ID_DELIVERY'],
fail() {
wx.showToast({ title: '可在设置中开启通知', icon: 'none' });
}
});
小结与延伸阅读
把订阅消息做对,记住三句话:在产生通知需求的那一刻才索要授权,授权与下发严格一一对应,内容只服务于订单与预约状态。它是温和的、合规的触达方式,用好了是信任,用砸了就是骚扰。
- 小程序基础看《微信小程序开发入门:框架与组件》。
- 免服务器快速迭代,接《小程序云开发:云端一体实践》。
- 支付节点的通知,配合《微信支付接入全流程指南》一起设计。