該公眾號提供的服務出現故障,請稍后再試


這幾天遇到的問題,直教人,生不如死。

公眾號開發(公眾號: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&amp;timestamp=1522260281&amp;nonce=416143100&amp;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的示例,會節約不少社會生產力。你們的一言一行,都涉及廣大人民群眾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM