最近在研究用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; } } } ?>