最近在研究用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" . "\r\n";
} */ // 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;
}
}
} ?>

最新文章

  1. 什么是 JSON ?
  2. cc表示Cocos核心,ccs代表CocoStudio,ccui代表CocoStudio的UI控件
  3. 网站提供的下载IE8很慢 由于Microsoft 联机服务暂时不可用,SmartScreen筛选器无法检查此网站。
  4. Intellisense for Xrm.Page in CRM 2011
  5. Extjs关于FormPanel布局
  6. jdk1.8.0_101/bin下各文件解释
  7. C++ Prime:预处理器
  8. Hive学习之三 《Hive的表的详解和应用案例详解》
  9. HDU 5792 World is Exploding
  10. 配置php中的Oracle扩展
  11. 1.2 eclipse使用 :working set
  12. 设计APP时我们该怎么做
  13. SpringBoot入门教程(十七)@Service、@Controller、@Repository、@Component
  14. Time travel HDU - 4418(高斯消元)
  15. Yarn 组件的指挥部 – 调度器Scheduler
  16. Java集合类框架的最佳实践有哪些?
  17. 关于CMD的一些小技巧
  18. Qt5中运行后台网络读取线程与主UI线程互交
  19. 10 个非常有用的 SVG 动画的 JavaScript 库
  20. MySQL 四种链接

热门文章

  1. IDEA使用笔记(八)——自动生成 serialVersionUID 的设置
  2. springboot1.5.4 log4j
  3. appium 获取android 粘贴板上的内容
  4. MySQL在线删除多余的binlog文件
  5. 0x02 Spring Cloud 学习文档
  6. 每日英语:How To Survive The Windows XPiration Date
  7. Zookeeper之Zookeeper底层客户端架构实现原理(转载)
  8. Vue中使用ECharts画散点图加均值线与阴影区域
  9. Hadoop 2.x 安装常见问题FAQ(一) NodeManager 无法启动问题解决
  10. Android Launcher分析和修改7——AllApp全部应用列表(AppsCustomizeTabHost)