zoukankan      html  css  js  c++  java
  • 微信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;
            }
        }
    }
    
    
    ?>
  • 相关阅读:
    word设置的密码忘了怎么办?
    Navicat Report Viewer 设置 HTTP 的方法
    如何处理Navicat Report Viewer 报表
    excel密码忘记了怎么办
    Beyond Compare文本比较搜索功能详解
    Popular Cows POJ
    Problem B. Harvest of Apples HDU
    网络流模型整理
    The Shortest Statement CodeForces
    Vasya and Multisets CodeForces
  • 原文地址:https://www.cnblogs.com/Sabre/p/8625744.html
Copyright © 2011-2022 走看看