微信网页授权 通过code获取openid 报错40163 code been used

Posted lewo的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信网页授权 通过code获取openid 报错40163 code been used相关的知识,希望对你有一定的参考价值。

使用好好的微信功能,突然安卓无法正常使用了,苹果的正常。

安卓报错内容:

40163,code been used.

题外话:微信的东西,为何报英文错误呢,装什么13.

实测结果:安卓获取用户信息时 ,触发了两次请求,而苹果只请求一次。

各种搜索,各种尝试,均无效。

沉下来好好想想,再反复测试, 最终发现问题出在获取用户信息的 时候,同一个code在短时间内使用了两次,

public function get_access_token($code){
        //基础token
//        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
        //网页授权token
            $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=$this->appId&secret=$this->appSecret&code=$code&grant_type=authorization_code";
            
            $dc[url]=$code;
            D("ticai_request_log")->add($dc);
            
            $res = json_decode($this->httpGet($url));
            return $res;
    }

至于多久后才能使用相同的code,还没测试出来,

感觉问题在这里,那就在 上一层开始拦截,也就是,如果出现 相同的code时,不用再获取用户信息了。

 

关键代码来了:

if (isset($_GET[code])){
    $code=$_GET[code];
    $code_session=session("code");
    if($code==$code_session){
        //什么都不做
    }
    else{
        //缓存起来
        session("code",$code,10);
        //获取用户信息
        $access_token=$jssdk->get_access_token($_GET[code]);
        这时获取到的openid要缓存起来,后边的代码会用到的。
    }
}

思路:

回调后,获取到code,与session比较,如果一样,说明是第二次请求了,什么都不处理,

如果不一样,说明是初次请求,那就调接口获取用户信息吧。

这里好像 

只能用session缓存,用cookie无法取到,其实前一天用cookie是没问题的, 不知道为何第二天又不行了,

明天再测试一下session会不会再出问题,坑人的微信。

以上是关于微信网页授权 通过code获取openid 报错40163 code been used的主要内容,如果未能解决你的问题,请参考以下文章

微信授权获取code/openid

如何获取微信网页授权

微信用户公众授权登录获取openid

微信开发系列——公众号内嵌H5页面获取code,拿到openID

OAuth2.0网页授权微信怎么用java获取openid

php微信网页授权获取用户信息