3.3.2 配置失败常见问题与分析
提交URL和Token的时候,有时会碰到提交不成功的情况,具体有以下几种。
1.请求URL超时
这种情况一般是由于服务器网速或响应速度太慢。此时可以先重试几次或者等一段时间再试,如果还是这样,则需要考虑更换速度更快、性能更好的服务器。
2.系统发生错误,请稍后重试
这种情况一般是由于微信服务器短时间内的异常引起的,一般重试或者过一段时间尝试即可。
3.Token验证失败
这种情况需要具体分析验证过程被卡在哪一个环节了。此时可以通过调用变量$_SERVER来获取服务器和执行环境信息,以便进行分析。
$_SERVER是一个包含诸如头信息(Header)、路径(Path)及脚本位置(Script Location)等信息的数组。这个数组中的项目由Web服务器创建。若要了解更多关于$_SERVER的信息,可访问官方网站http://www.php.net/manual/zh/reserved.variables.server.php。
这里需要使用以下两个元素。
●$_SERVER['REMOTE_ADDR']:来访者的IP地址,此处为微信服务器的IP地址。
●$_SERVER['QUERY_STRING']:查询请求字符串,此处为微信服务器发过来的GET请求字符串。
将以上两个变量记录到日志中。函数定义如下。
function traceHttp() { $content = date('Y-m-d H:i:s')."\nREMOTE_ADDR:".$_SERVER["REMOTE_ADDR"]."\nQUERY_ STRING:".$_SERVER["QUERY_STRING"]."\n\n"; if(isset($_SERVER['HTTP_APPNAME'])){ //SAE sae_set_display_errors(false); sae_debug(trim($content)); sae_set_display_errors(true); }else { $max_size = 100000; $log_filename = "log.xml"; if(file_exists($log_filename)and(abs(filesize($log_filename))> $max_size)) {unlink($log_filename); } file_put_contents($log_filename, $content, FILE_APPEND); } }
上面代码中,当环境为SAE时,使用SAE的调试函数sae_debug()将内容记录到日志中。而在具有读写权限的空间下,使用file_put_contents()函数把字符串写入文件。
然后在程序的数据处理之前调用该函数,记录信息,代码如下。
define("TOKEN", "weixin"); traceHttp(); $wechatObj = new wechatCallbackapiTest(); if(isset($_GET['echostr'])){ $wechatObj->valid(); }else{ $wechatObj->responseMsg(); }
当提交URL和Token验证的时候,程序目录下应当生成一个log.xml文件。内容类似如下。
2016-10-10 11:03:21 REMOTE_ADDR:101.226.61.144 QUERY_STRING:signature=6e35c6f3d3279338781047dbffd09426b9ecdee3&echostr=5979420653038092664×tamp=1392001400&nonce=1392192345
下面可以得出初步结论。
没有生成日志文件:微信服务器没有访问到你的服务器,需要先检查你的服务器是否可以通过公网访问,以及URL路径是否正确并且可以访问。如果可以通过公网访问,而微信服务器不能访问,那么可能是防火墙拦截了80端口或微信服务器的IP地址,也可能是服务器所在区域与微信服务器通信不畅,需要更换服务器。
已经生成日志文件:查看REMOTE_ADDR和QUERY_STRING的内容是否与上述类似。确认signature、timestamp、nonce、echostr等4个参数都有值。如果这些都没有问题,则检查程序中定义的Token值是否与提交的一致,再检查程序流程及数据处理是否与官方文档描述的一致。
如果确定以上均没有问题,可以使用下面章节中的微信调试器进行测试,它提供了更为宽松的校验方式,并且可以实时输出当前的XML数据供调试时参考。