以YII2做微信公众平台的开发,踩到的坑
token验证失败
在公众平台的基本配置设置了token
和url
,一直提示验证失败,在服务端打印输出微信传递的signature
和自己服务端sha1
加密的是对等的,但是始终都是token
验证失败,刚开始一直以为是自身代码问题,但是就是找不到答案,后面意识到是不是框架问题,在输出的时候带了一些格式信息导致了微信不认账。意识到是框架问题之后才开始找到了思路,后面修改代码,解决了token验证问题。
示例:
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
ob_clean();//增加这句
echo $echoStr;
exit;
}
}
接收不到微信post数据
顺便提下,部分人的原因可能是在获取微信数据的地方使用了这个变量HTTP_RAW_POST_DATA
,这个变量在PHP7中已废弃,请使用file_get_contents('php://input')
代替。
我刚开始是因为YII2 默认开启了csrf
验证,微信过来的数据肯定是没有的所以一直接收不到数据,也无法找原因,能不能快速解决就看运气了,解决方法,屏蔽验证,在控制器中修改
public $enableCsrfValidation = false;
改完之后,还是无法接收到数据,我最开始接收数据的方法
public function init()
{
$this->api = new Wxapi();
$this->xml = $this->api->requestMsg();
}
$this->xml
一直都没有数据,后面在调试的过程中,不断的断点,最后发现在init()中可以获取到数据,代码调整如下
public function init()
{
$this->api = new Wxapi();
$this->xml = file_get_contents('php://input');
}
到此,微信通信问题基本解决了,后面就是业务逻辑问题。