微信小程序禁止自动下发全局消息订阅,必须由用户点击<button open-type="subscribeMessage">授权后,后端凭模板ID和openid调用微信接口发送;前端仅负责获取授权,不可承担消息发送逻辑。

uni-app 小程序端**不能实现“自动下发”的全局消息订阅通知**。所谓“用户一进小程序就弹授权、后台静默推送”,在微信生态里是明确禁止的,技术上不可行,审核必拒。
真正能落地的方案只有一条:**前端引导用户点击授权 → 后端凭模板 ID 和 openid 主动调用微信接口发送**。下面分几个实操关键点说清楚。
uni.requestSubscribeMessage 必须由 <button open-type="subscribeMessage"> 点击触发
这是微信硬性限制,不是兼容问题。任何绕过用户真实点击的操作都会失败:
-
uni.requestSubscribeMessage放在onLoad、onShow或setTimeout里 → 直接报错errCode: -1,提示"fail api scope is not declared" - 用
<view @click>或<text @click>包裹调用 → 微信不识别,静默失败,无报错也无弹窗 -
<button>没加open-type="subscribeMessage"属性(uni-app3.0+ 强制要求)→ 不触发授权流程 - 正确写法只有一种:
<button open-type="subscribeMessage" @click="handleSubscribe">开启订单提醒</button> -
tmplIds建议每次只传 1 个模板 ID,避免用户点“拒绝”后整批失效
检查订阅权限必须传 withSubscriptions: true
uni.getSetting() 默认查不到订阅状态,漏掉这个参数等于白查:
- 不传或传
withSubscriptions: false→ 返回结果里压根没有subscriptionsSetting字段 - 传
withSubscriptions: true→ 才能拿到res.subscriptionsSetting.mainSwitch和res.subscriptionsSetting.itemSettings -
itemSettings[templateId]是undefined?说明该模板从未被请求过,不是“拒绝”,而是“没触达” - 别只看
mainSwitch,它只是系统总开关;真正决定能否发消息的是itemSettings[templateId]的值:'accept'、'reject'或'ban'
.NET 或其他后端调用 send 接口时 invalid template_id 的真实原因
报错 {"errcode":47001,"errmsg":"data format error hint"} 或 invalid template_id,90% 不是 ID 写错了,而是字段结构不合规:
- 模板字段名(如
thing1、time2)必须和微信公众平台「模板详情」页里列出的name完全一致,大小写敏感,不能加空格、下划线或前缀 - 每个字段必须是对象,含
value键,例如:{ "thing1": { "value": "订单已发货" } };直接写"thing1": "订单已发货"会报错 -
touser必须是真实用户的openid,不是unionid;template_id必须是已审核通过的完整字符串,不能截断 - URL 必须带
access_token参数:https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=xxx,不是旧的模板消息地址 -
access_token要定期刷新,且不能跨账号复用;发几次就失效,大概率是缓存策略或有效期处理不当
为什么不能“全局自动订阅”?关键约束在微信底层
这不是 uni-app 的能力边界问题,而是微信平台级设计:
- 订阅行为必须绑定到具体业务场景(如“支付成功后提醒物流”),不能泛化为“接收所有消息”
- 每个模板 ID 对应一次授权,用户拒绝后,前端无法再次触发授权弹窗,必须跳转
uni.openSetting({ withSubscriptions: true })引导手动开启 - 一次性模板有效期仅 7 天,长期订阅仅对政务、医疗等特殊类目开放,普通小程序无权限
- 后端发送时若
access_token过期、openid失效、模板字段缺失或格式错位,都会静默失败,且错误提示极不友好
access_token 生命周期、模板字段映射关系、用户 openid 存储与校验逻辑**。把这部分甩给前端,项目上线后基本就是“授权成功,一条消息都推不出去”。


















