介绍:
音讯能力是小程序能力中的重要组成,咱们为开发者提供了订阅音讯能力,以便实现服务的闭环和更优的体验
* 订阅音讯推送地位:服务告诉
* 音讯订阅下发条件:用户自主订阅
* 订阅音讯卡片跳转能力:点击查看详情页可跳转到小程序的页面
步骤:
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')
}
}
})