access_token是公众号的全局唯一接口调用凭据,
公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
access_token每日调用上限次数是2000次/日。
public class AccessTokenCommon {
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public final static String APPID = "APPID";
public final static String APPSECRET = "APPSECRET值";
public static String ACCESS_TOKEN=null;
}
第一种方式:SpringTask定时任务
每两个小时获取一次access_token
需要判断ACCESS_TOKEN是否为null,第一次获取的静态变量ACCESS_TOKEN是null,就手动调用getAccessToken方法获取access_token
@Scheduled(cron = "* * 0/2 * * ?")
public void getAccessToken() {
// System.out.println(1);
String requestUrl = AccessTokenCommon.ACCESS_TOKEN_URL.replace("APPID", AccessTokenCommon.APPID).replace("APPSECRET", AccessTokenCommon.APPSECRET);
jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
AccessTokenCommon.ACCESS_TOKEN = jsonObject.getString("access_token");
System.out.println(AccessTokenCommon.ACCESS_TOKEN );
}
第二种方式:存在redis中
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String,String> redisTemplate;
JSONObject jsonObject = null;
/**
* @Description :
* @author : wc
* @param : access_token的获取第二种方式
* 获取access_token,如果redis里有,就直接返回
* 没有就调用getAccessToken获取,再存储到redis中,设置过期时间2小时
* @CreateDate : 2020/8/6 17:20
* @exception :
* @return :
*/
public String getAccess_token(){
AccessTokenCommon.ACCESS_TOKEN = redisTemplate.opsForValue().get("access_token_redis");
if (AccessTokenCommon.ACCESS_TOKEN !=null){
return AccessTokenCommon.ACCESS_TOKEN ;
}else {
AccessTokenCommon.ACCESS_TOKEN = getAccessToken();
redisTemplate.opsForValue().set("access_token_redis",AccessTokenCommon.ACCESS_TOKEN ,2, TimeUnit.HOURS);
return AccessTokenCommon.ACCESS_TOKEN ;
}
}
public String getAccessToken() {
String requestUrl = AccessTokenCommon.ACCESS_TOKEN_URL.replace("APPID", AccessTokenCommon.APPID).replace("APPSECRET", AccessTokenCommon.APPSECRET);
jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
AccessTokenCommon.ACCESS_TOKEN = jsonObject.getString("access_token");
System.out.println(AccessTokenCommon.ACCESS_TOKEN );
return AccessTokenCommon.ACCESS_TOKEN ;
}
}
第三种方式:线程
AccessTokenThreadUtil 循环获取access_token,每次调用都会休眠2小时;
AccessTokenListener监听器用于启动AccessTokenThreadUtil线程
public class AccessTokenThreadUtil extends Thread {
JSONObject jsonObject = null;
String access_token = null;
@Override
public void run() {
while (true){
this.getAccessToken();
try {
Thread.sleep(7200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void getAccessToken() {
// System.out.println(1);
String requestUrl = AccessTokenCommon.ACCESS_TOKEN_URL.replace("APPID", AccessTokenCommon.APPID).replace("APPSECRET", AccessTokenCommon.APPSECRET);
jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
AccessTokenCommon.ACCESS_TOKEN = jsonObject.getString("access_token");
System.out.println(AccessTokenCommon.ACCESS_TOKEN );
}
}
//@Component
public class AccessTokenListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
new AccessTokenThreadUtil().start();
System.out.println("我的servlet开启了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("我的servlet关闭了");
}
}