>  기사  >  백엔드 개발  >  PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?

PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?

coldplay.xixi
coldplay.xixi원래의
2020-07-27 10:21:142700검색

PHP에서 WeChat 토큰 확인 실패에 대한 해결 방법: 먼저 시스템 환경 변수 [$_SERVER]를 호출하여 HTTP 요청 정보를 확인한 다음 이를 로컬 파일에 쓰고 마지막으로 브라우저 경로로 [url+log.html을 엽니다. WeChat에서 멘션을 클릭하세요.

PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?

PHP에서 WeChat 토큰 확인 실패에 대한 솔루션:

코드에 http 레코드를 추적하는 방법을 추가하여 자체 서버가 요청을 받았지만 응답하지 않았는지 또는 WeChat이 요청을 보내지 않았는지 확인합니다. 아예 요청하지 마세요.
시스템 환경 변수 $_SERVER를 호출하면 HTTP 요청 정보를 볼 수 있으며, 그 중 중요한 두 가지는 $_SERVER,可以查看到HTTP请求的信息,其中两项重要的是

PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?

把其加入代上面的代码中,并且将其写入到本地文件中来,全部代码

<?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);
    }
}
?>

这样,当我们提交之后,就会生成一个log.html文件在当前目录

用浏览器直接打开填写的url,也会写一次文件。

直接用浏览器打开url+log.html路径,我的记录如下:

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:

在微信中点击提交一次,再一次生成记录,如下:

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

从上可以看到,这次IP来自101.226.89.83,是微信的IP,我把这个IP加入到代码中自行判断

现在可以根据下面的来检测自己的问题在哪一个地方

如果没有生成日志:

  那是微信服务器都没有联系到你,需要检查服务器是否可以通过公网访问,URL路径是否存在并且正确。

如果生成了日志:

  如果你生成了日志,有REMOTE_ADDRQUERY_STRING,查看IP是不是来自上海(目前微信服务器部署在上海电信机房,几次故障都说是上海挖路引起的),查看QUERY_STRING

PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?

위 코드에 추가해서 로컬 파일에 쓰면 모두 코드 rrreee인 이렇게 제출하면 현재 디렉터리에 log.html 파일이 생성됩니다

입력한 URL을 브라우저에서 직접 열면 해당 파일도 한 번 작성됩니다. 🎜🎜브라우저에서 직접 url+log.html 경로를 엽니다. 내 기록은 다음과 같습니다. 🎜rrreee🎜WeChat에서 제출을 한 번 클릭하고 다음과 같이 기록을 다시 생성합니다. 🎜rrreee🎜할 수 있습니다. 위에서 보세요 네, 이번에는 위챗의 IP인 101.226.89.83에서 옵니다. 이 IP를 코드에 추가하여 스스로 판단하겠습니다🎜🎜이제 다음을 기반으로 문제가 어디에 있는지 감지할 수 있습니다🎜🎜 로그가 생성되지 않은 경우:🎜🎜 이는 WeChat 서버가 귀하에게 연락하지 않았음을 의미합니다. 공용 네트워크를 통해 서버에 접속할 수 있는지, URL 경로가 존재하고 올바른지 확인해야 합니다. 🎜🎜로그가 생성되는 경우: 🎜🎜 로그를 생성하면 REMOTE_ADDR, QUERY_STRING이 있고 해당 IP가 상하이 출신인지 확인하세요(현재 WeChat 서버가 배포되어 있음) 상하이텔레콤 컴퓨터실에서는 상하이 도로굴착으로 인해 여러번의 장애가 발생했다고 합니다.) QUERY_STRING의 형식이 공식 가이드에 설명된 것과 유사한지 확인하고 문제가 없는지 확인하세요. 먼저 채워진 토큰이 프로그램의 토큰과 일치하는지 확인하여 문제가 있는지 확인하세요. 🎜🎜🎜관련 학습 권장 사항: 🎜초보부터 마스터까지 PHP 프로그래밍🎜🎜🎜

위 내용은 PHP에서 WeChat 토큰 확인이 실패하면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.