众所周知,在微信开发中,获取
access_token
的接口每天的调用次数是有限制的,2000
次应该是。
不过其实这些完全够用了,除非你不小心写了个循环,在1秒中内用完了。
每个access_token
的生效时间是2小时内
,2小时过后就需要重新申请一下。其实每天只需要申请12次就可以了。
不管你怎么申请,当前申请了access_token
,以前的就都不能用了。
所以解决办法就是:
在数据库中新建一个表token
盛放申请来的access_token
,字段有三个
access_token #存放access_token
expires #存放毫秒数
update_time #更新时间戳
- 1
- 2
- 3
逻辑是这样的:(表中只有一条数据)
查询表中数据
如果有数据,用 时间戳+更新时间 跟 现在时间比较,计算是否已过期:
如果已过期,重新申请,并更新数据库中数据,并返回access_token
如果没有过期,直接返回查询出的access_token
如果没数据:
申请数据并,插入数据库,返回access_tooken
- 1
- 2
- 3
- 4
- 5
- 6
查询表中数据是否有数据?查询数据是否过期向微信申请新token并插入数据库设置变量 access_token 的值返回 access_token输出数据库表中的access_token向微信申请新token并插入数据库yesnoyesno
/* --------------------- 获取access_token: 查询数据库中是否有数据, 如果有 取出数据 如果已经过期,查询,更新记录 如果没过期,直接返回数据 如果没有 查询并添加数据,返回数据 --------------------- */ function get_token(){ $access_url= 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.AppID.'&secret='.AppScret; //AppID AppScret 已经定义为常量 //数据库参数 $host= "1.1.1.1"; $port = '3306'; $database = "wx"; $user = "mysql"; $passwd = "mysql"; $db = new mysqli($host,$user,$passwd,$database,$port); $sql = "select * from token"; //查询wx表数据 $exist = $db->query($sql); global $access_token; if($exist->num_rows) //如果存在数据 { $row = $exist->fetch_array(); //如果数据已过期 if($row['expires']+$row['update_time']<time()){ $token = json_decode(file_get_contents($access_url)); $sql = "update token set access_token = '{$token->access_token}' where access_token = '{$row['access_token']}'"; $db->query($sql); $access_token = $token->access_token; //返回更新的token } else { $access_token = $row['access_token']; //返回查询的token } } //如果没有数据 else { $token = json_decode(file_get_contents($access_url)); $sql = "insert into token values('{$token->access_token}',{$token->expires_in},".time().")"; $db->query($sql); $access_token = $token->access_token; //返回新建的token } $db->close(); return $access_token; //返回access_token }