1. 程式人生 > >如何高效率儲存微信中的 access_token 限制申請2000次/天

如何高效率儲存微信中的 access_token 限制申請2000次/天

如何高效率儲存微信中的 access_token

眾所周知,在微信開發中,獲取access_token 的介面每天的呼叫次數是有限制的,2000次應該是。
不過其實這些完全夠用了,除非你不小心寫了個迴圈,在1秒中內用完了。
每個access_token 的生效時間是2小時內,2小時過後就需要重新申請一下。其實每天只需要申請12次就可以了。
不管你怎麼申請,當前申請了access_token,以前的就都不能用了。

所以解決辦法就是:
在資料庫中新建一個表token盛放申請來的access_token,欄位有三個

access_token #存放access_token
expires #存放毫秒數 update_time #更新時間戳

邏輯是這樣的:(表中只有一條資料)

查詢表中資料
    如果有資料,用 時間戳+更新時間 跟 現在時間比較,計算是否已過期:
        如果已過期,重新申請,並更新資料庫中資料,並返回access_token
        如果沒有過期,直接返回查詢出的access_token
    如果沒資料:
        申請資料並,插入資料庫,返回access_tooken
Created with Raphaël 2.1.0查詢表中資料是否有資料?查詢資料是否過期向微信申請新token並插入資料庫設定變數 access_token 的值
返回 access_token輸出資料庫表中的access_token向微信申請新token並插入資料庫yesnoyesno
/*
---------------------
獲取access_token:
    查詢資料庫中是否有資料,
        如果有 取出資料
                如果已經過期,查詢,更新記錄
                如果沒過期,直接返回資料
        如果沒有 查詢並新增資料,返回資料
---------------------
*/

function get_token(){
    $access_url= 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='
.AppID.'&secret='.AppScret; //AppID AppScret 已經定義為常量 //資料庫引數 $host= "1.1.1.1"; $port = '3306'; $database = "wx"; $user = "mysql"; $passwd = "mysql"; $db = new mysqli($host,$user,$passwd,$database,$port); $sql = "select * from token"; //查詢wx表資料 $exist = $db->query($sql); global $access_token; if($exist->num_rows) //如果存在資料 { $row = $exist->fetch_array(); //如果資料已過期 if($row['expires']+$row['update_time']<time()){ $token = json_decode(file_get_contents($access_url)); $sql = "update token set access_token = '{$token->access_token}' where access_token = '{$row['access_token']}'"; $db->query($sql); $access_token = $token->access_token; //返回更新的token } else { $access_token = $row['access_token']; //返回查詢的token } } //如果沒有資料 else { $token = json_decode(file_get_contents($access_url)); $sql = "insert into token values('{$token->access_token}',{$token->expires_in},".time().")"; $db->query($sql); $access_token = $token->access_token; //返回新建的token } $db->close(); return $access_token; //返回access_token }