小程序端无通知栏消息,仅支持订阅/模板消息;需用户主动授权、服务端按固定字段填充数据、跳转页面须配置合法路径及参数;真机测试前须确保域名备案、模板审核发布、appid配置正确。

小程序端没有“通知栏消息”,只有订阅消息和模板消息
uni-app 在小程序平台(微信、支付宝、百度等)根本不存在系统级通知栏弹窗。所谓“通知栏消息”是 App 端专属能力,小程序受平台限制,只能走官方订阅机制。你看到的“推送成功”提示,其实是调用 uni.requestSubscribeMessage 后弹出的用户授权弹窗,不是通知本身。
微信小程序必须用户主动订阅才能发模板消息;支付宝/百度则支持部分服务号免订阅,但依然不等于原生通知栏。混淆这个前提,后续所有逻辑都会跑偏。
- 微信:必须先调用
uni.requestSubscribeMessage获取tmplIds授权,服务端才能通过模板 ID 发送 - 支付宝:需在小程序后台开通“订阅消息”权限,并配置模板,客户端调用
my.subscribeMessage(uni-app 封装为uni.requestSubscribeMessage) - uni-app 的
uni.showLocalNotification在小程序环境直接不执行,控制台无报错,静默跳过
如何让订阅消息带个性化内容(如用户名、订单号)
模板消息的内容字段(data)必须和服务端下发的 JSON 结构完全一致,且字段名由模板定义时固定,不能动态增删。所谓“个性化”,本质是服务端拼接好数据后填入预设字段。
例如微信模板中定义了字段 thing5(商品名称)、number1(订单号),你在前端调用时传的 data 必须是:
{
"thing5": { "value": "iPhone 16 Pro" },
"number1": { "value": "20260616123456" }
}
关键点:
- 字段 key(如
thing5)不能改,必须和服务端模板配置一致 - 每个字段的
value是字符串,数字/日期需转成字符串再传 - 前端不能生成新字段,也不能省略已授权的必填字段,否则服务端发送失败
- uni-app 中统一用
uni.requestSubscribeMessage请求授权,返回对象里errMsg为requestSubscribeMessage:ok才代表该模板被允许
点击消息后跳转指定页面,但参数受限
小程序模板消息点击后默认打开小程序首页,若要跳转到具体页面(如订单详情),必须在服务端下发时带上 page 字段,且路径必须是已在 app.json 或 pages.json 中注册的合法路径。
例如服务端发送时写:
{
"touser": "oAbc123...",
"template_id": "TEMPLATE_ID",
"page": "pages/order/detail?order_id=20260616123456",
"data": { ... }
}
注意:
-
page字段只在微信小程序生效;支付宝/百度不支持跳转带参页面 - URL 参数长度有限制(微信约 1024 字符),别塞大对象或长文本
- uni-app 客户端无法拦截或修改点击行为,一切由小程序平台控制
- 如果用户没安装你的小程序,点击消息会引导下载,不会跳转
真机测试前最容易漏的三件事
本地开发工具模拟器能过,一上真机就收不到——90% 都卡在这三个硬性条件上:
- 微信开发者工具里勾选了「不校验合法域名」,但真机必须配置合法的
request域名(含 https)且备案,否则服务端回调失败 - 模板 ID 没在小程序管理后台“功能–订阅消息”里提交审核并发布,未发布的模板 ID 调用
uni.requestSubscribeMessage会返回cancel - uni-app 项目中
manifest.json的“微信小程序配置”里没填对 AppID,导致云函数或服务端识别不到来源,拒绝下发
这些点不解决,日志里看不到错误,消息就是不出现——因为问题发生在服务端鉴权或平台拦截阶段,前端根本收不到响应。











