PHP에서 WeChat 토큰 확인 실패에 대한 해결 방법: 먼저 시스템 환경 변수 [$_SERVER]를 호출하여 HTTP 요청 정보를 확인한 다음 이를 로컬 파일에 쓰고 마지막으로 브라우저 경로로 [url+log.html을 엽니다. WeChat에서 멘션을 클릭하세요.
PHP에서 WeChat 토큰 확인 실패에 대한 솔루션:
코드에 http 레코드를 추적하는 방법을 추가하여 자체 서버가 요청을 받았지만 응답하지 않았는지 또는 WeChat이 요청을 보내지 않았는지 확인합니다. 아예 요청하지 마세요.
시스템 환경 변수 $_SERVER
를 호출하면 HTTP 요청 정보를 볼 수 있으며, 그 중 중요한 두 가지는 $_SERVER
,可以查看到HTTP请求的信息,其中两项重要的是
把其加入代上面的代码中,并且将其写入到本地文件中来,全部代码
<?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); } } ?>
这样,当我们提交之后,就会生成一个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_ADDR
和QUERY_STRING
,查看IP是不是来自上海(目前微信服务器部署在上海电信机房,几次故障都说是上海挖路引起的),查看QUERY_STRING
입력한 URL을 브라우저에서 직접 열면 해당 파일도 한 번 작성됩니다. 🎜🎜브라우저에서 직접위 코드에 추가해서 로컬 파일에 쓰면 모두 코드 rrreee인 이렇게 제출하면 현재 디렉터리에
log.html
파일이 생성됩니다
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!