您当前的位置:首页 > 计算机 > 编程开发 > Other

微信公众号token验证成功,但是自动回复没反应 / 该公众号服务故障

时间:07-30来源:作者:点击数:

微信公众号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 "";服务器没东西返回没反应,而不是出现该公众号服务故障

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门