access_token是公众号的全局唯一接口调用凭据,
公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
access_token每日调用上限次数是2000次/日。
解决:
如何保证access_token一直都有效?
微信公众平台开发文档
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
接口请求方式
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
注意!!!
本文中获取access_token值会调用一个工具类,需要相关的核心包,当然也有其他方式发送请求来获取,如有需要可以练习我共同探讨
我的个人QQ:1285906731

方案一:
在项目启动时开启一个循环线程来获取access_token,获取完毕以后让线程休眠,休眠结束有再次重写获取access_token,以此来实现定时获取access_token
一、自定义一个线程类
public class AccessTokenThread extends Thread {
//access_token值
public static String ACCESS_TOKEN_VAL;
@Override
public void run(){
//死循环,使线程在项目启动以后一直运行,并定时获取access_token值
while (true){
//获取access_token值并赋值给全局变量
ACCESS_TOKEN_VAL = this.getAccessToken();
try {//线程睡眠2小时,也就是每隔俩小时获取一次access_token
Thread.sleep(1000*60*50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//获取微信access_token
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public String getAccessToken(){
//将地址中的appId和appSecret替换为自己真实微信测试账号中的对应值
String url = ACCESS_TOKEN_URL.replace("APPID", MenuManager.appId).replace("APPSECRET",MenuManager.appSecret);
//调用工具类发送请求,返回json数据,返回的数据中就包含了access_token值
JSONObject json = WeixinUtil.httpRequest(url,"GET",null);
System.out.println(json.toString());
return json.getString("access_token");
}
}
二、创建一个监听器,使项目启动时就创建线程并运行
//监听器
@Component
public class AccessTokenListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//启动线程获取token
new AccessTokenThread().start();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("销毁");
}
}
三、此时启动项目,创建的线程会定时发送请求获取access_token值进行打印

方案二:
将获取到的access_token值存入Redis数据库中,并设置过期时间,这样每次到数据库中查询access_token值,如果过去不存在就重新发送请求获取access_token值
一、整合Redis,启动Linux系统并启动dockers Redis ,使其保持连接
二、创建一个类,获取access_token值,存入数据库并设置过期时间
@Component
public class AccessTokenRedis {
//access_token值
private static final String REDIS_KEY_ACCESS_TOKEN = "access_token:val";
@Autowired
private RedisTemplate<String,Object> redisTemplate;
public String getAccessTokenValRedis(){
//如果数据库中access_token的key值不为空,返回value值
if(redisTemplate.hasKey(REDIS_KEY_ACCESS_TOKEN)){
return (String) redisTemplate.opsForValue().get(REDIS_KEY_ACCESS_TOKEN);
}else {
//获取access_token值
String result = getAccessToken();
//存入Redis
redisTemplate.opsForValue().set(REDIS_KEY_ACCESS_TOKEN,result);
//设置两小时过期时间
redisTemplate.expire(REDIS_KEY_ACCESS_TOKEN,5, TimeUnit.SECONDS);
//返回结果
return result;
}
}
//获取微信access_token
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
private String getAccessToken(){
String url = ACCESS_TOKEN_URL.replace("APPID", MenuManager.appId).replace("APPSECRET",MenuManager.appSecret);
JSONObject json = WeixinUtil.httpRequest(url,"GET",null);
System.out.println(json.toString());
return json.getString("access_token");
}
}
这样,每次调用getAccessTokenValRedis方法时就会查询Redis数据库,一旦发现access_token过期就向微信平台发送请求重新获取