讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 3.3.2 配置失敗常見問題與分析 >

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

下面可以得出初步結論。

沒有生成日誌文件:微信服務器沒有訪問到你的服務器,需要先檢查你的服務器是否可以通過公網訪問,以及URL路徑是否正確並且可以訪問。如果可以通過公網訪問,而微信服務器不能訪問,那麼可能是防火牆攔截了80端口或微信服務器的IP地址,也可能是服務器所在區域與微信服務器通信不暢,需要更換服務器。

已經生成日誌文件:查看REMOTE_ADDR和QUERY_STRING的內容是否與上述類似。確認signature、timestamp、nonce、echostr等4個參數都有值。如果這些都沒有問題,則檢查程序中定義的Token值是否與提交的一致,再檢查程序流程及數據處理是否與官方文檔描述的一致。

如果確定以上均沒有問題,可以使用下面章節中的微信調試器進行測試,它提供了更為寬鬆的校驗方式,並且可以實時輸出當前的XML數據供調試時參考。