access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。
正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。
access_token调用频率一天为2000次,如果简单的使用自定义菜单完全够用.只是微信推出多客服后,如果频繁发送客服消息,将有可能不够用
那么怎么延长,
1 使用定时器刷新
2 存储到数据库
使用定时器个人觉得,如果是个人开发影响不大.若是第三方服务平台的话,帐号一多,是不是带来很大的压力呢?
若是第三方服务平台,我更推荐使用数据库。公众平台的开发接口的access_token长度将增长,其存储至少要保留512个字符空间
使用数据库的话,大概思路就是这样的。第一次使用将其access_token存储起来,下次需要access_token则将其查出。若是失效则,重新创建并更新数据库.若是没有失效,则直接使用。
一:
数据库设计
CREATE TABLE `wx_access_token` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `access_token` varchar(600) NOT NULL COMMENT 'access_token凭证', `expires_in` bigint(20) NOT NULL COMMENT '凭证有效时间,单位:秒', `create_time` bigint(20) NOT NULL COMMENT '创建时间距离当前时间毫秒数', `userid` varchar(128) NOT NULL COMMENT 'userid', `create_date` varchar(25) NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
核心代码
省略第一次调用保存代码,相信大家都会
以后调用代码,先查询
// 存在
String _token = map.get("access_token") + "";
String expires_in = map.get("expires_in") + "";
String create_time = map.get("create_time") + "";
int _in = Integer.parseInt(expires_in);
long _time = Long.parseLong(create_time);
if ((System.currentTimeMillis()-_time)/1000 < _in) {// 有效
//System.out.println("无须创建");
accessToken = new AccessToken();
accessToken.setExpiresIn(_in);
accessToken.setToken(_token);
} else {// 无效
//System.out.println("无效重新创建");
Map map2 = new HashMap();
map2.put("create_time", System.currentTimeMillis());
map2.put("userid", uid);
accessToken = WxUtil.getAccessToken(appid, appsecret);
map2.put("access_token", accessToken.getToken());
map2.put("expires_in", accessToken.getExpiresIn());
wxDao.saveAccessToken(map2);//更新数据库
}public static AccessToken getAccessToken(String appid, String appsecret) {AccessToken accessToken = null;String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret;JSONObject jsonObject = httpRequest(requestUrl, "GET", null);// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessToken();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpiresIn(jsonObject.getInt("expires_in"));} catch (JSONException e) {accessToken = null;// 获取token失败log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return accessToken;}
public class AccessToken {
// 获取到的凭证
private String token;
// 凭证有效时间,单位:秒
private int expiresIn;
public String getToken() {
return token;
}