微信小程序模板消息填坑记录

mp-notice.png

最近项目上用到了微信小程序的模板消息功能,但是在接入的过程当中遇到了个 form_id 的坑,微信文档里并没有详细的描述这一块儿的内容,所以在这里做一下记录,希望看到这篇文章的开发者们不要踩坑。

这个是发送模板消息的接口,一个 POST 请求

https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
WX20180827-153242.png

需要给他传递4个必填参数,其中 form_id参数较为特殊,需要通过微信小程序端表单提交组件来获取这个 form_id 如果是支付后发送模板消息的话,那就用支付后得到的 prepay_id 就可以了。

我这里的做法是将一个按钮改成了表单提交的方式,同时也绑定了自己的点击事件业务逻辑。这样就可以做到静默获取 form_id ,省去了一些交互步骤。

<form bindsubmit="submitInfo" report-submit='true' >
     <button class='start_button' bindtap='start' form-type="submit">立即开始</button>
</form>

注意 report-submit要设置成 true才可以获取到form_id

这样就可以在 js 里的 submitInfo 方法中通过 e.detail.formId 获取, 然后传递到服务端保存到数据库。

submitInfo: function(e){
    console.log("formId",e.detail.formId);
}

注意 formId 有效期是 7 天,而且每次获取的 formId 只可以用于发送【一次】模板消息。另外,模拟器是获取不到 formId 的,模拟器获取会报错 the formId is a mock one 只有在真机中才可以获取到。而且,安卓和IOS获取到的 formId 长度有差异。安卓类似这样 1535357741912 IOS类似这样 b44a8191a2254759d51552f11bc27100

PHP端发送模板消息最好用我下面这样的方式提交POST请求

  //$url  是请求地址
  //$data  是json字符串
  //发送模版消息
  private function httpRequest($url, $data = null)
  {
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

      if (!empty ($data)) {
          curl_setopt($curl, CURLOPT_POST, 1);
          curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
      }
      curl_setopt($curl, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json; charset=utf-8',
          'Content-Length: ' . strlen($data)
      ));
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      $output = curl_exec($curl);
      curl_close($curl);
      return $output;
  }

开发过程中还遇到了某些情况取不到formId的问题,在微信开放社区提问后得到解决。帖子地址

https://developers.weixin.qq.com/community/develop/doc/00004c7a7d05b8f98747df72b56000

推荐阅读更多精彩内容