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&timestamp=1392001400&nonce=1392192345

下面可以得出初步结论。

没有生成日志文件:微信服务器没有访问到你的服务器,需要先检查你的服务器是否可以通过公网访问,以及URL路径是否正确并且可以访问。如果可以通过公网访问,而微信服务器不能访问,那么可能是防火墙拦截了80端口或微信服务器的IP地址,也可能是服务器所在区域与微信服务器通信不畅,需要更换服务器。

已经生成日志文件:查看REMOTE_ADDR和QUERY_STRING的内容是否与上述类似。确认signature、timestamp、nonce、echostr等4个参数都有值。如果这些都没有问题,则检查程序中定义的Token值是否与提交的一致,再检查程序流程及数据处理是否与官方文档描述的一致。

如果确定以上均没有问题,可以使用下面章节中的微信调试器进行测试,它提供了更为宽松的校验方式,并且可以实时输出当前的XML数据供调试时参考。