微信access_token 是有时间限制的 每天获取的次数是有限的 所有我们要保存获取到的access_token ,在快要过期的时候在重新获取.
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
package com.tonglifang.common.beans;
import com.alibaba.fastjson.JSONObject;
import com.tonglifang.common.constant.Wechat;
import com.tonglifang.common.utils.WechatUtils;
/**
* 饿汉式单例模式保存accessToken
* 线程安全;获取实例速度快
* @Author: liangkesai
* @CreateDate: 2018/8/16 19:14
*/
public class Token {
private String accessToken;
private Long expiryTime ; //过期时间
private static Token token = new Token();
private Token(){}
public static Token getInstance() {
//如果过期时间为空,那么立即从微信获取accessToken
if(null == token.expiryTime){
init();
}else {
//过期时间不为空 判断当前时间 >= 过期时间
//即accseeToken已经过期 重新从微信获取
if(System.currentTimeMillis() >= token.expiryTime){
init();
}
}
return token;
}
/**
* 初始化
*/
private static void init() {
//请求微信服务器获取accseeToken
JSONObject json = WechatUtils.getAccessToken(Wechat.APPID,Wechat.APPSECRET);
token.accessToken = json.getString("access_token");
//过期时间的毫秒数 100分钟后过期 微信文档的过期时间为120分钟 我们提前20分钟叫它过期
token.expiryTime = System.currentTimeMillis()+1000*60*100L;
}
public String getAccessToken() {
return accessToken;
}
}
/**获取access_token*/
private static final String ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
/**
* 从腾讯获取获取accessToken
* String accessToken = demoJson.getString("access_token");
* String expiresIn = demoJson.getString("expires_in");
* @param appId
* @param appSecret
* @return
*/
public static JSONObject getAccessToken(String appId,String appSecret){
String param = "grant_type=client_credential&appid="+appId+"&secret="+appSecret;
String result = UrlUtils.sendGet(ACCESS_TOKEN,param);
JSONObject demoJson = JSONObject.parseObject(result);
log.info("##从腾讯获取获取accessToken: "+demoJson);
return demoJson;
}
UrlUtils :https://blog.youkuaiyun.com/qq_34706514/article/details/82658380
这样获取到Token后会保存在内存中.在用的地方直接调用,不会起冲突,
Token token = Token.getInstance();
String accessToken = token.getAccessToken();
如果accesstoken要跨系统使用 ,可以自己开接口进行调用