來源: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];
}
}
