time:2017-03-10
问题:手机端访问网页没问题,电脑端微信测试就会出现code过时状况,致使服务器错误
错误状况:php
只要出现上述申请访问链接,点击后code就会过时
code过时致使服务器报错
问题缘由:json
客户端以及微信方同时带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就不会让申请跳转直接进去落地页了.多是微信设置缘由.session
下方阐述缘由以及排错通过,无聊发泄,没事干的能够看看
网页写好后,电脑版微信测试时候老是平白无故500报错,找到报错缘由就是code失效,一头雾水,检查本身代码检查了很久,最后手机端一看页面好好的! 艹!
很明显code是电脑版使用时候,在用户访问以前已经被用了,啥都不说了,先打开抓包工具看一看微信开发
能够看到我还没点继续访问的时候,就已经有一个请求冲到个人服务器把code用掉啦!
在我点完以后多了一个请求过去,不过明显已经晚了..code已经失效工具
如今找到缘由很明显要区别哪一个是用户真正的请求,分析下请求头发现后面访问的url参数里有有一个叫nsukey的参数,那就好办了 有这个参数的再请求获取code,没有的直接退出呗,代码上传一试测试
靠!继续报错!
目测还有别的请求也访问了服务器,本地抓包没抓到,八成是微信本身访问的,怎么办呢?url
$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只有一次机会,本身还跑去请求那么屡次.