來源:https://img.itread01.com/uploads/info/20210527/1622129706-9693.jpg

我們知道請求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]; } }