• 微信token验证失败的几种情况


    最近在研究用PHP做微信开发的时候,“修改配置时”,总是遇到token验证失败的提示。历经一番查找,种种输出日志和echo,发现,如果不echo调试信息,也不写日志,就不需要ob_clean(),如果一旦启用了输出或者写日志文件,那么在最后的echo结果前,一定要调用ob_clean(),否则就会调用失败。

    经测试,以下三种情况都会遇到相同的问题。

    真想知道,如果使用了输出缓冲而不用ob_clean()清理的话,腾讯那边接收到的东西是什么,为什么会导致失败。

    情况一:

    <?php
          //$file  = 'log.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个
          
          //file_put_contents($file, "---开始日志---" . PHP_EOL, FILE_APPEND);
          //file_put_contents($file, date('Y-m-d H:i:s',time()) . PHP_EOL, FILE_APPEND);      
        
          //$ip = $_SERVER["REMOTE_ADDR"];
          //file_put_contents($file, "ip:" . $ip . PHP_EOL,FILE_APPEND);
          //echo $ip;
          
          //$querystring = $_SERVER["QUERY_STRING"];
          //file_put_contents($file, "querystring:" . $querystring . PHP_EOL,FILE_APPEND);
          
          // 微信token认证
          
          $signature = $_GET["signature"];
          //file_put_contents($file, "signature:" . $signature . PHP_EOL,FILE_APPEND);
          
          $timestamp = $_GET["timestamp"];
          //file_put_contents($file,"timestamp:" . $timestamp . PHP_EOL,FILE_APPEND);
          
          $nonce = $_GET["nonce"];
          //file_put_contents($file, "nonce:".$nonce . PHP_EOL,FILE_APPEND);
          
          $echoStr = $_GET["echostr"];
          //file_put_contents($file, "echostr:" . $echoStr . PHP_EOL,FILE_APPEND);
          
          // 你的设置Token
          $token = "sabre";
       
    
          // 1)将token、timestamp、nonce三个参数进行字典序排序
          $tmpArr = array($token,$timestamp,$nonce);
          sort($tmpArr);
    
          // 2)将三个参数字符串拼接成一个字符串进行sha1加密
          $str = implode($tmpArr);
          $sign = sha1($str);
          
          //file_put_contents($file, "sign:" . $sign . PHP_EOL,FILE_APPEND);
          //file_put_contents($file, "signature:" . $signature . PHP_EOL,FILE_APPEND);
          
         /*if($data = file_get_contents($file)){; // 这个函数支持版本(PHP 4 >= 4.3.0, PHP 5) 
          echo "写入文件的内容是:$data" . "
    ";
         }    */        
    
          // 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
          //file_put_contents($file, "signature长度 :" . strlen($signature) . PHP_EOL,FILE_APPEND);
          //file_put_contents($file, "sign长度:" . strlen($sign) . PHP_EOL,FILE_APPEND);
          if ($sign == $signature) {
           //echo $echostr;
            //return true ;
            //ob_clean();
            //file_put_contents($file, "echoStr:" . $echoStr . PHP_EOL,FILE_APPEND);
            echo $echoStr;
          }
    ?>

    情况二,不带日志,相对简洁一些的

    <?php
            //echo "测试页面3";
          // 微信token认证
          $signature = $_GET["signature"];
          $timestamp = $_GET["timestamp"];
          $nonce = $_GET["nonce"];
          $echoStr = $_GET["echostr"];
          // 你的设置Token
              $token = "sabre";
          
              
          // 1)将token、timestamp、nonce三个参数进行字典序排序
          $tmpArr = array($token,$timestamp,$nonce);
          sort($tmpArr);
    
          // 2)将三个参数字符串拼接成一个字符串进行sha1加密
          $str = implode($tmpArr);
          $sign = sha1($str);
    
          // 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
          if ($sign == $signature) {
              //ob_clean();
            echo $echoStr;
          }
    ?>

    情况三,方倍工作室的版本的简化版,仅保留了token验证部分

    <?php
    /*
        方倍工作室 http://www.cnblogs.com/txw1958/
        CopyRight 2013 www.doucube.com  All Rights Reserved
    */
    //traceHttp();
    echo "测试";
    define("TOKEN", "sabre");
    $wechatObj = new wechatCallbackapiTest();
     
        $wechatObj->valid();
     
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()){
                ob_clean();
                echo $echoStr;
                exit;
            }
        }
    
        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
    
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    }
    
    
    ?>
  • 相关阅读:
    npm install报错Error: ENOENT
    hibernate hql
    mysql授权
    撤销git reset soft head操作
    nodejs&npm等概念梳理
    Java类中中文问题
    采用MANIFEST.MF之jar报错ClassNotFoundException解法
    EChart和G2比较
    牛客OI测试赛1
    Codeforces Round #340 (Div.2)
  • 原文地址:https://www.cnblogs.com/Sabre/p/8625744.html
Copyright © 2020-2023  润新知