php+MySQL基于百度BAE的微信公众平台获取access_token

时间:2022-09-22 19:52:56

微信里面的很多操作需要access_token来操作,但是access_token又是有效时间的,笔者写这个文章的时候,是7200秒的有效时间,然而微信一天允许获取access_token的次数是2000次

php+MySQL基于百度BAE的微信公众平台获取access_token

基于百度云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);
?>

如果有不懂的地方,代可以在写评论给我