• 技术文章 >后端开发 >PHP问题

    php下微信token验证失败怎么办?

    coldplay.xixicoldplay.xixi2020-07-27 10:21:14原创647

    php下微信token验证失败的解决办法:首先调用系统环境变量【$_SERVER】,可以查看到HTTP请求的信息;然后将其写入到本地文件中,并用浏览器打开【url+log.html】路径;最后在微信中点击提及即可。

    php下微信token验证失败的解决办法:

    我们在代码里面加入跟踪http记录的方法来查看我们自己的服务器收到了请求没有回应,还是微信根本没有发请求过来。
    通过调用系统环境变量$_SERVER,可以查看到HTTP请求的信息,其中两项重要的是

    61e456bcfb2c6b4b10c5b3a3d1d6e1d.png

    把其加入代上面的代码中,并且将其写入到本地文件中来,全部代码

    <?php
    /*
        php中文网 //m.sbmmt.com/
        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_ADDRQUERY_STRING,查看IP是不是来自上海(目前微信服务器部署在上海电信机房,几次故障都说是上海挖路引起的),查看QUERY_STRING格式是否和官方指南中描述的类似,如果这些没有问题,那先检查Token填写的是否和程序中的一致,再检查程序是否有问题。

    相关学习推荐:PHP编程从入门到精通

    以上就是php下微信token验证失败怎么办?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php 微信 token 验证失败
    上一篇:php ascii转换字符的方法 下一篇:php如何删除数组某个元素
    大前端线上培训班

    相关文章推荐

    • php token使用与验证示例【测试可用】[原创]• php token如何生成?关于PHP中token的生成的解析

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网