微信公众号刷新Access_token

获取access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

公众平台的API调用所需的access_token的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。

接口调用请求说明

https请求方式: GET

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明

参数

是否必须

说明

grant_type

获取access_token填写client_credential

appid

第三方用户唯一凭证

secret

第三方用户唯一凭证密钥,即appsecret

参数

说明

access_token

获取到的凭证

expires_in

凭证有效时间,单位:秒

来自 <https://mp.weixin.qq.com/wiki?action=doc&id=mp1421140183&t=0.4218586468877523>

微信公众Access_token 有效期为2个小时,重复请求将导致之前的access_token失效,所以应将access_token 缓存起来避免不断请求刷新

思路:保存access_token 时设置过期时间, 当前时间 + 2个小时

要取access_token , 判断当前时间是否大于数据库内的过期时间,

是则重新请求access_token, 并更新过期时间

否则返回当前 access_token

实例代码

<?php

header(‘Content-type:text/html;charset=utf-8′);

//入口函数

get_local_access_token();

// 请求新的access_token

function get_new_access_token(){

$appid = appid;

$appkey = appkey;

$token = token;

$url = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appkey;

$curl = curl_init();

// 配置curl参数

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

curl_setopt($curl, CURLOPT_TIMEOUT, 500);

// 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。

// 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);

curl_setopt($curl, CURLOPT_URL, $url);

$data = curl_exec($curl);

curl_close($curl);

return $data;

}

// 获取数据库中的access_token

function get_local_access_token(){

$host = 数据库主机;

$user = 数据库账号;

$pass = 数据库密码;

$dbname = 数据库名;

    $ctx= new PDO(“mysql:host=$host;port=3306;dbname=$dbname;charset=utf8″,$user,$pass);

    if(!$ctx){

        die(数据库连接失败);

    }else{

        $sql = “select access_token,add_time from access_token;”;

        $data = $ctx->query($sql);

        $detail = $data->fetchAll(PDO::FETCH_ASSOC);

        if(empty($detail)){

            refresh_access_token();

            // $new_access_token = get_new_access_token();

            // echo($new_access_token);

        }else{

            $access_token = $detail[0][‘access_token’];

            $add_time = $detail[0][‘add_time’];

            // 判断当前时间是否大于数据库内保存的过期时间,是则刷新, 否则返回数据库内保存的时间

            if(time()>$add_time){

              // echo(“当前access_token:”.$access_token.”过期时间为:”.date(‘Y-m-d H:i:s’,$add_time));

              // echo(“当前时间为:”.date(‘Y-m-d H:i:s’));

                refresh_access_token();//调用refresh_access_token函数刷新access_token

            }else{

                echo(当前access_token:”.$access_token.过期时间为:”.date(‘Y-m-d H:i:s’,$add_time));

            }

        }

    }

}

//刷新数据库内的access_token 并更新过期时间

function refresh_access_token(){

    $host = 数据库主机;

    $user = 数据库账号;

    $pass = 数据库密码;

    $dbname = 数据库名;

    $ctx = new PDO(“mysql:host=$host;port=3306;dbname=$dbname;charset=utf8″,$user,$pass);

    try {

        // 请求新的access_token

        $new_access_token = get_new_access_token();

        $data = json_decode($new_access_token);

        $access_token = $data->access_token;

        $add_time = time() + 7000;//设置过期时间为当前时间+7000(2小时为7200)

        $sql = “update access_token set `access_token`=’$access_token‘,`add_time`=$add_time;”;

        $count = $ctx->exec($sql);

        echo(更新.$count.条记录);

        echo(“access_token已刷新!”);

        echo(access_token:$access_token);

    } catch (\Throwable $th) {

        die(操作失败!”);

    }

}

微信公众号刷新Access_token

转载请注明来源:幽幽过客_{微信公众号刷新Access_token}