微信公众平台消息接口开发

来源:互联网 发布:防范电信网络新型犯罪 编辑:程序博客网 时间:2024/04/24 13:31

本系统教程以微信公众平台应用天气神(账号WeatherGod,支持国内近400个城市天气的名称、拼音、区号、邮编以及语音触发模式查询)为例,讲解微信接口开发过程。欢迎大家关注该账号并使用语音方式查询当地天气,二维码见底部。

 

本文是微信公众平台消息接口开发(1)启用接口 的下部分

 

三、服务器没有响应Token验证的解决方法

1.  技术分析法

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

$_SERVER["REMOTE_ADDR"]  //记录来访者的IP,我们记录微信服务器是否访问过$_SERVER["QUERY_STRING"]  //查询请求字符串

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

<?phpdefine("TOKEN", "天气神");date_default_timezone_set('Asia/Hong_Kong'); traceHttp();$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();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);                //sha1加密后与签名对比        if( sha1(implode($tmpArr)) == $signature ){            return true;        }else{            return false;        }    }}function traceHttp(){    logger("");    logger("REMOTE_ADDR:".$_SERVER["REMOTE_ADDR"].((strpos($_SERVER["REMOTE_ADDR"], "101.226"))?" From WeiXin":" Unknown IP"));    logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]);}function logger($content){    file_put_contents("log.html", date('Y-m-d H:i:s  ').$content."<br>", 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 IP2013-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 WeiXin2013-01-30 10:15:49 QUERY_STRING:signature=eded789463180edf6c13691398d0cb4c85fb0e23&echostr=5838479218127813673×tamp=1359100969&nonce=1359376876

从上可以看到,这次IP来自101.226.89.83,是微信的IP,我把这个IP加入到代码中自行判断了
另外它的查询请求和官方指南中描述的一致,所以可以确定,微信把消息提交到服务器中了。提交应该成功。如果不成功,原因在于自己这边。

 

2. 万能成功法

如果你用上面的白方法还没提交成功,被接口启用问题已经折腾了N次,心灰意冷,打算退出微信接口开发,那你一定要再多看一眼下面的万能方法。
再看一下验证部分的源代码

$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{    public function valid()    {        $echoStr = $_GET["echostr"];        //随机字符串        if($this->checkSignature()){            echo $echoStr;            exit;        }    }

其实就调用一下valid()函数,在valid()函函数中检查签名,如果签名成功,就应答echoStr。
如果我们跳过这个签名呢......

    public function valid()    {        $echoStr = $_GET["echostr"];        if(true){            echo $echoStr;            exit;        }    }

经过试验,提交也成功。证明也是可行的。但是。。。。
好像,这后面存在着微信一个很大的漏洞,很大很大,可能是无穷大!!!

原创粉丝点击