在做服务类小程序时,通常会遇到客户在客户端下单后,接单商家需要有新订单消息提醒的功能。由于小程序模板消息已下线无法使用,而小程序中的订阅消息需要手动订阅后才能触发,并且每次订阅只能触发一次(不管有没有勾选一直允许订阅消息,及时一直允许,也只有一次,只是不弹出授权框而已),再者客户点击下单,商家小程序无法获得订阅授权!因此最终选择的方案为统一服务消息uniformMessage.send。
注意:公众号模板消息,向认证后的服务号开放。所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限。同时,这公众号和小程序要相互关联了,且必须是同主体才行。接收公众号模板消息需要接收人关注此公众号!
由于是使用的微信自己的云函数调用,因此不需要先把小程序的openId转成unionid,再根据unionid得到公众号中对应用户的openId,直接在参数中传入需要接收订单通知的小程序的openId就可以了。
注意的坑,按照官方的示例无法成功发送消息,一直反馈{"errcode":40165,"errmsg":"invalid weapp pagepath hint: 经过测试后发现官方文档有误,此处参数应为page,而不是pagepath。即:page:"pages/index"
云函数代码:
const cloud = require('wx-server-sdk')
cloud.init()
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const openId = wxContext.OPENID//此处获取本小程序openId,如何获取商家openId看下文
try {
const result = await cloud.openapi.uniformMessage.send({
touser: openId,//公众号appid,要求与小程序有绑定且同主体
mpTemplateMsg: {
appid: 'wx338663359e69861d',
miniprogram: {//公众号模板消息所要跳转的小程序,小程序的必须与公众号具有绑定关系
appid: 'wxc297xxxxxxx8754f',//小程序appid
page:"pages/index"//跳转的小程序的路径,注意此处文档中有误
},
data: {//公众号模板消息的数据
first: {
value: '恭喜你购买成功!',
color: '#173177'
},
keyword1: {
value: '巧克力',
color: '#173177'
},
keyword2: {
value: '39.8元',
color: '#173177'
},
remark: {
value: '欢迎再次购买!',
color: '#173177'
}
},
templateId: 'SuNIuh3Fmz4DmXnExxxxxxxI8qxxxxxxrF5qhX8''//公众号模板id
}
})
return result
} catch (err) {
return err
}
}
以上代码实现了给自己小程序发送,那客户端和商家端两个小程序不同,云开发环境不同,即使同一个微信登录openId也不同,怎么办呢?解决方法很简单,在客户端A中使用云函数调用服务端B发送模板消息的云函数即可。在不同小程序间相互调用云环境的方法可参考我之前的教程:微信小程序不同小程序间调用云环境(多个不同小程序共享云数据)
注意,mpTemplateMsg中的参数touser必须为接收者微信在该云函数中的openId。(即:不能发送模板消息的是客户端小程序A,而A云函数touser参数传入的openId是商家端小程序B中接收消息者的openId)