最近做微信开发,在网页授权的时候,总是出现异常
time:2017-03-10
问题:手机端访问网页没问题,电脑端微信测试就会出现code过期情况,导致服务器错误
错误情况:
只要出现上述申请访问连接,点击后code就会过期
code过期导致服务器报错
问题原因:
客户端以及微信方同时带code请求服务器多次,用户真实请求时code已经过期
解决方法:
万金油解决方法,第一次通过code获取到信息后就把code存入session中,短时间内直接从session中获取,不再请求微信防止服务器报错,下面的php代码给用户30秒缓存时间.
session_start();
if(isset($_SESSION['user'])){
$time = time()-$_SESSION['session_time'];
if($time>30){
unset($_SESSION['user']);
unset($_SESSION['session_time']);
}
}
if(isset($_SESSION['user'])){
$userinfo = $_SESSION['user'];
}else{...}
分析请求头找出用户真是请求,加以排除.注意要有上述情况的再尝试此方法
if(!isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])){
if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){
die;
}
}
后面发现自己刚开始用.top域名访问时候总是出现这个原因,后期换成.com就不会让申请跳转直接进去落地页了.可能是微信设置原因.
下方阐述原因以及排错经过,无聊发泄,没事干的可以看看
网页写好后,电脑版微信测试时候总是无缘无故500报错,找到报错原因就是code失效,一头雾水,检查自己代码检查了好久,最后手机端一看页面好好的! 艹!
很明显code是电脑版使用时候,在用户访问之前已经被用了,啥都不说了,先打开抓包工具看一看
可以看到我还没点继续访问的时候,就已经有一个请求冲到我的服务器把code用掉啦!
在我点完之后多了一个请求过去,不过明显已经晚了..code已经失效
现在找到原因很明显要区别哪个是用户真正的请求,分析下请求头发现后面访问的url参数里有有一个叫nsukey的参数,那就好办了 有这个参数的再请求获取code,没有的直接退出呗,代码上传一试
靠!继续报错!
目测还有别的请求也访问了服务器,本地抓包没抓到,八成是微信自己访问的,怎么办呢?
$file = fopen("HELLO.TXT",'a+');
$txt = json_encode($_SERVER);
fwrite($file, "\n".$txt);
fclose($file);
die;
生气了,只要有请求就把信息打印出来看看呗,写好后在用电脑版试一试
打开hello.txt,乖乖!微信也请求了两次!
再次分析信息,发现微信请求的HTTP_CONNECTION没有开启,现在就办了
if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){
die;
}
这两种情况屏蔽掉最后就是真是请求了呗,看着很完美,试一下也连接成功啦!
可惜最重要的手机端试一下GG,没办法在用上面方法把手机端的也打印出来看看
发现手机端有一个独特的HTTP_UPGRADE_INSECURE_REQUESTS
OK,那就再判断下吧..
if(!isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])){
if(!isset($_GET['nsukey'])||$_SERVER['HTTP_CONNECTION']=='close'){
die;
}
}
坑爹的微信,自己设置code只有一次机会,自己还跑去请求那么多次.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。