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