uni.requestSubscribeMessage仅获取授权,消息发送必须由后端调用微信接口,且需有效access_token、准确openid及严格合规的data结构。

不能只在前端调用 uni.requestSubscribeMessage 就算完事——它只负责“拿授权”,不负责“发消息”。真正把通知推到用户微信“服务通知”里,必须由后端调用微信接口 https://api.weixin.qq.com/cgi-bin/message/subscribe/send,且依赖有效的 access_token 和准确的 openid。
uni.requestSubscribeMessage 必须在 button 点击中第一行同步执行
微信硬性拦截所有非真实点击链路的调用。哪怕加一个 await 或 setTimeout,都会报 fail can only be invoked by user TAP gesture。
- 错误写法:放在
uni.login回调里、onLoad里、或@click函数中先查登录态再调用 - 正确写法:
<button open-type="subscribeMessage">开启物流实时更新</button>,且handleSubscribe函数体第一行就是uni.requestSubscribeMessage({ tmplIds: ['YOUR_TEMPLATE_ID'] }) - 必须是原生
<button></button>,open-type="subscribeMessage"属性不可省(uni-app 3.0+ 才支持) - 不要试图“优化体验”提前预加载或延迟弹窗——5 秒内未触发即静默失败,控制台可能无任何提示
检查订阅状态必须传 withSubscriptions: true
不传这个参数,uni.getSetting 返回结果里压根没有 subscriptionsSetting 字段,等于白查。
将产业文章整理为适合微信公众号/服务号发布的研究型草稿,支持原文读取、分层摘要、产业链标的梳理、image2 海报与封面生成、正文排版、微信草稿保存、回读校验和发布前确认。适用于鹊桥产业等服务号的半导体、AI 算力、先进封装、光通信、新能源、机器人等产业链研究内容。
-
res.subscriptionsSetting.mainSwitch在 iOS 上恒为true,不能当授权依据;安卓上关了也只表示系统总开关关闭 - 关键看
res.subscriptionsSetting.itemSettings['YOUR_TEMPLATE_ID']的值:'accept'(已同意)、'reject'(明确拒绝)、undefined(从未触达,此时才该拉起弹窗) - 字段名大小写、拼写必须和微信后台模板详情页里的
name完全一致(如thing1,不是THING1或keyword1) - 若返回
'reject',再次调用uni.requestSubscribeMessage不会弹窗,必须走uni.openSetting({ withSubscriptions: true })引导手动开启
.NET 或 Spring Boot 后端发消息时 data 结构必须严格合规
90% 的 {"errcode":47001,"errmsg":"data format error hint"} 错误,不是模板 ID 写错,而是字段结构不满足微信要求。
-
data必须是对象,每个字段必须是{ "value": "xxx" }形式,不能直接写"thing1": "xxx" -
touser必须是当前小程序用户的openid(不是 unionid,不是公众号 openid) -
template_id必须是微信公众平台审核通过的完整字符串,不能截断、不能带空格 - 请求 URL 必须带有效
access_token参数:https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=xxx -
access_token需缓存并校验有效期(2 小时),硬编码或每次重取会导致errcode: 40001
最容易被忽略的是:前端拿到 'accept' 只代表用户点了“允许”,不代表后端能立刻发成功。access_token 过期、openid 错位、字段名大小写偏差、甚至模板字段少填一个 value 键,都会让消息静默消失——微信不报错,但用户收不到。










