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

微信token验证失败的几种情况的更多相关文章

  1. 微信token验证失败的解决方法

    一.问题由来 在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况 1. token校验失败 这样回头检查一下各项配置是否正确.如果确定配置没有问题,请按下面的方法检 ...

  2. php:微信公众号token验证失败原因、验证码显示不出来的问题

    ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ...

  3. 微信公众平台Token验证失败的解决办法

    微信公众平台Token验证失败的解决办法 1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen ...

  4. 微信公众号token验证失败的一些总结

    这几天准备弄一个微信公众号,在进行服务器配置的时候出现总是出现token验证失败的报错. 实际上,这个问题很好解决.既然微信平台没有给我们很明确的报错提示,那么我们就可以通过跟踪获取到的请求参数进行分 ...

  5. java微信公众号开发token验证失败的问题及解决办法

    本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示to ...

  6. 微信公众号 报token验证失败

    最近两天一直碰到token验证失败的问题,如下图所示 然后上网疯狂的搜索答案,碰到的人还真不少,原因大概有这几个: 1)服务器URL未实名认证 2)token重名(基本不可能) 3)服务器部署的项目 ...

  7. 微信公众号token验证失败

    我用的是python3+,而官网给的例子是python2的写法.问题就在python版本不同. 下面是截取官方的实例代码的一部分 list = [token, timestamp, nonce] li ...

  8. Token验证失败

    Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ...

  9. Token验证失败的解决方法

    Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ...

随机推荐

  1. [转]css实现左侧宽度自适应,右侧固定宽度

    原文地址:https://segmentfault.com/a/1190000008411418 页面布局中经常用会遇到左侧宽度自适应,右侧固定宽度,或者左侧宽度固定,右侧自适应.总之就是一边固定宽度 ...

  2. 如何停止和禁用Linux系统中的不需要的服务

    从Linux中删除不需要的服务 在本文中,我们将讨论一些您不需要的不需要的应用程序和服务,但它们是在操作系统安装期间默认安装的,并且不知不觉地开始吃您的系统资源. 让我们首先知道使用以下命令在系统上运 ...

  3. 嵌入式开发之UDP 丢包--- UDP 丢包控制方法

    0. 发送端可以,发送五次左右,再Sleep 1.调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修改接收 ...

  4. Erlang的gen_server的terminate()/2未执行

    官方资料参考: Module:terminate(Reason, State) Types: Reason = normal | shutdown | {shutdown,term()} | term ...

  5. Linux 目录结构_004

    前言 Linux文件系统层次标准,英文全称Filesystem Hierarchy Standard,英文简称FHS. 由于利用Linux来开发产品的团队和个人实在太多了,如果每个人都以自己的想法来配 ...

  6. DedeCMS中channelartlist自增参数global.itemindex

    在 dede:channelartlist 标签下,使用: {dede:global.itemindex runphp='yes'} {/dede:global.itemindex} dede:cha ...

  7. [Bayes] KL Divergence & Evidence Lower Bound

    L lower是什么? L lower, 既然大于,那么多出来的这部分是什么?如下推导: 得出了KL的概念,同时也自然地引出了latent variable q.

  8. [Tensorflow] Cookbook - CNN

    Convolutional Neural Networks (CNNs) are responsible for the major breakthroughs in image recognitio ...

  9. [React] 12 - Redux: async & middleware

    Ref: Redux 入门教程(二):中间件与异步操作 这里只是简单地了解中间件的概念,对于异步,貌似之后要讲的saga更胜一筹. reducer计算新状态的策略: Action 发出以后,Reduc ...

  10. HighCharts-动态配置csv格式数据

    场景: 开发一个大型热力图.官网示例中只有设置静态csv数据的例子.一直没有找到如何给热力图加载动态数据. 无奈,只好把要加载的数据拼接成csv格式后,供热力图加载. 拼接数据js:(dataArr是 ...