• 微信小程序之消息推送配置(token验证失败的解决方案)


    背景:微信小程序开发,准备使用模板消息做些事情,但是发现需要先在微信公众平台的开发——开发设置——消息推送做配置,然后我们后台人员就开始各种配置,但是一到验证token就报错,很是郁闷,然后各种排查,发现了最终原因,过程和代码如下:

    很多网站给出的服务器代码如下:

    //检查签名

    /**
    * 验证消息推送

    */
    public function checkSignature()
    {
      $signature = $_GET["signature"];
      $timestamp = $_GET["timestamp"];
      $nonce = $_GET["nonce"];

      $token = 'ziqin';
      $tmpArr = array($token, $timestamp, $nonce);
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr );
      $tmpStr = sha1( $tmpStr );

      if ($tmpStr == $signature ) {
        echo $_GET["echostr"];
      } else {
        echo false;
      }
    }

     以上代码看上去没问题,后台查看日志也是可以对应上的,但是一旦提交还是token校验失败,后台各种查资料,最终发现需要使用ob_clean();最终代码如下:

    (在输出“echostr”前,清空缓存区,即在echo 前放置“ob_clean();”代码。

    官方解释:ob_clean()  此函数用来丢弃输出缓冲区中的内容;)

    //检查签名

    /**
    * 验证消息推送
    *
    */
    public function checkSignature()
    {
      $signature = $_GET["signature"];
      $timestamp = $_GET["timestamp"];
      $nonce = $_GET["nonce"];

      $token = 'ziqin';
      $tmpArr = array($token, $timestamp, $nonce);
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr );
      $tmpStr = sha1( $tmpStr );

      if ($tmpStr == $signature ) {
        ob_clean();
        echo $_GET["echostr"];
      } else {
        echo false;
      }
    }

    以上是正确配置方式!

    微信官方对token校验的说明为:开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下: 1、将token、timestamp、nonce三个参数进行字典序排序 2、将三个参数字符串拼接成一个字符串进行sha1加密 3、开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。

  • 相关阅读:
    2040 打开所有的灯
    1323 删数问题(加强版)
    1087 FBI树
    1030 求先序排列
    1743 矩阵Ⅲ
    svn更新时,出现不知道这样的主机的解决方案
    用jquery或js获取select标签中选中的option值及文本
    html页面中的button按钮会自动提交form表单的问题以及解决方案
    localStorage与sessionStorage的使用和区别
    命令行mvn打包
  • 原文地址:https://www.cnblogs.com/zmdComeOn/p/13064722.html
Copyright © 2020-2023  润新知