最近在弄微信公众号开发,在微信api接入验证这块遇到了几个问题,记录一下踩坑之路。
一、这是官方文档的接入讲解
这儿前面第一步就不说了,配置自己的服务器,我这儿没有服务器,用的是ngrok内网穿透(问题也不知道是不是这个产生的原因,下面会讲)。
这儿第二步就是微信接口验证了,看官方文档说的那几个发来的参数的确是get过来的啊
但是我这样写
//1.得到微信发过来的timestamp,nonce,token,signature变量
$timestamp=$_GET['timestamp'];
$nonce=$_GET['nonce'];
$token='weixin';
$signature=$_GET['signature'];
$echostr=$_GET['echostr'];
//2.对其进行字典序排序并合并后加密
$array=array($timestamp,$nonce,$token);
sort($array);
$string=sha1(implode('', $array));
//3.再与signature关键字进行比较
if($string==$signature){
echo $echostr;
exit;
}else {
}
微信验证确实是能成功,但是访问就会一直出现这样的错误,
让我的微信关注事件的推送消息一直出不来,我写了一个用户关注公众号后会发送 “欢迎关注测试公众号” 得消息和用户发文本消息之后,公众号会回复相同的文本消息给用户的逻辑,都会出现问题,搞得我焦头烂额,不知咋办。
但是当我,把get的请求数据用request来接收后就解决了这两个问题,现在还不知道为什么,知道原因的大佬还请讲一下原因。
$signature = $request->param('signature');
$timestamp = $request->param('timestamp');
$nonce = $request->param('nonce');
$echostr = $request->param('echostr');
二、改成request来获取数据之后访问界面其实还是有错误,会出现这样的提示
这个错误其实是正常的,至少现在还并没有影响我的功能这可能对很多我们这样刚接触微信开发的新手来说可能会不知道,在这儿提一下。你去打印这个$postArr,会显示它是一个空的字符串,导致后面你把它转化为 $postObj对象的时候会返回一个boolean型数据false,那就自然会报错说访问一个非对象的属性MsgType。
三、这儿还有一个要注意的,大家都知道的获取微信推送过来的post数据php7以上不能用$GLOBALS[‘HTTP_RAW_POST_DATA’],而要用file_get_contents(‘php://input’)的方式来获取数据。
//获取微信推送过来的post数据(xml格式)
//$postArr=$GLOBALS['HTTP_RAW_POST_DATA']; php7以上不能用
$postArr = file_get_contents('php://input');
四、感谢 simonsfan博主分享的这个问题方案
这是一个大概率会犯的5星级错误,这个没注意会导致你回复用户消息不成功,出现 “该公众号提供的服务出现故障,请稍后重试” 的问题
这儿以回复文本消息为例,官方给的XML格式数据为
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
可看见里面是包含有非常多的空格的,此处一定要注意数据里面不能有空格,官方也并没有说明这个问题。
暂时遇到这些问题,写来记录一下,也算帮助更多踩坑者避坑,最近在搞微信开发,如果你们还遇到更多的问题欢迎交流探讨啊。