程序消息订阅、统⼀服务消息、客服消息、消息推送
1、消息订阅
1、消息类型
(1) ⼀次性订阅消息
⽤户⾃主订阅后,开发者可不限时间地下发⼀条对应的服务消息;每条消息可单独订阅或退订。
(2) 长期订阅消息
⽤户订阅⼀次后,开发者可长期下发多条消息。
⽬前长期性订阅消息仅向政务民⽣、医疗、交通、⾦融、教育等线下公共服务开放,后期将逐步⽀持到其他线下公共服务业务。
(3) 订阅消息语⾳提醒
当开发者调⽤wx.requestSubscribeMessage时仅订阅1条消息且该模板⽀持开启语⾳提醒,当⽤户开启了语⾳提醒,该模板的订阅状态为'acceptWithAudio'。如:收款到账通知
2、配置模板并获取模板id
⼩程序后台->订阅消息中设置
3、发起订阅
⼀次性模板id和永久模板id不可同时使⽤
⼀次授权调⽤⾥,每个tmplId对应的模板标题不能存在相同的,若出现相同的,只保留⼀个
(questSubscribeMessage腾讯客服qq
tmplIds  ['id',...],⼀次调⽤最多可订阅3条消息,每个tmplId对应的模板标题需要不相同,否则会被过滤。
success
errMsg 接⼝调⽤成功时errMsg值为'requestSubscribeMessage:ok'
模板id 'accept'、'reject'、'ban'、'filter'
'accept'表⽰⽤户同意订阅该条id对应的模板消息
'reject'表⽰⽤户拒绝订阅该条id对应的模板消息
'ban'表⽰已被后台封禁
'filter'表⽰该模板因为模板标题同名被后台过滤。
例如 { errMsg: "requestSubscribeMessage:ok", zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: "accept"}
fail
complete
})
(2)获取⽤户对相关模板消息的订阅状态
当⽤户勾选了订阅⾯板中的“总是保持以上选择,不再询问”时,模板消息会被添加到⽤户的⼩程序设置页,通过wx.getSetting接⼝可获取⽤户对相关模板消息的订阅状态
withSubscriptions 是否同时获取⽤户订阅消息的订阅状态,默认不获取,注意:withSubscriptions只返回⽤户勾选过订阅⾯板中的“总是保持以上选择,不再询问”的订阅消息。
success
authSetting    ⽤户授权结果
subscriptionsSetting ⽤户订阅消息设置,接⼝参数withSubscriptions值为true时才会返回。
{
mainSwitch: true,  订阅消息总开关
itemSettings: {    每⼀项开关
SYS_MSG_TYPE_INTERACTIVE: 'accept',  ⼩游戏系统订阅消息
SYS_MSG_TYPE_RANK: 'accept'
zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject',  普通⼀次性订阅消息
ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban',
}
}
miniprogramAuthSetting 在插件中调⽤时,当前宿主⼩程序的⽤户授权结果
fail
complete
})
(3)服务端发送消息
⽅式⼀:
POST api.weixin.qq/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
请求体:
请求体:
access_token|cloudbase_access_token  接⼝调⽤凭证
touser  接收者(⽤户)的openid
template_id  所需下发的订阅模板id
page  点击模板卡⽚后的跳转页⾯,仅限本⼩程序内的页⾯。⽀持带参数,(⽰例index?foo=bar)。该字段不填则模板⽆跳转。
data  模板内容,格式形如{"key1":{"value":any},"key2":{"value":any}}
参数类别参数说明参数值限制说明
thing.DATA 事物 20个以内字符可汉字、数字、字母或符号组合
number.DATA 数字 32位以内数字只能数字,可带⼩数
letter.DATA 字母 32位以内字母只能字母
symbol.DATA 符号 5位以内符号只能符号
character_string.DATA 字符串 32位以内数字、字母或符号可数字、字母或符号组合
time.DATA 时间 24⼩时制时间格式(⽀持+年⽉⽇),⽀持填时间段,两个时间点之间⽤“~”符号连接例如:15:01,或:2019年10⽉1⽇ 15:01
date.DATA ⽇期年⽉⽇格式(⽀持+24⼩时制时间),⽀持填时间段,两个时间点之间⽤“~”符号连接例如:2019年10⽉1⽇,或:2019年10⽉1⽇ 15:01    amount.DATA ⾦额 1个币种符号+10位以内纯数字,可带⼩数,结尾可带“元” 可带⼩数
phone_number.DATA 电话 17位以内,数字、符号电话号码,例:+86-0766-********
car_number.DATA 车牌 8位以内,第⼀位与最后⼀位可为汉字,其余为字母或数字车牌号码:粤A8Z888挂
name.DATA 姓名 10个以内纯汉字或20个以内纯字母或符号中⽂名10个汉字内;纯英⽂名20个字母内;中⽂和字母混合按中⽂名算,10个字内
phrase.DATA 汉字 5个以内汉字 5个以内纯汉字,例如:配送中
基本格式:
姓名: {{name01.DATA}}
⾦额: {{amount01.DATA}}
⾏程: {{thing01.DATA}}
⽇期: {{date01.DATA}}
⽰例:
"data": {
"number01": {
"value": '339208499'
},
"date01": {
"value": '2015年01⽉05⽇'
},
"site01": {
"value": 'TIT创意园'
},
"site02": {
"value": '⼴州市新港中路397号'
}
},
miniprogram_state  跳转⼩程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
lang  "进⼊⼩程序查看"的语⾔类型,⽀持zh_CN(简体中⽂)、en_US(英⽂)、zh_HK(繁体中⽂)、zh_TW(繁体中⽂),默认为zh_CN
接⼝调⽤凭证ACCESS_TOKEN通过如下接⼝获取
GET api.weixin.qq/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
⽅式⼆:云调⽤⽅式
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.subscribeMessage.send({
touser  接收者(⽤户)的openid
template_id  所需下发的订阅模板id
page  点击模板卡⽚后的跳转页⾯,仅限本⼩程序内的页⾯。⽀持带参数,(⽰例index?foo=bar)。该字段不填则模板⽆跳转。
data  模板内容,格式形如{"key1":{"value":any},"key2":{"value":any}}
miniprogram_state  跳转⼩程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
lang  "进⼊⼩程序查看"的语⾔类型,⽀持zh_CN(简体中⽂)、en_US(英⽂)、zh_HK(繁体中⽂)、zh_TW(繁体中⽂),默认为zh_CN
})
return result
} catch (err) {
return err
}
}
(4)服务端接收相关的订阅内容
1.当⽤户触发订阅消息弹框后,⽤户的相关⾏为事件结果会推送⾄开发者所配置的服务器地址。
{
"ToUserName": "gh_123456789abc",
"FromUserName": "o7esq5OI1Uej6Xixw1lA2H7XDVbc",
"CreateTime": "1620973045",
"MsgType": "event",
"Event": "subscribe_msg_popup_event",
"SubscribeMsgPopupEvent": [  {
"TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
"SubscribeStatusString": "accept",
"PopupScene": "0"
}],
}
ToUserName ⼩程序帐号ID
FromUserName⽤户openid
CreateTime 时间戳
TemplateId 模板id(⼀次订阅可能有多个id)
SubscribeStatusString 订阅结果(accept接收,reject拒收)
PopupScene 弹框场景,0代表在⼩程序页⾯内
2.当⽤户在⼿机端服务通知⾥消息卡⽚右上⾓“...”管理消息时,或者在⼩程序设置管理中的订阅消息管理页⾯内管理消息时,相应的⾏为事件会推送⾄开发者所配置的服务器地址。⽬前只推送取消订阅的事件,即对消息设置“拒收”
{
"ToUserName": "gh_123456789abc",
"FromUserName": "o7esq5OI1Uej6Xixw1lA2H7XDVbc",
"CreateTime": "1610968440",
"MsgType": "event",
"Event": "subscribe_msg_change_event",
"SubscribeMsgChangeEvent": [  {
"TemplateId":"BEwX0BOT3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8",
"SubscribeStatusString": "reject"
}],
}
ToUserName ⼩程序帐号ID
FromUserName⽤户openid
CreateTime 时间戳
TemplateId 模板id(⼀次订阅可能有多个id)
SubscribeStatusString 订阅结果(reject拒收)
3.调⽤订阅消息接⼝发送消息给⽤户的最终结果,会推送下发结果事件⾄开发者所配置的服务器地址。
{
"ToUserName": "gh_123456789abc",
"FromUserName": "o7esq5PHRGBQYmeNyfG064wEFVpQ",
"CreateTime": "1620963428",
"MsgType": "event",
"Event": "subscribe_msg_sent_event",
"SubscribeMsgSentEvent": {
"List": {
"TemplateId": "BEwX0BO-T3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8",
"MsgID": "1864323726461255680",
"ErrorCode": "0",
"ErrorStatus": "success"
}
}
}
ToUserName ⼩程序帐号ID
FromUserName⽤户openid
CreateTime 时间戳
TemplateId 模板id(⼀次订阅可能有多个id)
MsgID  消息id(调⽤接⼝时也会返回)
ErrorCode 推送结果状态码(0表⽰成功)
ErrorStatus 推送结果状态码对应的含义
2、统⼀服务消息
为便于开发者对⽤户进⾏服务消息触达,简化⼩程序和模板消息下发流程,⼩程序提供统⼀的服务消息下发接⼝
服务端调⽤:
POST api.weixin.qq/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
请求体参数
access_token|cloudbase_access_token  接⼝调⽤凭证
touser    ⽤户openid,可以是⼩程序的openid,也可以是mp_template_msg.appid对应的的openid
weapp_template_msg  ⼩程序模板消息相关的信息,可以参考⼩程序模板消息接⼝; 有此节点则优先发送⼩程序模板消息(⼩程序模板消息已下线,不⽤传此节点)
template_id ⼩程序模板ID
page  ⼩程序页⾯路径
form_id  ⼩程序模板消息formid
data  ⼩程序模板数据
emphasis_keyword⼩程序模板放⼤关键词
mp_template_msg  模板消息相关的信息,可以参考模板消息接⼝;有此节点并且没有weapp_template_msg节点时,发送模板消息
appid  appid,要求与⼩程序有绑定且同主体
template_id 模板id
url  模板消息所要跳转的url
miniprogram 模板消息所要跳转的⼩程序,⼩程序的必须与具有绑定关系
data  模板消息的数据
接⼝调⽤凭证ACCESS_TOKEN通过如下接⼝获取
GET api.weixin.qq/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
⽰例:
{
"touser":"OPENID",
"weapp_template_msg":{  模板消息可能已经不再需要,未验证
"template_id":"TEMPLATE_ID",
"page":"page/page/index",
"form_id":"FORMID",
"data":{
"keyword1":{
"value":"339208499"
},
"keyword2":{
"value":"2015年01⽉05⽇ 12:30"
},
"keyword3":{
"value":"腾讯总部"
},
"keyword4":{
"value":"⼴州市海珠区新港中路397号"
}
},
"emphasis_keyword":"keyword1.DATA"
},
"mp_template_msg":{
"appid":"APPID ",
"template_id":"TEMPLATE_ID",
"url":"weixin.qq/download",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"data":{
"first":{
"value":"恭喜你购买成功!",
"color":"#173177"
},
"keyword1":{
"value":"巧克⼒",
"color":"#173177"
},
"keyword2":{
"value":"39.8元",
"value":"39.8元",
"color":"#173177"
},
"keyword3":{
"value":"2014年9⽉22⽇",
"color":"#173177"
},
"remark":{
"value":"欢迎再次购买!",
"color":"#173177"
}
}
}
}
云函数⽅式
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.uniformMessage.send({          "touser": 'OPENID',
"weappTemplateMsg": {
"page": 'page/page/index',
"data": {
"keyword1": {
"value": '339208499'
},
"keyword2": {
"value": '2015年01⽉05⽇ 12:30'
},
"keyword3": {
"value": '腾讯总部'
},
"keyword4": {
"value": '⼴州市海珠区新港中路397号'
}
},
"templateId": 'TEMPLATE_ID',
"formId": 'FORMID',
"emphasisKeyword": 'keyword1.DATA'
},
"mpTemplateMsg": {
"appid": 'APPID ',
"url": 'weixin.qq/download',
"miniprogram": {
"appid": 'xiaochengxuappid12345',
"pagepath": 'index?foo=bar'
},
"data": {
"first": {
"value": '恭喜你购买成功!',
"color": '#173177'
},
"keyword1": {
"value": '巧克⼒',
"color": '#173177'
},
"keyword2": {
"value": '39.8元',
"color": '#173177'
},
"keyword3": {
"value": '2014年9⽉22⽇',