2

最近做微信开发,在网页授权的时候,总是出现异常

time:2017-03-10
问题:手机端访问网页没问题,电脑端微信测试就会出现code过期情况,导致服务器错误
错误情况:图片描述

只要出现上述申请访问连接,点击后code就会过期

图片描述

code过期导致服务器报错

问题原因:

客户端以及微信方同时带code请求服务器多次,用户真实请求时code已经过期

解决方法:

  1. 万金油解决方法,第一次通过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{...}
  1. 分析请求头找出用户真是请求,加以排除.注意要有上述情况的再尝试此方法

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只有一次机会,自己还跑去请求那么多次.


x!!!
1k 声望23 粉丝