系统:centos7.2
开发环境:宝塔配置的lnmp环境,php 5.6,nginx 1.14,mysql56
APPID: wx813f388cc8dadf5d
问题背景:
1.开始没有使用宝塔,单独配置的lnmp环境,使用测试号可以通过验证。
但是到了第二天正式配置的时候,一直验证失败,找不到原因。所以重置了服务器,安装了宝塔(为方便管理)。
2.在宝塔上配置了微擎,并使用自带的配置输入token,还是失败!
分析可能的问题:a)微擎配置问题,b)代码问题,c)服务器问题,d)微信问题(可能性最小)
实验过程:
a)检查了每一项微擎的配置,测试了所有的变量,仍然不行,怀疑可能是微擎引擎底层问题。
b) 查看微擎api源码,未检查到有什么问题,怀疑可能当前版本代码有问题,遂替换api文件,使用网上发布的简单版验证代码进行测试
(中间自己插上了一段保存结果的代码,msg.txt 用来观察微信传过来的GET的值和代码运行状况)
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "wx8888abcde");//此处的TOKEN就是接下来需要填在微信的配置里面的token,需要保持严格一致
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
//将结果拦截下来,保存到msg.txt
$myfile = fopen("msg.txt", "w") or die("Unable to open file!");
foreach ($_REQUEST as $key => $value)
{
fwrite($myfile, "Key: $key; Value: $value<br />\n");
}
fwrite($myfile,"tmpStr:$tmpStr\n" );
if( $tmpStr == $signature ){
fwrite($myfile, "tmpStr == signature:True\n");
}
fclose($myfile);
//保存结果
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
到微信公众平台进行接口配置,三种模式都尝试了,仍然验证失败!!
查看msg显示:
有数据读取到,证明服务器和微信都互相响应了是通的,且这里的输出和验证全都是正确的!微信就是无法验证痛过。
分析:这里没有任何格式输出错误,调用api也没有错误!
最后只能怀疑是服务器问题或者微信问题。
c) 排查服务器的问题,按从上到下的原则,先找朋友借服务器进行测试,上传了我上面原封不动的代码,到他服务器,进行测试。结果如下:
成功了!!?这一下彻底给我整懵了。
代码没问题,微信也没问题,域名也没问题,我这台阿里云服务器也没问题能访问,就是不成功?能给个解决方案吗?
难道微信拦截了数据?我实在想不通了,这个问题困扰了我一天了。
已经解决。 是域名备案的问题! 因为我之前换过服务器,造成了备案信息不对。 但是我一直在用这个域名做解析造成的问题。