微信里面的很多操作需要access_token来操作,但是access_token又是有效时间的,笔者写这个文章的时候,是7200秒的有效时间,然而微信一天允许获取access_token的次数是2000次
基于百度云BAE中的PHP+MYSQL来做的一个类似于缓存的功能,如果过期就自动更新一下,一天最多获取13次就够用了。一下是我的代码:
<?php define("D",false); // 这里的appid和appsecret放到数据库里面,如果数据库里面没有的话 再做请求 define("appID", "wxc87a9c7353600000"); define("appsecret","6036ad004cbaa1b1ef5079ffee400000"); /*替换为你自己的数据库名*/ $dbname = 'gvGAiDLkiAoflAD00000'; /*填入数据库连接信息*/ $host = 'sqld.duapp.com'; $port = 4050; $user = '192abbcce33a469dae61bbb056000000';//用户AK $pwd = '73b83a3facc046eea5b7f92662100000';//用户SK /*以上信息都可以在数据库详情页查找到*/ /*接着调用mysql_connect()连接服务器*/ $link = @mysql_connect("{$host}:{$port}",$user,$pwd,true); if(!$link) { die("Connect Server Failed: " . mysql_error()); } /*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/ if(!mysql_select_db($dbname,$link)) { die("Select Database Failed: " . mysql_error($link)); } // 创建数据表用的,看一下结构就好了 $create_table_sql = "create table if not exists system( `_id` int(10) AUTO_INCREMENT, `wx_appid` char(20), `wx_appsecret` char(36), `wx_token` char(32), `wx_access_token` text(1024), `wx_access_token_timeout` timestamp(14) default 0, PRIMARY KEY (`_id`) )ENGINE=MyISAM DEFAULT CHARSET=UTF8"; $query_sql = "select wx_access_token, wx_access_token_timeout from system"; $ret = mysql_query($query_sql,$link); while($row = mysql_fetch_array($ret)) { // 数据表里面是有且仅有一条数据 $wx_access_token = $row['wx_access_token']; $wx_access_token_timeout = $row['wx_access_token_timeout']; } if(D) echo ("wx_access_token_timeout:".strtotime($wx_access_token_timeout)."<br />"); if(D) echo ("wx_access_token:".$wx_access_token."<br />"); if(D) echo "现在时间:"; if(D) echo time(); if(D) echo "<br />"; // 判断access_token失效时间是否晚于现在时间减去20秒,如果晚的话 那就需要重新获取了 // 为什么要算一个20秒,防止因为网络延迟问题,导致在快过期的那个时间点,导致access_token失效 if(D) echo "时间比较:"; if(D) var_dump (strtotime($wx_access_token_timeout) < (time() - 20)); if(D) echo "<br />-----------<br />"; if(strtotime($wx_access_token_timeout) < (time() - 20)) { // 需要重新获取微信access_token $token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".appID."&secret=".appsecret; //获取文件内容或获取网络请求的内容 $res = file_get_contents($token_access_url); $result = json_decode($res, true); $end_time = $result['expires_in'] + time(); $access_token = $result['access_token']; if(D) echo $end_time; if(D) echo "<br/>"; if(D) echo $access_token; if(D) echo "<br/>"; // 更新数据库 $update_sql = "update `gvGAiDLkiAoflAD00000`.`system` set `wx_access_token`='".$access_token."', `wx_access_token_timeout` ='".date("Y-m-d H:i:s",$end_time)."' WHERE `system`.`_id`=1"; if(D) echo $update_sql; $ret = mysql_query($update_sql,$link); echo $access_token; }else{ echo $wx_access_token; } mysql_close($link); ?>
如果有不懂的地方,代可以在写评论给我