微信的第一个坑儿

大家有在学习微信开发吗?
我刚上场就碰到坑儿。
填写微信服务器配置,腾讯老是提示我配置错误。
腾讯页面我填写的是,(假设abc.com是我的域名):

URL:http://demo.abc.com/demo/dev
Token:AzTuJfJcQyZRcMMecnbrGoN7ZoaC8Jvb

然后我配置Laravel路由

Route::get('/demo/dev','DemoController@valid');

然后配置DemoController 其中的valid方法

public function valid()
{
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
    $token='AzTuJfJcQyZRcMMecnbrGoN7ZoaC8Jvb';        
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    
    if( $tmpStr == $signature ){
        return true;
    }else{
        return false;
    }
}

哪位知道问题在哪儿?

JellyBool

你确定你的Token是AzTuJfJcQyZRcMMecnbrGoN7ZoaC8Jvb,这个通常是EcodingAESKey吧?Token不应该是一个简单的字符串么?你确定你没有写错?

panoswj

刚才又核对了一次字符串,我确定我没有写错,Token可以是3~32为随机字符串。

ty0716

写个log,看微信来过没有?

openwrtmail

appID 和 appsecret填了吗 不介意的话可以将代码放到一个网盘。看你的valid方法是官网的demo。

panoswj

验证配置信息的时候不需要APPID和APPSECRET,还是最开始的配置。
呵呵,我这个刚刚Composer安装完,填写的内容就上面那点内容,Route一行,然后一个Controller,不存在其他文件了。

JellyBool

嗯,怎么说呢?既然是出错了,那肯定是你在某个地方写错了呗,如果这种情况之下没有更多地信息,我们也没有办法帮你解决。

panoswj

我刚查查看Laravel.log 是空文档。那么按照@ty0716 的说法看,腾讯应该并没有访问我设定的URL,我过段时间在测试下, 如果还有日志,我会贴出来。

openwrtmail

Laravel 5 默认启用了 CSRF 中间件,因为微信的消息是 POST 过来,所以会触发 CSRF 检查导致无法正确响应消息,所以请去除默认的 CSRF 中间件,改成路由中间件。

panoswj

微信验证服务器状态用的GET,消息才会用POST。
而我现在是,服务器验证都不能通过。
Laravel.log依然没有微信的任何记录,其他正常。

openwrtmail

你compose的标准laravel?然后就是简单做了个路由? 我可以帮你试试

openwrtmail

我知道你的问题出在哪了@panoswj
微信开发文档中有如下描述
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
你程序中的valid()最后验证签名只返回了true和flase
你不妨将

if( $tmpStr == $signature ){
        return true;
    }

修改成

if( $tmpStr == $signature ){
        echo $echoStr;
                exit;
    }

当然前面你需要从GET请求将echoStr拿出来 `echoStr = $_GET[“echostr”];`

JellyBool

果然是有经验的人 @openwrtmail

panoswj

@openwrtmail 按照你的方法,配置成功。非常感谢。

openwrtmail

这个是最基础的东西~~~不过我一般用人家封装好的库。自己做应用。有问题再查文档。@jellybool

openwrtmail

不客气。多交流~~~@panoswj

MiYogurt

长见识了。

ty0716

@openwrtmail 首次验证使用的是get请求,不是post

openwrtmail

是的 验证是用的get请求。他这个问题的关键是没有按文档返回随机数。@ty0716