access_token 的存储与更新
access_token 的存储至少要保留 512 个字符空间;access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效,并且每天获取的频次有限,所以需要进行本地缓存或者缓存到数据库进行使用,而不是每次调用接口都获取access_token,以下是一个获取access_token并缓存到本地access_token.php文件的封装函数。
<?php
// APPID
$APPID = 'xxx';
// APPSECRET
$APPSECRET = 'xxx';
// 缓存文件路径
$TOKEN_FILE = 'access_token.php';
// 刷新 Access_Token 的函数
function refreshAccessToken($appid, $appsecret) {
// 官方接口
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
// 发起请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 结果
$response = curl_exec($ch);
curl_close($ch);
// 解析结果
$data = json_decode($response, true);
if (isset($data['access_token'])) {
// 返回access_token
return $data['access_token'];
} else {
// 解析失败
return false;
}
}
// 从缓存文件中获取 Access_Token 和过期时间戳
function getAccessTokenFromCache($tokenFile) {
// 判断缓存文件是否存在
if (file_exists($tokenFile)) {
// 如果缓存文件存在
$tokenData = include($tokenFile);
if ($tokenData && is_array($tokenData) && isset($tokenData['access_token']) && isset($tokenData['expires_at'])) {
// 返回access_token
return $tokenData;
}
}
}
// 更新缓存文件中的 Access_Token
function updateAccessTokenCache($tokenFile, $access_token, $expires_in) {
// 提前一分钟刷新
$expires_at = time() + $expires_in - 60;
// 生成缓存文件
$tokenData = "<?php\nreturn array('access_token' => '$access_token', 'expires_at' => $expires_at);\n";
file_put_contents($tokenFile, $tokenData);
}
// 获取当前时间
$current_time = time();
// 从缓存文件中获取 Access_Token 和过期时间戳
$tokenData = getAccessTokenFromCache($TOKEN_FILE);
// 未过期
if ($tokenData && $tokenData['expires_at'] > $current_time) {
// 使用缓存的 Access_Token
$access_token = $tokenData['access_token'];
// 输出已缓存的access_token
echo "缓存的Access_Token: $access_token\n";
} else {
// 刷新 Access_Token
$access_token = refreshAccessToken($APPID, $APPSECRET);
// 获取成功
if ($access_token) {
// 输出新的access_token
echo "新的Access_Token: $access_token\n";
// 更新缓存文件
updateAccessTokenCache($TOKEN_FILE, $access_token, 7200);
} else {
// 刷新失败
echo "Access_Token刷新失败\n";
}
}
?>
在以上脚本中,加载这个脚本,会立刻读取本地access_token.php文件,如果存在这个文件,就解析这个文件的内容,读取里面的access_token和过期时间,如果过期了,就直接调用请求接口获取信的access_token并更新文件,如果没有过期,直接使用access_token.php文件里面的access_token作为业务需要。
作者
TANKING
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。