介绍:
消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验
* 订阅消息推送位置: 服务通知
* 消息订阅下发条件: 用户自主订阅
* 订阅消息卡片跳转能力: 点击查看详情页可跳转到小程序的页面
步骤:
1: 获取模版ID
登录 [https://mp.weixin.qq.com](https://mp.weixin.qq.com/) 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
模版受限于小程序的类型的
2: 获取下发权限
小程序端消息订阅接口 wx.requestSubscribeMessage
* 一次性订阅&永久性订阅模版Id不能同时使用
* 订阅列表接口中的tmplIds, 必须为用户未订阅的内容, 如果为数组则显示订阅列表
* 如果用户的订阅总开关是关闭的,即mainSwitch为false
2.1: 可获取用户对相关模板消息的订阅状态
wx.getSetting
* 获取用户已经订阅过消息
* 获取服务端订阅消息的模版Id -> restful -> array
* 对比服务器已有的消息模版 -> globalData
* 用户未开启订阅消息 -> return
* 用户开启订阅消息 -> 未设置任何订阅消息
* 用户开启订阅消息 -> 已经有了部分设置 -> reject、accept
2.1.1: 授权信息
<button open-type="getUserInfo"/>等进行触发
2.1.2: 直接调起客户端小程序设置界面
wx.openSetting
点击事件触发
3: 调用接口下发订阅消息
服务端消息发送接口 subscribeMessage.send
web: 订阅状态?
import { getSubIds } from '/login/api'
async getSettings () {
const result = await getSubIds()
let arra = []
if (result.code === 200) {
arr = result.data
}
wx.getSetting({
withSubscriptions: true,
success: res => {
const app = getApp()
app.globalData.subscriptionsSetting = res.subscriptionsSetting
const keys = res.subscriptionsSetting.itemSettings
if (!res.subscriptionsSetting.mainSwitch) {
return
}
if (!keys) {
app.globalData.tmplIds = arr
} else {
const keysArr = Object.keys(arr)
app.globalData.tmplIds = arr.filter(item => keysAr.indexOf(item) === -1)
}
等待用户的订阅 -> requestSubscribeMessage
}
})
}
test page subscription:
<van-button @click="subscribe()" size="small" class="sub">订阅</van-button>
subscribe () {
if (!this.isLogin) {
return
}
const arr = [
'3icSr0YIBLcMSYXchHBTWgCiAAom4lrkJqZAf2pVc',
'xVA_zdzgM8zPtpDOO92rpK9kQumz4O84E7sTy9Ihfds',
'sG80CJj2GvArifGRCWOJhumIyY5mQnM94RWGQkdctGc'
]
const tmplIds = getApp().globalData.tmplIds.filter(item -> arr.indexOF(item) !== -1)
wx.requestSubscribeMessage({
tmplIds: tmplIds,
success: res => {
if (res) {
// 过滤已经订阅过的id
getApp().globalData.tmplIds = getApp().globalData.tmplIds
.filter(
(item) => {
// 过滤掉已经订阅了的ids,保留未订阅未设置的ID
return Object.keys(res).indexOf(item) === -1
}
)
}
}
})
}
服务端:
accessToken 定时更新机制
import { CronJob } from 'cron'
import { wxGetAccessToken } from './wxUtils'
const job = new CronJon('* 55 */1 * * *', () => {
// 1h 55 minutes
wxGetAccessToken()
})
job.start()
消息推送
export const wxSendMessage = async (options) => {
const accessToken = await wxGetAccessToken()
try{
const result = await axios.post(`https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${accessToken}`, { ...options })
return result
} catch (error) {
logger.error(`wxSendMessage Error: ${error.message}`)
}
}
test login message:
await wxSendMessage ({
touser: openId,
template_id: 'xxxxxxxxx', // 模版id
data: {
name1: {
value: name // 用户名
},
date2: {
value: moment().format('YYYY-MM-DD hh:mm:dd')
}
}
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。