最近和同学做一个微信小程序项目,碰到一个比较棘手的问题,花了几天时间解决,用此篇文章记下这个过程
模板消息推送,已在2020年1月10日下线,我们根据开发功能需求选择订阅消息功能。
小程序订阅消息
我们先看看微信官方给的说明
功能介绍
消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。
- 订阅消息推送位置:服务通知
- 订阅消息下发条件:用户自主订阅
- 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面
使用说明
步骤一:获取模板 ID
在微信公众平台手动配置获取模板 ID:
登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
- 选择适合的消息模板
- 给消息模板选择需要的细则
- 获取模板ID
步骤二:获取下发权限
我们已经配置好了需要的模板,获取到了ID,但是需要给用户发送ID需要用户进入小程序端授权
详见小程序端消息订阅接口 wx.requestSubscribeMessage
wx.requestSubscribeMessage(Object object)
基础库 2.4.4 开始支持,低版本需做兼容处理。
调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态。
注意事项
- 一次性模板 id 和永久模板 id 不可同时使用,只用特定行业可以使用模板id,个人以及一般企业无法使用永久模板id
- 低版本基础库2.4.4~2.8.3 已支持订阅消息接口调用,仅支持传入一个一次性 tmplId / 永久 tmplId。
- 2.8.2 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
- 2.10.0 版本开始,开发版和体验版小程序将禁止使用模板消息 formId。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
tmplIds | Array | 是 | 需要订阅的消息模板的id的集合,一次调用最多可订阅3条消息(注意:iOS客户端7.0.6版本、Android客户端7.0.7版本之后的一次性订阅/长期订阅才支持多个模板消息,iOS客户端7.0.5版本、Android客户端7.0.6版本之前的一次订阅只支持一个模板消息)消息模板id在[微信公众平台(mp.weixin.qq.com)-功能-订阅消息]中配置 | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
object.success 回调函数
参数
Object res
属性 | 类型 | 说明 |
errMsg | String | 接口调用成功时errMsg值为’requestSubscribeMessage:ok’ |
TEMPLATE_ID | String | [TEMPLATE_ID]是动态的键,即模板id,值包括’accept’、‘reject’、‘ban’。'accept’表示用户同意订阅该条id对应的模板消息,'reject’表示用户拒绝订阅该条id对应的模板消息,'ban’表示已被后台封禁。例如 { errMsg: “requestSubscribeMessage:ok”, zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: “accept”} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息 |
示例代码
我们需要将在第一步中获取到的订阅消息模板ID,填入tmplIds,这里可以同时填入多个订阅消息模板的ID,在发送消息给用户之前,需要用户登陆小程序端,执行以下接口:
wx.requestSubscribeMessage({
//发送获取订阅消息的发送权限,一下ID需要根据你自己的ID更改
tmplIds: ['dD6qreqBVnloaGUVp7-eKaASyaYi0BuEVdhyNcv2zBY'],
success(res) {
console.log(res)
},
fail(err) {
console.log(err)
}
})
以上代码会出现确认弹窗,需要用户确认,值得注意的是,以上代码只能在真机上调试,没办法在开发者工具上运行
步骤三:调用接口下发订阅消息
发送订阅消息有两种方法,一种是使用自己的服务器动用Fttp接口,一种是微信小程序云开发的服务器,调用云开发的接口,这里我们演示第二种方法
详见服务端消息发送接口 subscribeMessage.send
云调用
云调用是小程序·云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过
wx-server-sdk
使用。
接口方法
openapi.subscribeMessage.send
需在
config.json
中配置subscribeMessage.send
API 的权限,详情
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
touser | string | 是 | 接收者(用户)的 openid | |
templateId | string | 是 | 所需下发的订阅模板id | |
page | string | 否 | 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 | |
data | Object | 是 | 模板内容,格式形如 { “key1”: { “value”: any }, “key2”: { “value”: any } } | |
miniprogramState | string | 否 | 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 | |
lang | string | 否 | 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN |
返回值
Object
返回的 JSON 数据包
属性 | 类型 | 说明 |
errCode | number | 错误码 |
errMsg | string | 错误信息 |
errCode 的合法值
值 | 说明 | 最低版本 |
0 | 成功 |
Object
抛出的异常
属性 | 类型 | 说明 |
errCode | number | 错误码 |
errMsg | string | 错误信息 |
# 请求示例
新建一个云函数send,在send.js中写入以下代码,上传更新,注意参数中data部分,所有的键名要和模板信息中的一一对应
// send.js
const cloud = require('wx-server-sdk')
cloud.init({
env:cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
try {
const result = await cloud.openapi.subscribeMessage.send({
//需要发送消息的用户openid
touser: wxContext.OPENID,
page:"pages/index/index",
data: {
//此处的date3对应上图的date3
date3: {
value: "2015年01月05日"
},
//此处的thing2对应上图的thing2
thing2: {
value: '请登陆小程序查收维保申请'
}
},
templateId: "dD6qreqBVnloaGUVp7-eKaASyaYi0BuEVdhyNcv2zBY",
miniprogramState: 'developer'
})
return result
} catch (err) {
return err
}
}
- 只要用户已经授权,就可以调用此函数向用户发送订阅消息,此函数可以在小程序端调用以下代码即可完成向用户发送消息
wx.cloud.callFunction({
name:"send",
}).then(res=>{
console.log(res)
}).catch(er=>{
console.log(err)
})
但是一般来说,订阅消息是需要开发者设置触发器定时自动运行的