Stories

Detail Return Return

php編寫的緩存微信access_token到本地的腳本 - Stories Detail

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

user avatar u_17353607 Avatar munergs Avatar xw-01 Avatar jmix Avatar sheng_c Avatar zz_641473ad470bc Avatar alienzhou Avatar bianchengsanmei Avatar guoduandemuer Avatar silkide Avatar duokeli Avatar lewyon Avatar
Favorites 33 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.