1. 程式人生 > >微信公眾號token驗證成功,但是自動回覆沒反應 / 該公眾號服務故障

微信公眾號token驗證成功,但是自動回覆沒反應 / 該公眾號服務故障

微信公眾號token驗證成功,但是自動回覆沒反應 / 該公眾號服務故障
微信公眾號token驗證成功,但是自動回覆沒反應 / 該公眾號服務故障
微信公眾號token驗證成功,但是自動回覆沒反應 / 該公眾號服務故障

先上程式碼,輸入?自動回覆時間

<?php
header('Content-type:text');
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"; $content = date("Y-m-d H:i:s",time()); $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content); echo $result; } }else{ echo ""; exit; } } } ?>
原因: $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 獲取不到值,為空的
  • 1.用file_get_contents('php://input') 替換 $GLOBALS["HTTP_RAW_POST_DATA"];來獲取資料測試,如果正常,說明確實是因為上面沒獲取到值導致的錯誤;如果還是獲取不到,則可能是資料傳輸錯誤

  • 2.如果上面的file_get_contents('php://input') 能正常,檢視php.ini配置檔案並配置always_populate_raw_post_data = On 。 【注意】這個處理方式是在php版本較低的時候,php-ini中才有該配置,7以上的版本已經廢除

如果出現的是該公眾號服務故障 , 可以用echo ""; 來除錯,因為 echo ""; 伺服器沒東西返回沒反應,而不是出現該公眾號服務故障