思路:
// access_token 获取到的凭证
// expires_in 凭证有效时间,单位:秒 ,7200s过期
// 1.首先读取php session缓存
// 2.如果php session缓存读取失败,就读取存入的json文件(并写入缓存。下次就直接读取缓存了)
// 3.读取文件失败或者凭证时间只剩下1200s(已经超过100分钟(6000秒)),再次通过微信API接口获取,获取后写入到json文件,并写入到php session缓存
// 进行前两步,从缓存和文件进行获取凭证时,如果凭证时间只剩下1200s(已经超过100分钟(6000秒)),则直接执行第三部(通过微信API接口获取,获取后写入到json文件,并写入到php session缓存)
可以将写入json文件改为写入数据库,或者把写入数据库也加入其中,四层保证。
<?php
// 微信公众平台应用ID和密钥
$appid = "你的id";
$appsecret = "你的秘钥";
// 凭证文件路径
$tokenFile = "./token.json"; // 请替换为实际的文件路径
// 尝试从会话缓存中获取access_token
session_start();
if (isset($_SESSION['access_token']) && isset($_SESSION['expire_time']) && time() < $_SESSION['expire_time']) {
$access_token = $_SESSION['access_token'];
} else {
// 会话缓存不存在或已过期,尝试从文件中读取
if (file_exists($tokenFile)) {
$data = json_decode(file_get_contents($tokenFile), true);
if (time() < $data['expire_time']) {
$access_token = $data['access_token'];
$_SESSION['access_token'] = $access_token;
$_SESSION['expire_time'] = $data['expire_time'];
} else {
// 文件中的凭证也过期了,需要重新获取
$access_token = getAccessToken($appid, $appsecret, $tokenFile);
}
} else {
// 文件不存在,创建文件并获取新的access_token
$access_token = getAccessToken($appid, $appsecret, $tokenFile);
}
}
// 获取access_token的函数
function getAccessToken($appid, $appsecret, $tokenFile)
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
$result = json_decode(file_get_contents($url), true);
if (isset($result["access_token"])) {
$access_token = $result["access_token"];
$expire_time = time() + $result["expires_in"] - 1200; // 提前1200秒过期
// 将新的access_token和过期时间保存到会话缓存
$_SESSION['access_token'] = $access_token;
$_SESSION['expire_time'] = $expire_time;
// 将新的access_token和过期时间保存到文件
if (!file_put_contents($tokenFile, json_encode(["access_token" => $access_token, "expire_time" => $expire_time]))) {
// 如果写入文件失败,则抛出异常
throw new Exception("无法写入凭证文件");
}
return $access_token;
} else {
// 获取access_token失败,处理错误
// 错误处理代码(根据需要添加)
return null;
}
}