消息关闭
    暂无新消息!

获取access token的问题

问题作者 : Smart2017-07-03发布

我想让它每隔7200秒获取一次 下面这个方法为什么不行呢?每次刷新页面都会重新获取一次 这是为什么?

       if(isset($_SESSION['access_token'])&&$_SESSION['expire_time']>time()){
            return $_SESSION['access_token'];
        }else{
            $access_token = $this -> access_token();
            $url='https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . $access_token['access_token'];
            $this->curl($url,$data);
            $_SESSION['access_token']=$access_token['access_token'];
            $_SESSION['expire_time']=time()+7200;
        }
        echo $_SESSION['access_token'];

3个回答

︿ 1

你应该好好看看session机制,给session定义一个expire_time就可以了吗
session的过期时间默认的过期时间是在php.ini里设置的ini_set('session.gc_maxlifetime',3600);
然后你上述的情况 sessionid是存在cookie里的,应该采用cookie或者数据库来设置过期时间比较好,
setcookie(session_name(), session_id(), 7200);不知我是否讲清楚了

︿ 1
        //先把你的session 清空一下
        public function access_token(){

           if( isset($_SESSION['access_token']) && $_SESSION['expire_time'] > time() ){
                   echo 'Old';
                $res =  $_SESSION['access_token'];
            }else{
                echo 'New';
                  $res = $this->new_access_token();
            }
            return $res;
        }

        public function new_access_token()
        {
            $access_token = $this -> access_token();
            $url='https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . $access_token['access_token'];
            $new_access_token = $this->curl($url,$data);
            // $_SESSION['access_token'] = $access_token['access_token'];
            $_SESSION['access_token'] = $new_access_token;
            // $_SESSION['expire_time']=  time()+7200;
            $_SESSION['expire_time']=  time()+ 6200;
            return $new_access_token;
        }
︿ 0

access_token不能保存在SESSION中。

SESSION是跟客户端的回话,简单来说就是每个用户的SESSION都不同,而access_token是全局的,每7200秒刷新一次,如果你放在SESSION中就意为着每个用户都有一个自己的access_token,显然是不对的。你这样的代码造成的问题就是第二个用户登入网站后,第一个用户的access_token就失效了,实际上access_token跟用户无关。

正确的做法应该是存在本地缓存文件中,或者保存Redis缓存、或者DB中,每7200秒刷新一次。