一個Accecc_Token生成和快取和讀取類,微信/小程式開發必須學

weixin_34194087發表於2018-12-15

Access_Token是呼叫微信和小程式各種介面的臨時憑證,有效期2小時(7200秒),很多介面都需要呼叫access_token介面生成一個access_token的,例如微信支付,微信分享,公眾號的開發,獲取openid,獲取使用者的基本資訊,群發介面,還有網頁授權等各類介面都是需要access_token的,而且每天最多隻能呼叫2000次。

所以,量大的請求,不能每次發起請求都呼叫一次介面,2000次很快就請求完了,2000次用完了就沒有新的access_token用了,所以不能每發起一次請求都生成一個access_token的,如果這樣做,就造成不良後果。我們可以通過快取的方法,把access_token快取到本地或者記憶體中,在專案中取快取中的access_token來呼叫。

因為一個access_token在2小時內都可以隨便呼叫,沒有呼叫次數的,而2小時後過期了,只能請求access_token生成介面,生成新的access_token,這時候新的access_token,我們可以快取到本地或者記憶體,然後記錄當前的時間戳,等到下次專案中需要用access_token的時候,先判斷當前時間和快取的access_token的時間差是否超過2小時,如果超過了,就呼叫access_token生成介面生成新的access_token,如果沒有超時,那就使用快取中的access_token。

<?php
//快取access_token
function getToken(){
    $appid='填寫你的APPID';//APPID
    $appsecret='填寫你的APPSECRET';//APPSECRET
    $file = file_get_contents("access_token.json",true);//讀取access_token.json裡面的資料
    $result = json_decode($file,true);
    //判斷access_token是否在有效期內,如果在有效期則獲取快取的access_token
    //如果過期了則請求介面生成新的access_token並且快取access_token.json
if (time() > $result['expires']){
        $data = array();
        $data['access_token'] = getNewToken($appid,$appsecret);
        $data['expires']=time()+7000;
        $jsonStr =  json_encode($data);
        $fp = fopen("access_token.json", "w");
        fwrite($fp, $jsonStr);
        fclose($fp);
        return $data['access_token'];
    }else{
        return $result['access_token'];
    }
}
 
//獲取新的access_token
function getNewToken($appid,$appsecret){
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
    $access_token_Arr =  https_request($url);
    return $access_token_Arr['access_token'];
}
 
//向獲取access_token介面發起請求
function https_request ($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $out = curl_exec($ch);
        curl_close($ch);
        return  json_decode($out,true);
}
 
//呼叫函式
getToken();
 
//輸出當前快取檔案有效期內的access_token
$jsondata = file_get_contents('access_token.json'); 
$access_token_data = json_decode($jsondata);
echo $access_token_data->access_token;
?>

生成的本地快取檔案為
access_token.json
格式如下

{
  "access_token":"16_tTsgZ08Mf13NHsO8XT19faWwQVXKuBzLs3wElIyzGWMkcFLrSCBCKpXRd8dKuPC-A32fSJPIwKx4smzOgraV8U-2qzic6UIchBqk_LqmLPwDmPj4luOf6YQor0GotWOBg1bPsB29KzZy0ChFGCVfAIACYR",
  "expires":1544866066
}

作者:TANKING
網站:http://likeyunba.com

相關文章