Heim > Artikel > Backend-Entwicklung > Was soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?
Lösung für das Scheitern der WeChat-Token-Verifizierung unter PHP: Rufen Sie zuerst die Systemumgebungsvariable [$_SERVER] auf, um die HTTP-Anforderungsinformationen anzuzeigen, und schreiben Sie sie dann in eine lokale Datei und öffnen Sie [url] mit einem Browser log.html] Pfad; klicken Sie abschließend auf Erwähnung in WeChat.
Lösung für den WeChat-Token-Überprüfungsfehler unter PHP:
Wir fügen eine Methode zum Verfolgen von http-Datensätzen im Code hinzu Überprüfen wir, ob unser eigener Server die Anfrage empfangen und nicht geantwortet hat oder ob WeChat die Anfrage überhaupt nicht gesendet hat.
Durch Aufrufen der Systemumgebungsvariablen $_SERVER
können Sie die HTTP-Anforderungsinformationen
anzeigen und zum obigen Code hinzufügen es in eine lokale Datei, den gesamten Code
<?php /* php中文网 https://www.php.cn/ CopyRight 2013 www.doucube.com All Rights Reserved */ traceHttp(); define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } 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); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if($keyword == "?" || $keyword == "?") { $msgType = "text"; $contentStr = date("Y-m-d H:i:s",time()); $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } }else{ echo ""; exit; } } } function traceHttp() { logger("\n\nREMOTE_ADDR:".$_SERVER["REMOTE_ADDR"].(strstr($_SERVER["REMOTE_ADDR"],'101.226')? " FROM WeiXin": "Unknown IP")); logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]); } function logger($log_content) { if(isset($_SERVER['HTTP_APPNAME'])){ //SAE sae_set_display_errors(false); sae_debug($log_content); sae_set_display_errors(true); }else{ //LOCAL $max_size = 500000; $log_filename = "log.xml"; if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);} file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND); } } ?>
Auf diese Weise wird beim Absenden eine log.html
-Datei im aktuellen Verzeichnis
generiert und kann direkt mit einem Browser geöffnet werden auszufüllen Die URL wird ebenfalls einmal in die Datei geschrieben.
Öffnen Sie den url+log.html
-Pfad direkt mit einem Browser. Mein Datensatz lautet wie folgt:
2013-01-30 10:15:18 2013-01-30 10:15:18 REMOTE_ADDR:212.179.24.103 Unknown IP 2013-01-30 10:15:18 QUERY_STRING:
Klicken Sie einmal in WeChat und generieren Sie den Datensatz erneut, wie folgt:
2013-01-30 10:15:49 2013-01-30 10:15:49 REMOTE_ADDR:101.226.89.83 From WeiXin 2013-01-30 10:15:49 QUERY_STRING:signature=eded789463180edf6c13691398d0cb4c85fb0e23&echostr=5838479218127813673×tamp=1359100969&nonce=1359376876
Von Wie Sie oben sehen können, stammt die IP dieses Mal von 101.226.89.83, der IP von WeChat. Ich habe diese IP zum Code hinzugefügt, um selbst zu beurteilen
Jetzt können Sie Folgendes zur Erkennung verwenden wo Ihr Problem liegt
Wenn kein Protokoll generiert wird:
Das bedeutet, dass der WeChat-Server Sie nicht kontaktiert hat. Sie müssen prüfen, ob der Server über das öffentliche Netzwerk erreichbar ist und ob der Der URL-Pfad existiert und ist korrekt.
Wenn Sie ein Protokoll erstellen:
Wenn Sie ein Protokoll mit REMOTE_ADDR
und QUERY_STRING
erstellen, prüfen Sie, ob die IP aus Shanghai stammt (derzeit ist der WeChat-Server bei Shanghai Telecom im Einsatz). Computerraum, mehrmals Der Fehler soll durch Straßenausgrabungen in Shanghai verursacht worden sein. Überprüfen Sie, ob das QUERY_STRING
-Format dem im offiziellen Leitfaden beschriebenen ähnelt. Überprüfen Sie zunächst, ob das ausgefüllte Token vorhanden ist mit dem im Programm übereinstimmt, und prüfen Sie dann, ob ein Problem mit dem Programm vorliegt.
Verwandte Lernempfehlungen: PHP-Programmierung vom Einstieg bis zur Beherrschung
Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!