统一模板uniformMessage.send有两种调用方式:
云调用的方法我之前的博文中有介绍,此处就不多做介绍,本文主要介绍使用HTTPS调用的方式发送统一模板消息,使用该方式发送模板消息的主要应用场景为发送消息端和接收端用户分别使用不同的小程序,比如用户使用某商城小程序下单,商品配送的服务人员使用的另外一个服务端小程序,因为不同云环境中的openId是不一样的,统一模板uniformMessage.send需要传入接收者的openId,此时就需要使用HTTPS调用的方式。
在这种情景下,也不能使用云函数调用的方式,经过测试,在云环境A中调用云环境B中的云函数,此时该云函数的运行环境还是A,只是能获取A中的数据,而统一模板uniformMessage.send在传入接收者openId后,微信后端将openId转为unionid,因此无法找到B环境下小程序用户的openId对应的unionid。
POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
请求地址中需要传入接口调用凭证,注意:该凭证需要是目标小程序用户的小程序access_token(比如商家需要给消费者发送信息,此access_token就是消费者下单的商城小程序access_token,不是商家管理端程序)
在云函数中获取access_token:
const cloud = require('wx-server-sdk')
const rp = require('request-promise')
cloud.init()
exports.main = async (event, context) => {
//appid和秘钥
const appid = 'wxXXXXXXXXX30'//目标小程序appid
const secret = 'c879XXXXXXXXXXXXc949fd7'//目标小程序appsecret
const AccessToken_options = {
method: 'GET',
url: 'https://api.weixin.qq.com/cgi-bin/token',
qs: {
appid,
secret,
grant_type: 'client_credential'
},
json: true
}
const resultValue = await rp(AccessToken_options)
const token = resultValue.access_token//获得access_token
}
此处获取小程序方式为云函数方式获取,如果商家是电脑PC端管理程序时,使用C++获取access_token的方法可以参考我之前得文章:Qt 连接管理微信小程序云数据库一(获取微信后台接口调用凭据ACCESS_TOKEN)
接下来就使用上一步获取到的access_token发送统一模板消息:
注意的坑,按照官方的示例中的例子中miniprogram的传入参数:
"miniprogram":{ "appid":"xiaochengxuappid12345", "pagepath":"index?foo=bar" },
无法成功发送消息,一直反馈{"errcode":40165,"errmsg":"invalid weapp pagepath hint: 经过测试后发现官方文档有误,此处参数应为page,而不是pagepath。即:page:"pages/index"
调用HTTPS部分代码:
let json = {
"touser" : openId,
"access_token":token,//token为上文中获得的access_token
"mp_template_msg":{
"appid":"wxxxxxxxx69861d",//发送目标公众号的appid,可在公众号设置里找到
"template_id":"RJj6BFxxxxxxxxJBdajn2tW6vU",//待发送的模板消息的模板ID
"miniprogram":{
"appid":"wxebcxxxxxxxx830",//模板消息发送后关联的小程序,即点击消息后跳转的小程序
"page":"page/orderList"//跳转的小程序的页面位置
},
data: {//模板消息参数
first: {
value: 'hhhh',
color: '#173177'
},
keyword1: {
value: 'haha',
color: '#173177'
},
remark: {
value: 'backup',
color: '#173177'
}
},
}
}
const send = await rp({//使用request-promise发送数据包
method:'POST',
url:'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send',
qs:{
access_token:token
},
body:json,
json:true
})
return send
代码中相关部分我已做了注释,基本上可以通过注释看懂整个统一消息发送的流程模式了,发送成功时返回数据: