來源:https://blog.csdn.net/sct_t/article/details/53002611
我們知道請求access_Token會返回這樣一個json,包括access_token(憑證)和expires_in(憑證的時限)
在我們需要access_token的時候沒必要每次都請求服務器,因為這個憑證在2小時內都是有效的,那么就要存起來,有幾種方法可以選擇:1.Redis; 2.數據庫;3文件存儲.
我使用的是數據庫存儲的方式:
-- -- 表的結構 `accesstoken` -- CREATE TABLE IF NOT EXISTS `accesstoken` ( `A_ID` int(11) NOT NULL, `A_Token` varchar(600) COLLATE utf8_bin NOT NULL, `A_Date` int(11) NOT NULL, `A_Update` int(11) DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
那么下面是php的代碼:
//獲取 access_token 當然在這之前請連接好自己的數據庫 function Curl($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_TIMEOUT, 5); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $dataBlock = curl_exec($ch);//這是json數據 curl_close($ch); $res = json_decode($dataBlock, true); //接受一個json格式的字符串並且把它轉換為 PHP 變量 return $res['access_token']; } //將令牌插入數據庫 function serilizable(){ $appid="你自己的"; $appsecret="你自己的"; $sql="select A_ID,A_Token,A_Date from accesstoken order by A_ID desc"; $rs=mysql_query($sql); $times=time();//當前時間 $row=mysql_fetch_array($rs); $rownum=mysql_num_rows($rs); //數據時間-當前時間 小於800s if($rownum == 0 ){//若無數據 那么獲取令牌,存入數據庫 $timestamp=time()+6000;//100分鍾后 $token= Curl($appid,$appsecret); $sqlin="insert into accesstoken(A_Token,A_Date) values('$token','$timestamp')"; mysql_query($sqlin); return $token; ///return $rownum; }else{ //超過數據的時間,那么重新獲取令牌 if($row['A_Date'] < $times){ $token= Curl($appid,$appsecret); $timestamp=time()+6000;//100分鍾后 $sqlu="UPDATE `accesstoken` SET `A_Token`='$token',`A_Date`='$timestamp' WHERE A_ID = '$row[A_ID]' "; mysql_query($sqlu); return $token; }else//沒超過,則從數據庫取 return $row[A_Token]; } }