由于“模板消息”将下线,已不再支持添加模板,所以针对新的订阅消息的使用,今天刚好踩坑,然后在这里记录一下。
其实,说是说模板消息换成了订阅消息,但是根本上还是换汤不换药的,但是订阅消息可能相比于模板消息的最大的优点就在于他不再依赖于form表单来提交数据了,因为以往的模板消息没有from-id,根本实现不了,再加上时间的限制,但是订阅消息并没有诸多限制
对比一下总体功能
但是有好有坏,订阅消息今天我刚踩坑就遇到了很多问题,一方面是我自己书写不规范造成的,一些是我感觉设计有问题,可能订阅消息功能会随着时间慢慢完善吧
言归正传:说到订阅消息的使用,由于我使用的是云开发开发项目,所以在这里我主要是拿云开发做例子
第一步:调用
wx.requestSubscribeMessage({
tmplIds: [''], //这里就是存放你模板消息的id,可以存放多个,上限暂时不知
success (res) {
//这里就是做获得权限后的回调
})
})然后订阅者消息的模板分为一次性和长久性的,我也是今天写才知道,一次性为普遍,只有极个别的小程序类别上,比如医学,教育等才可以申请到长久性的模板
一次性和长久性的有什么使用上的区别,(不好意思,可能我不配看到长久性的模板,因为我也没见过啊)
然后如何模板里填充你想要的消息呢,就需要用到subscribeMessage.send这个api了
在这里我拿云函数为例
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async(event, context) => {
try {
const {
OPENID
} = cloud.getWXContext();
// 在云开发数据库中存储用户订阅的课程
const result = await db.collection('messages').add({
data: {
touser: OPENID, // 订阅者的openid
page: 'index', // 订阅消息卡片点击后会打开小程序的哪个页面
data: event.data, // 订阅消息的数据
templateId: event.templateId, // 订阅消息模板ID
done: false, // 消息发送状态设置为 false
},
});
return result;
} catch (err) {
console.log(err);
return err;
}
};
上面这是获取权限的云函数
const cloud = require('wx-server-sdk');
exports.main = async (event, context) => {
cloud.init();
const db = cloud.database();
try {
// 从云开发数据库中查询等待发送的消息列表
const messages = await db
.collection('messages')
// 查询条件这里做了简化,只查找了状态为未发送的消息
// 在真正的生产环境,可以根据日期等条件筛选应该发送哪些消息
.where({
done: false,
})
.get();
// 循环消息列表
const sendPromises = messages.data.map(async message => {
try {
// 发送订阅消息
await cloud.openapi.subscribeMessage.send({
touser: message.touser,
page: message.page,
data: message.data,
templateId: message.templateId,
});
// 发送成功后将消息的状态改为已发送
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;
}
};
上面这是发送模板消息给用户的云函数
然后前端传过来模板消息,模板消息的格式为
const b = {//发送给用户
"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({//调用订阅消息通知用户
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的这个云函数中设置定时触发器,这样就可以做到用户实时知道了
在用户的config.json文件中
{
"permissions": {
"openapi": [
"subscribeMessage.send"
]
},
"triggers": [
{
"name": "sendMessagerTimer",
"type": "timer",
"config": "0 * * * * * *"
}
]
}
然后先上传定时触发器,在上传云函数,就可以了
如果文章上有什么错误,或者我写的有问题的也希望大家批评指正,麻烦各位了