由于“模板消息”將下線耐量,已不再支持添加模板飞蚓,所以針對(duì)新的訂閱消息的使用,今天剛好踩坑廊蜒,然后在這里記錄一下趴拧。
其實(shí)山叮,說(shuō)是說(shuō)模板消息換成了訂閱消息著榴,但是根本上還是換湯不換藥的,但是訂閱消息可能相比于模板消息的最大的優(yōu)點(diǎn)就在于他不再依賴于form表單來(lái)提交數(shù)據(jù)了屁倔,因?yàn)橐酝哪0逑](méi)有from-id脑又,根本實(shí)現(xiàn)不了,再加上時(shí)間的限制,但是訂閱消息并沒(méi)有諸多限制
對(duì)比一下總體功能
但是有好有壞叔壤,訂閱消息今天我剛踩坑就遇到了很多問(wèn)題,一方面是我自己書(shū)寫(xiě)不規(guī)范造成的口叙,一些是我感覺(jué)設(shè)計(jì)有問(wèn)題炼绘,可能訂閱消息功能會(huì)隨著時(shí)間慢慢完善吧
言歸正傳:說(shuō)到訂閱消息的使用,由于我使用的是云開(kāi)發(fā)開(kāi)發(fā)項(xiàng)目妄田,所以在這里我主要是拿云開(kāi)發(fā)做例子
第一步:調(diào)用
wx.requestSubscribeMessage({
? ???tmplIds: [''], //這里就是存放你模板消息的id,可以存放多個(gè)俺亮,上限暫時(shí)不知
?????success (res) {
? ? ? ? ? ? //這里就是做獲得權(quán)限后的回調(diào)
?????})
})然后訂閱者消息的模板分為一次性和長(zhǎng)久性的,我也是今天寫(xiě)才知道疟呐,一次性為普遍脚曾,只有極個(gè)別的小程序類別上,比如醫(yī)學(xué)启具,教育等才可以申請(qǐng)到長(zhǎng)久性的模板
一次性和長(zhǎng)久性的有什么使用上的區(qū)別本讥,(不好意思,可能我不配看到長(zhǎng)久性的模板鲁冯,因?yàn)槲乙矝](méi)見(jiàn)過(guò)翱椒小)
然后如何模板里填充你想要的消息呢,就需要用到subscribeMessage.send這個(gè)api了
在這里我拿云函數(shù)為例
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async(event, context) => {
? try {
? ? const {
? ? ? OPENID
? ? } = cloud.getWXContext();
? ? // 在云開(kāi)發(fā)數(shù)據(jù)庫(kù)中存儲(chǔ)用戶訂閱的課程
? ? const result = await db.collection('messages').add({
? ? ? data: {
? ? ? ? touser: OPENID, // 訂閱者的openid
? ? ? ? page: 'index', // 訂閱消息卡片點(diǎn)擊后會(huì)打開(kāi)小程序的哪個(gè)頁(yè)面
? ? ? ? data: event.data, // 訂閱消息的數(shù)據(jù)
? ? ? ? templateId: event.templateId, // 訂閱消息模板ID
? ? ? ? done: false, // 消息發(fā)送狀態(tài)設(shè)置為 false
? ? ? },
? ? });
? ? return result;
? } catch (err) {
? ? console.log(err);
? ? return err;
? }
};
上面這是獲取權(quán)限的云函數(shù)
const cloud = require('wx-server-sdk');
exports.main = async (event, context) => {
? cloud.init();
? const db = cloud.database();
? try {
? ? // 從云開(kāi)發(fā)數(shù)據(jù)庫(kù)中查詢等待發(fā)送的消息列表
? ? const messages = await db
? ? ? .collection('messages')
? ? ? // 查詢條件這里做了簡(jiǎn)化薯演,只查找了狀態(tài)為未發(fā)送的消息
? ? ? // 在真正的生產(chǎn)環(huán)境撞芍,可以根據(jù)日期等條件篩選應(yīng)該發(fā)送哪些消息
? ? ? .where({
? ? ? ? done: false,
? ? ? })
? ? ? .get();
? ? // 循環(huán)消息列表
? ? const sendPromises = messages.data.map(async message => {
? ? ? try {
? ? ? ? // 發(fā)送訂閱消息
? ? ? ? await cloud.openapi.subscribeMessage.send({
? ? ? ? ? touser: message.touser,
? ? ? ? ? page: message.page,
? ? ? ? ? data: message.data,
? ? ? ? ? templateId: message.templateId,
? ? ? ? });
? ? ? ? // 發(fā)送成功后將消息的狀態(tài)改為已發(fā)送
? ? ? ? return db
? ? ? ? ? .collection('messages')
? ? ? ? ? .doc(message._id)
? ? ? ? ? .update({
? ? ? ? ? ? data: {
? ? ? ? ? ? ? done: true,
? ? ? ? ? ? },
? ? ? ? ? });
? ? ? } catch (e) {
? ? ? ? return e;
? ? ? }
? ? });
? ? return Promise.all(sendPromises);
? } catch (err) {
? ? console.log(err);
? ? return err;
? }
};
上面這是發(fā)送模板消息給用戶的云函數(shù)
然后前端傳過(guò)來(lái)模板消息,模板消息的格式為
const b = {//發(fā)送給用戶
"character_string1":{"value": this.data.shopid},
"thing8":{"value": this.data.lists.shopname},
"amount9":{"value": this.data.lists.shopprice},
"phone_number11":{"value": this.data.tel},
"thing13":{"value": this.data.address}
}
const a = 'xxxxxxxxxxxxxxxxxxx'//模板id
wx.requestSubscribeMessage({//調(diào)用訂閱消息通知用戶
tmplIds:[a],
success:(res)=>{
if (res.errMsg === 'requestSubscribeMessage:ok' && res[a] === "accept") {
wx.cloud.callFunction({
name:'subscribe',
data:{
data:b,
templateId:a,
open:this.data.shopopenid
}
}).then(rts=>{
wx.showToast({
title:'訂閱成功'
})
}).catch((err)=>{
console.log(err)
wx.showToast({
title:'訂閱失敗'
})
})
}
},
fail(err){
console.log(err)
}
})
切記在一定要在send的這個(gè)云函數(shù)中設(shè)置定時(shí)觸發(fā)器跨扮,這樣就可以做到用戶實(shí)時(shí)知道了
在用戶的config.json文件中
{
? "permissions": {
? ? "openapi": [
? ? ? "subscribeMessage.send"
? ? ]
? },
? "triggers": [
? ? {
? ? ? "name": "sendMessagerTimer",
? ? ? "type": "timer",
? ? ? "config": "0 * * * * * *"
? ? }
? ]
}
然后先上傳定時(shí)觸發(fā)器序无,在上傳云函數(shù),就可以了
如果文章上有什么錯(cuò)誤衡创,或者我寫(xiě)的有問(wèn)題的也希望大家批評(píng)指正帝嗡,麻煩各位了