1、在mysql中建立表sys_token;
CREATE TABLE `sys_token` (`id` int UNSIGNED NOT NULL,`access_token` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`expires_in` datetime NOT NULL,`refresh_token` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`refresh_token_expires_in` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='API token';
備注:expires_in\refresh_token_expires_in 巨量引擎返回的是純數字,單位:秒,需要你在tp里轉換成年月日時分秒;在數據庫里存儲時,一定要用datetime類型;否則會很麻煩的;
2、第一次獲取令牌時,官方會給你auth_code,你根據你的app_id,secret,auth_code獲取令牌,并存入database中;
3、由于令牌的有效期是1天,刷新令牌有效期是30天;令牌過期了需要刷新令牌;
use think\response\Json;
use think\facade\Db;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use DateTime;
use DateInterval;class Index
{// 去掉 readonly 修飾符,因為需要在刷新 token 后修改它protected string $accessToken;public function __construct(){$data = Db::name('sys_token')->find(1);$expired_time = $data['expires_in']; // accessToken的過期時間$isExpired = (new DateTime() > new DateTime($expired_time)); // 判斷是否過期if ($isExpired) {$this->getRefreshToken($data['refresh_token']); // 過期了刷新令牌} else {$this->accessToken = $data['access_token']; // 已存在的 accessToken}}public function index(): string{// 在調用任意接口時,需要有訪問令牌;return $this->accessToken;}public function getRefreshToken(string $refreshToken): Json{$client = new Client();$headers = ['Content-Type' => 'application/json',];// 請求體數據$body = ['app_id' => '你的app_id','secret' => '您的secret','refresh_token' => $refreshToken,];try {// 異步請求$response = $client->request('POST', 'https://api.oceanengine.com/open_api/oauth2/refresh_token/', ['headers' => $headers,'json' => $body, // 使用 'json' 自動編碼為 JSON]);// 獲取響應體并輸出$responseBody = $response->getBody()->getContents();$result = json_decode($responseBody, true);$expires_in_seconds = $result['data']['expires_in']; // expires_in = 86052 秒$refresh_token_expires_in_seconds = $result['data']['refresh_token_expires_in']; // refresh_token_expires_in = 2591652 秒// 獲取當前時間并加上秒數$expires_in_formatted = (new DateTime())->add(new DateInterval("PT{$expires_in_seconds}S"))->format('Y-m-d H:i:s');$refresh_token_expires_in_formatted = (new DateTime())->add(new DateInterval("PT{$refresh_token_expires_in_seconds}S"))->format('Y-m-d H:i:s');$data = ['id'=>1,'access_token' => $result['data']['access_token'],'expires_in' => $expires_in_formatted,'refresh_token' => $result['data']['refresh_token'],'refresh_token_expires_in' => $refresh_token_expires_in_formatted];Db::name('sys_token')->update($data);// 將新獲取的 accessToken 更新到實例的屬性中$this->accessToken = $result['data']['access_token']; // 使用新的 accessTokenreturn json(['code' => 0, 'msg' => '刷新token成功']);} catch (RequestException $e) {// 錯誤處理return json(['code' => 1, 'msg' => $e->getMessage()]);}}
}
測試環境:centOS stream 9、php8.3、thinkphp8.1; 歡迎大家指正........