前期准备条件:开放平台微信认证、服务号微信认证、找到或生成对应模板 (做过事件推送则可省略大部分操作,将用户关注时的信息入库,openID)
整体逻辑:注册开微信放平台账号(要通过微信认证)、开发微信小程序(需要用户通过微信授权登录小程序保存用户的openID和unionID)、申请微信服务号(公众号并要通过微信认证),并将微信小程序和公众号绑定在同一开放平台下,因为同一开放平台下的同一微信用户的unionID相同,而微信小程序和公众号的openID不相同,发送的模板消息是根据公众号用户的openID发送。
以下示例我是通过小程序端(前端)实现的,仅作为调用方法的参考,后续应该迁移到服务端,如果项目基础已经具备:小程序用户已经用微信授权登录过并且保存用户的openID和unionID,首次获取公众号关注列表(可有可无,如果之前没人关注过就可省去),通过服务端监听公众号用户关注或取消关注并将公众号用户的openID和unionID保存,通过unionID将小程序用户和公众号用户关联起来,如果取消关注关联关系理应取消,不然发出去消息用户接收不到。
当小程序端产生需要发送模板消息的业务时,通过unionID找到公众号用户的openID按照示例直接发送即可。如有疑问可私信。
1.获取公众号access_token
文档地址
uni.request({
url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的APPID&secret=你的APPsecret',
method: 'GET',
success: res => {
console.log(res)
let access_token = res.data.access_token
},
fail: res => {
console.log(res);
}
})
返回值
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
2.获取公众号关注者列表
文档地址
uni.request({
url: 'https://api.weixin.qq.com/cgi-bin/user/get?next_openid=&access_token=' + access_token,
method: 'GET',
success: res => {
console.log(res)
},
fail: res => {
console.log(res);
}
})
返回值
{
"total":2,
"count":2,
"data":{
"openid":["OPENID1","OPENID2"]},
"next_openid":"NEXT_OPENID"
}
3.根据openid获取用户信息
文档地址
(1).获取1个用户信息
uni.request({
url: "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=用户openID" + "&lang=zh_CN",
method: 'GET',
success: res => {
console.log(res)
},
fail: res => {
console.log(res);
}
})
返回值
{
"subscribe": 1,
"openid": "",
"nickname": "",
"sex": 1,
"language": "",
"city": "",
"province": "",
"country": "",
"headimgurl":"头像",
"subscribe_time": ,
"unionid": " "
"remark": "",
"groupid": 0,
"tagid_list":[],
"subscribe_scene": "",
"qr_scene": 98765,
"qr_scene_str": ""
}
(2).获取多个用户信息
uni.request({
url: "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=" + access_token,
method: 'POST',
header: {
"Content-Type": "application/json"
},
data: {
"user_list": [{
"openid": "",
"lang": "zh_CN"
}]
},
success: res => {
console.log(res)
},
fail: res => {
console.log(res);
}
})
返回值
{
"user_info_list": [
{
"subscribe": 1,
"openid": "",
"nickname": "",
"sex": 1,
"language": "",
"city": "",
"province": "",
"country": "",
"headimgurl": "",
"subscribe_time": ,
"unionid": "",
"remark": "",
"groupid": 0,
"tagid_list":[128,2],
"subscribe_scene": "",
"qr_scene": 98765,
"qr_scene_str": ""
},
{
"subscribe": 0,
"openid": ""
}
]
}
3.发送模板消息详情
文档地址
let sendMessage ="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token
uni.request({
url: sendMessage,
method: 'POST',
data: {
"touser": "接收人openID",
"template_id": "模板id",
"miniprogram": {
"appid": "跳转小程序APPID",
"pagepath": "跳转到小程序某一界面路径"
},
"data": {
"first": {
"value": "您有一条单据需要审批!",
"color": "#173177"
},
"keyword1": {
"value": "",
"color": "#173177"
},
"keyword2": {
"value": "",
"color": "#173177"
},
"keyword3": {
"value": "1000.00元",
"color": "#173177"
},
"keyword4": {
"value": "",
"color": "#173177"
},
"keyword5": {
"value": "2014-11-10",
"color": "#173177"
},
"remark": {
"value": "请尽快处理!",
"color": "#173177"
}
}
},
success: res => {
console.log(res);
},
fail: res => {}
});
返回值
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}