微信小程序订阅消息(服务通知)

因为小程序相关功能的升级,模板消息已改为订阅消息,
在这篇文章中我们简单介绍一下订阅消息,
如今进行订阅消息的开发,以及在开发中的注意事项。

功能介绍:

消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。

  • 订阅消息推送位置:服务通知
  • 订阅消息下发条件:用户自主订阅
  • 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面

开发步骤:

一、获取模板 ID

在微信公众平台开通订阅消息服务,手动配置获取模板 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.getSettingwx.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请求

(重要:注意模板详细内容中的拼接字段,具体拼接数据请点击模板详情查看) 冯奎博客

相关注意事项以及坑(扩展阅读

1、一次性订阅

一次性订阅 选择模板的类型是 一次性订阅模板
用户自主订阅后,开发者可不限时间地下发一条对应的服务消息。
用户勾选 “总是保持以上选择,不再询问” 之后,
下次订阅调用 wx.requestSubscribeMessage 不会弹窗,
保持之前的选择,修改选择需要打开小程序设置进行修改。

2、长期订阅

长期订阅 选择模板的类型是 永久模板
目前长期性订阅消息仅向政务民生医疗交通金融教育等线下公共服务开放,
后期将逐步支持到其他线下公共服务业务。

3、订阅消息模板内容

因微信小程序接口不稳定,改动比较大且频繁。
订阅消息服务端接口除了请求地址变化以外,作为模板内容的 data 参数也要做适配修改。

4、遇到问题

  • 在小程序中 先用 wx.getSetting 判断权限,再调用用户授权窗口, 这时 小程序设置中,始终没有相关权限信息,因为始终没有调起授权, 我们要先调起授权,无论是否允许,这是相关权限才会出现在小程序设置中。

  • 在微信小程序文档的帖子里看到很多人提到这个问题,知道原因的比较少还讲不清楚。其实这就是上面提到的订阅消息一次性造成的。每次后台想要发送订阅消息,都得要小程序前端向用户发出申请。一次订阅,一次发送,点了 “总是允许” 也没有 “软” 用。前端根据 wx.getSetting 判断是否已获取订阅权限不仅没有 “软” 用,还会在后续造成逻辑上不能再获取订阅权限的 bug,所以可以根据需求去掉这样的判断逻辑,当然这样就会影响用户的体验(一直都需要申请授权)。

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共1条评论
冯奎博客

缺氧 冯奎博客mark 正好要将模板消息改为订阅消息

2020-07-19 22:43:23 回复