必须由后端调用微信接口发送订阅消息,前端仅负责通过用户点击触发uni.requestsubscribemessage获取授权;调用需立即同步执行,且必须传withsubscriptions: true才能获取订阅状态。
不能只在前端调用 uni.requestsubscribemessage 就算完事——它只负责“拿授权”,不负责“发消息”。真正发出去,必须由后端调用微信接口 https://api.weixin.qq.com/cgi-bin/message/subscribe/send,且依赖有效的 access_token。
uni.requestSubscribeMessage 调用失败:不是代码写错,是时机不对
微信强制要求该 API 必须在用户真实点击(@click)中**立即、同步、无等待**执行。任何异步延迟都会被拦截:
- 放在
uni.login成功回调里 → 失败,已脱离点击上下文 - 按钮绑了
@click="handleClick",但handleClick里先await checkAuth()再调用 → 失败,中间有 await 就不算“立即” - 写在
onLoad、onShow或setTimeout里 → 直接报错"fail can only be invoked by user TAP gesture" - 未给
<button></button>设置open-type="subscribeMessage"(uni-app 3.0+ 推荐)→ 可能静默失败或兼容性差
uni.getSetting 拿不到 subscriptionsSetting:漏了关键参数
不传 withSubscriptions: true,返回结果里压根没有 subscriptionsSetting 字段,相当于白查:
-
withSubscriptions: false或不传 →res里只有authSetting,没有itemSettings - 即使传了
true,itemSettings['YOUR_TEMPLATE_ID']仍可能为undefined:说明用户从未对该模板做过选择,不是拒绝,是“没触达过” -
mainSwitch为false表示系统级通知总开关关闭,此时需引导用户去系统设置开启,uni.openSetting({ withSubscriptions: true })才有效
.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 管理不当:发几次就限流
后端不能每次发消息都重新请求 /cgi-bin/token。微信限制每 2 小时最多获取 1 次,每天上限 2000 次:
-
access_token有效期 2 小时,必须缓存在服务端内存或 Redis 中,并记录过期时间 - 前端拿到用户授权后,应立即将
openid和选中的template_id传给后端,后端再拼请求体发消息 - 一次性模板发完即失效,下次触发需重新走授权流程;长期模板普通小程序基本申请不到,别在开发初期押注这个
最容易被忽略的一点:真机测试前,务必确认基础库版本 ≥ 2.10.0,否则 withSubscriptions: true 会被忽略,所有权限检测逻辑都白写。开发者工具模拟器有时不报错,但真机上直接没反应。










