一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

uni-app完成微信小程序的模板消息推送 uni-app订阅消息配置

时间:2026-06-15 09:48:46 编辑:袖梨 来源:一聚教程网

uni-app中发微信订阅消息必须通过button点击触发uni.requestSubscribeMessage,且仅支持一次性模板;需校验itemSettings中具体模板ID状态,后端发送时须确保access_token有效、touser为正确openid、模板字段名与后台配置严格一致。

uni-app 里不能直接“发模板消息”,必须走微信订阅消息链路,且只能是一次性模板;自动调用 uni.requestSubscribeMessage 必然失败,这是硬性限制。

uni.requestSubscribeMessage 必须由 button 点击触发

微信强制要求该 API 只能在用户真实点击事件中调用,否则静默失败或报错 errCode: -1。常见错误包括:

  • onLoadonShowsetTimeout 中调用 —— 直接被拦截
  • viewtext 绑定 @click —— 微信不认,必须是原生 button
  • 没加 open-type="subscribeMessage" 属性 —— 即使是 button 也无效(uni-app 3.0+ 才支持该属性)

正确写法示例:

<button open-type="subscribeMessage" @click="handleSubscribe">开启订单通知</button>

对应 JS:

handleSubscribe() {  uni.requestSubscribeMessage({    tmplIds: ['YOUR_TEMPLATE_ID'],    success: (res) => {      if (res['YOUR_TEMPLATE_ID'] === 'accept') {        // 可立即调后端发消息      }    },    fail: (err) => {      console.error('授权失败', err)    }  })}

怎么判断用户是否已授权某模板 ID

不能只看 uni.getSetting({withSubscriptions: true})mainSwitch,它只是总开关。关键要查具体模板的状态:

  • itemSettings['YOUR_TEMPLATE_ID'] === 'accept':已授权,可发(但一次性模板发完即失效)
  • === 'reject':用户点过“拒绝”,再调 requestSubscribeMessage 不会弹窗,需引导去设置页:uni.openSetting({withSubscriptions: true})
  • === 'ban':模板被微信封禁(极少见,但真有)
  • 字段不存在:用户从未对该模板做过选择,此时才是调用 requestSubscribeMessage 的合适时机

务必传 withSubscriptions: true,否则 itemSettings 为空对象。

后端发送时三个高频踩坑点

前端拿到 'accept' 只是第一步,后端真正调用微信接口时,失败率极高,主因在:

  • access_token 必须缓存并校验有效期:微信限制每两小时刷新一次,且有调用频次限制;硬编码或每次重取会导致 40001 错误
  • touser 字段必须是当前小程序的 openid:跨小程序、用测试号 openid、或拿错登录态(比如用了公众号 openid),都会返回 errcode: 43101
  • 模板字段名必须和后台申请时完全一致:比如你申请模板时字段叫 thing1,代码里写成 contentmessage,微信直接忽略该字段,不报错但内容为空

发送接口地址是:https://api.weixin.qq.com/cgi-bin/message/subscribe/send,不是旧的模板消息地址,别混淆。

模板 ID 和字段名必须严格对齐后台配置

每个模板在微信公众平台「开发管理 → 订阅消息 → 我的模板」里生成唯一 templateId,且每个字段都有固定 name(如 character_string1time4)。这些 name 是硬编码进后端请求体的,改一个字母就丢数据。

  • 前端不用管字段名,只负责传 tmplIds 数组
  • 后端构造 data 对象时,key 必须是模板详情页里写的字段 name,value 是字符串值
  • 字段值有长度限制:如 thing.DATA 最多 20 字符;time.DATA 必须是 YYYY-MM-DD HH:mm 或带波浪线的时间段(如 "09:00~12:00"

最容易被忽略的是:模板字段名大小写敏感,且不能加空格或下划线变体 —— 拿错一个,整条消息就显示为空白。

热门栏目