Heim  >  Artikel  >  Backend-Entwicklung  >  Was soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?

Was soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?

coldplay.xixi
coldplay.xixiOriginal
2020-07-27 10:21:142701Durchsuche

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.

Was soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?

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

Was soll ich tun, wenn die WeChat-Token-Verifizierung unter PHP fehlschlägt?

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[&#39;echostr&#39;])) {
    $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, &#39;SimpleXMLElement&#39;, 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"],&#39;101.226&#39;)? " FROM WeiXin": "Unknown IP"));
    logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]);
}
function logger($log_content)
{
    if(isset($_SERVER[&#39;HTTP_APPNAME&#39;])){   //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(&#39;Y-m-d H:i:s&#39;).$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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn