因为小程序相关功能的升级,模板消息已改为订阅消息,
在这篇文章中我们简单介绍一下订阅消息,
如今进行订阅消息的开发,以及在开发中的注意事项。
消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。
在微信公众平台开通订阅消息服务,手动配置获取模板 ID:
登录 https://mp.weixin.qq.com ,公共模板库选择模板,
如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
详见小程序端消息订阅接口 wx.requestSubscribeMessage
类似于用户授权,可使用 getSetting 获取用户相关模板消息的订阅状态,
需要用户点击 “总是允许”,才有具体的已订阅模板记录返回。
获取订阅状态,与调起订阅页面相关代码:
subscribe: function () {
// 获取用户对相关模板消息的订阅状态
wx.getSetting({
withSubscriptions: true,
success(res) {
var sub = res.subscriptionsSetting
if (typeof sub.itemSettings != 'undefined' && (sub.itemSettings['模板ID1'] == 'accept' || sub.itemSettings['模板ID1'] == 'reject')) {
// 已获取相关授权
} else{
// 调起客户端小程序订阅消息界面
wx.requestSubscribeMessage({
tmplIds: ['模板ID1', '模板ID2'],
success(res) {
// 订阅后相关操作
}
})
}
}
})
}
具体 wx.getSetting
与 wx.requestSubscribeMessage
请阅读官方手册。
详见服务端消息发送接口 subscribeMessage.send
/**
* [sendTemplateMessage 发送模板消息]
* @param string $openid [用户OPENID]
* @param string $form_id [表单提交场景]
* @param array $data [消息内容]
* @param string $template_id [模板ID]
* @return [type] [description]
*/
function sendTemplateMessage($openid, $data=[], $page='pages/index/index', $template_id='模板ID1')
{
// $data = array('name1'=>'姓名', 'thing2'=>'内容', 'time3'=>date('Y-m-d'));
$keyword = [];
// 以下循环可去掉,直接使用传递过来的 $data 数据
foreach ($data as $k => $v) {
// (注意:$key为拼接字段类型,可在模板ID详情中具体查看)
$key = 'thing';
$keyword[$key.($k+1)] = array('value'=>$v);
}
// dump($keyword);die;
$getAccessTokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=小程序appid&secret=小程序secret';
$rs = json_decode(httpRequest($getAccessTokenUrl), true);
if (!empty($rs['access_token'])) {
$postUrl = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token='.$rs['access_token'];
$post_data = array(
'access_token' => $rs['access_token'],
'touser' => $openid, // 用户openid
'template_id' => $template_id, // 消息模板ID
'page' => $page, // 小程序跳转页面
'data' => $keyword, // 模板内容(注意格式问题)
);
$re = httpRequest($postUrl, 'POST', json_encode($post_data));
return json_decode($re, true);
}
return false;
}
httpRequest 为封装的CURL请求
(重要:注意模板详细内容中的拼接字段,具体拼接数据请点击模板详情查看)
一次性订阅
选择模板的类型是 一次性订阅模板
,
用户自主订阅后,开发者可不限时间地下发一条对应的服务消息。
用户勾选 “总是保持以上选择,不再询问
” 之后,
下次订阅调用 wx.requestSubscribeMessage 不会弹窗,
保持之前的选择,修改选择需要打开小程序设置进行修改。
长期订阅
选择模板的类型是 永久模板
,
目前长期性订阅消息仅向政务民生
、医疗
、交通
、金融
、教育
等线下公共服务开放,
后期将逐步支持到其他线下公共服务业务。
因微信小程序接口不稳定,改动比较大且频繁。
订阅消息服务端接口除了请求地址变化以外,作为模板内容的 data 参数也要做适配修改。
在小程序中 先用 wx.getSetting
判断权限,再调用用户授权窗口,
这时 小程序设置中,始终没有相关权限信息,因为始终没有调起授权,
我们要先调起授权,无论是否允许,这是相关权限才会出现在小程序设置中。
在微信小程序文档的帖子里看到很多人提到这个问题,知道原因的比较少还讲不清楚。其实这就是上面提到的订阅消息一次性造成的。每次后台想要发送订阅消息,都得要小程序前端向用户发出申请。一次订阅,一次发送,点了 “总是允许” 也没有 “软” 用。前端根据 wx.getSetting 判断是否已获取订阅权限不仅没有 “软” 用,还会在后续造成逻辑上不能再获取订阅权限的 bug,所以可以根据需求去掉这样的判断逻辑,当然这样就会影响用户的体验(一直都需要申请授权)。
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论