微信里面的很多操作需要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);
?>
如果有不懂的地方,代可以在写评论给我