获取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(“操作失败!”);
}
}