• 微信网页授权 通过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会不会再出问题,坑人的微信。

  • 相关阅读:
    jsp页面input输入框限制输入内容
    sql计算两个日期之间的相差天数
    sql根据一个字段日期加减7天存入另一字段中
    ajax请求捕获异常
    跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
    一次得到多个数据集
    SQL Server 2008语句大全完整版
    关于已开票已收款未发货的账务处理
    高格-一些特点话题【7】
    高格-塑料管业中厂内工单,满足随时换料的处理【6】
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/10669943.html
Copyright © 2020-2023  润新知