這幾天遇到的問題,直教人,生不如死。
公眾號開發(公眾號:iSoftFine),“自定義被動回覆使用者訊息”這一步,對應的文件是https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543。
按照正常的開發步驟,登入公眾號以後,左側選單,“開發-->基本配置-->伺服器地址(URL)”中設定了這個連結“http://123.206.xx.xx/wx”,然後在我的公眾號中發訊息留言,然後得到了非常快非常快的回覆“該公眾號提供的服務出現故障,請稍後再試”,而不是官方文件所描述的嘗試5秒的請求。
伺服器上的頁面程式碼如下:
<?php require("visitorinfor.php"); //$ToUserName = $_GET["ToUserName"]; $a = new visitorInfo(); $b = $a->getIp(); #echo $b; logger($b); logger("==日誌開始=="); # echo "success " . date('Y-m-d H:i:s',time()); echo "success"; //定義 token define("TOKEN", "sabre"); //例項化物件 $wechatObj = new wechatCallbackapiTest(); //呼叫函式 if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); logger("wechatObj:"); }; function logger($msg){ $file = "messager.txt"; file_put_contents($file, $msg . date('Y-m-d H:i:s',time()) . PHP_EOL, FILE_APPEND); }; class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ ob_clean(); echo $echoStr; exit; }else{ write_log('認證失敗'); exit; } } public function responseMsg() { //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //$postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input"); if(isset($GLOBALS['HTTP_RAW_POST_DATA'])){ $postStr = $GLOBALS['HTTP_RAW_POST_DATA']; #echo "GLOBALS['HTTP_RAW_POST_DATA']"; logger("GLOBALS['HTTP_RAW_POST_DATA']不空"); } else{ $postStr = file_get_contents('php://input'); //echo "file_get_contents:".$postStr->FromUserName; logger("GLOBALS['HTTP_RAW_POST_DATA']為空");//.gettype($postStr)); } if (!empty($postStr)){ //libxml_disable_entity_loader(true);//安全防護 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $createTime = $postObj->CreateTime; $msgType = $postObj->MsgType; $content = $postObj->Content; $msgId = $postObj->MsgId; if($msgType == 'text'){ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $time = time(); $contentStr = "您發的是訊息包含以下資訊:\n發信人OpenID:".$fromUsername."\n收信人微訊號:".$toUsername."\n發信時間:".$createTime."\n訊息型別:".$msgType."\n訊息內容:".$content."\n訊息ID:".$msgId; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr); ob_clean(); echo $resultStr; }else{ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $time = time(); $contentStr = "您發的訊息型別不是文字。而是".$msgType; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr); ob_clean(); echo $resultStr; } } } private function checkSignature() { if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } logger("==日誌結束==") ?>
根據現象來看,一定是哪裡報錯了。
- 按照最低要求,只回復了一個success,不行。
- 把頁面上所有的echo輸出都刪除,不行。
- 使用ob_clean();清除其它輸出,不行。
- 更換頁面,嘗試網上的各種解決方案,不行。
- 設定第三方授權,不行。
- 開啟微信開發的警報,“開發-->運維中心-->介面告警”,把下面的閾值設定為1次/5分鐘。事實證明,正是這個告警幫我解決了問題。但是這個告警不怎麼靈,最初的時候,我連續發了41個訊息的時候,自動成立的群中,出現了一條告警訊息。後來不確定次數會發一個選區訊息。再後來,第三、四天以後,無論怎樣發訊息,也不再告警了,不知原因。
告警中回覆的訊息如下:
Appid: *** 暱稱: *** 時間: 2018-03-29 02:04:41 內容: 微信伺服器向公眾號推送訊息或事件後,得到的迴應不合法 次數: 5分鐘 17次 錯誤樣例: [OpenID=***][Stamp=1522260281][3rdUrl=http://123.206.xx.xx/wx][Msg=Text][ip=123.206.xx.xx}[response_length=367][response_content=<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved < a href="http://123.206.xx.xx/wx/?signature=604fbc39b06d70eef96776f18f723ec8ebe75bdd&timestamp=1522260281&nonce=416143100&openid=o8Cfj1VZELLnqs0uBNvxBVZOa6jY">here</ a>.</p> </body></html>] 報警排查指引,請見: http://url.cn/ab0jnP
是個301重定向的錯誤。
足足困擾了兩天,決定要放棄了。
但是沒有放棄,心裡一直惦記著這個事兒。
今天,偶然又翻了一下這個告警訊息,發現了一點端倪。
回覆的訊息中<p>The document has moved < a href="http://123.206.xx.xx/wx/?signature=604fbc39b06d70eef96776f18f723ec8ebe75bdd為什麼wx後面會有個斜槓?我設定的網址中似乎沒有斜槓。靈光乍現,趕緊回去看了一下,果然沒有斜槓,加上,測試,通過。
這就是暗時間的力量,念念不忘,必有迴響。
同時建議微信開發團隊,加上一個URL的示例,會節約不少社會生產力。你們的一言一行,都涉及廣大人民群眾。