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

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

功能介绍:

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

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

开发步骤:

一、获取模板 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.getSetting 判断是否已获取订阅权限不仅没有 “软” 用,还会在后续造成逻辑上不能再获取订阅权限的 bug,所以可以根据需求去掉这样的判断逻辑,当然这样就会影响用户的体验(一直都需要申请授权)。

2、订阅消息模板内容

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

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

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

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