access_token是公眾號的全局唯一接口調(diào)用憑據(jù)悯森,
公眾號調(diào)用各接口時都需使用access_token燎竖。開發(fā)者需要進行妥善保存灶壶。
access_token的存儲至少要保留512個字符空間陕靠。
access_token的有效期目前為2個小時喳坠,需定時刷新鞠评,重復獲取將導致上次獲取的access_token失效。
access_token每日調(diào)用上限次數(shù)是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,第一次獲取的靜態(tài)變量ACCESS_TOKEN是null,就手動調(diào)用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里有,就直接返回
* 沒有就調(diào)用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 循環(huán)獲取access_token,每次調(diào)用都會休眠2小時;
AccessTokenListener監(jiān)聽器用于啟動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關閉了");
}
}