本系统教程以微信公众平台应用天气神(账号WeatherGod,支持国内近400个城市天气的名称、拼音、区号、邮编以及语音触发模式查询)为例,讲解微信接口开发过程。欢迎大家关注该账号并使用语音方式查询当地天气,二维码见底部。
本文是微信公众平台消息接口开发(1)启用接口 的下部分
三、服务器没有响应Token验证的解决方法
1. 技术分析法
这次我们在代码里面加入跟踪http记录的方法来查看我们自己的服务器收到了请求没有回应,还是微信根本没有发请求过来。
通过调用系统环境变量$_SERVER,可以查看到HTTP请求的信息,其中两项重要的是
$_SERVER["REMOTE_ADDR"] //记录来访者的IP,我们记录微信服务器是否访问过$_SERVER["QUERY_STRING"] //查询请求字符串
把其加入代上面的代码中,并且将其写入到本地文件中来,全部代码如下:
phpdefine("TOKEN", "天气神");date_default_timezone_set('Asia/Hong_Kong'); traceHttp();$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; //随机字符串 if($this->checkSignature()){ echo $echoStr; exit; } } private function checkSignature() { $signature = $_GET["signature"]; //微信加密签名 $timestamp = $_GET["timestamp"]; //时间戳 $nonce = $_GET["nonce"]; //随机数 $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); //sha1加密后与签名对比 if( sha1(implode($tmpArr)) == $signature ){ return true; }else{ return false; } }}function traceHttp(){ logger(""); logger("REMOTE_ADDR:".$_SERVER["REMOTE_ADDR"].((strpos($_SERVER["REMOTE_ADDR"], "101.226"))?" From WeiXin":" Unknown IP")); logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]);}function logger($content){ file_put_contents("log.html", date('Y-m-d H:i:s ').$content."
", FILE_APPEND);}?>
这样,当我们提交之后,就会生成一个log.html文件在当前目录
用浏览器直接打开填写的url,也会写一次文件。
直接用浏览器打开url+log.html路径,我的记录如下:
2013-01-30 10:15:18 2013-01-30 10:15:18 REMOTE_ADDR:212.179.24.103 Unknown IP2013-01-30 10:15:18 QUERY_STRING:
在微信中点击提交一次,再一次生成记录,如下:
2013-01-30 10:15:49 2013-01-30 10:15:49 REMOTE_ADDR:101.226.89.83 From WeiXin2013-01-30 10:15:49 QUERY_STRING:signature=eded789463180edf6c13691398d0cb4c85fb0e23&echostr=5838479218127813673×tamp=1359100969&nonce=1359376876
从上可以看到,这次IP来自101.226.89.83,是微信的IP,我把这个IP加入到代码中自行判断了
另外它的查询请求和官方指南中描述的一致,所以可以确定,微信把消息提交到服务器中了。提交应该成功。如果不成功,原因在于自己这边。
2. 万能成功法
如果你用上面的白方法还没提交成功,被接口启用问题已经折腾了N次,心灰意冷,打算退出微信接口开发,那你一定要再多看一眼下面的万能方法。
再看一下验证部分的源代码
$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; //随机字符串 if($this->checkSignature()){ echo $echoStr; exit; } }
其实就调用一下valid()函数,在valid()函函数中检查签名,如果签名成功,就应答echoStr。
如果我们跳过这个签名呢......
public function valid() { $echoStr = $_GET["echostr"]; if(true){ echo $echoStr; exit; } }
经过试验,提交也成功。证明也是可行的。但是。。。。
好像,这后面存在着微信一个很大的漏洞,很大很大,可能是无穷大!!!
原文地址:http://www.cnblogs.com/txw1958/archive/2013/01/31/weixin-if2-enable.html
---------------------------------------------------------------------------------------------------------
关注天气神(账号WeatherGod)方法:
1. 依次进入以下路径:朋友们—>添加朋友—>搜号码,输入WeatherGod,不区分大小写,点击查找,然后点击关注。