首先先查看微信公众技术文档之获取access_token,了解各参数含义
前提:获取到公众号的AppId和AppSecret
一、常量类
/**
* 公众号相关
*/
public class WechatConst {
//公众号的唯一标识
public static final String appId = "appId";
//公众号的appsecret
public static final String appSecret = "appSecret";
//accessToken
public static String ACCESS_TOKEN = "";
/**
* 获取access_token的URL
*/
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
}
二、创建实体类
AccessToken
/**
* 封装AccessToken实体
*/
public class AccessToken {
private String accessToken;
private int expiresIn;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public int getExpiresIn() {
return expiresIn;
}
}
三、工具类
用于发送POST或GET请求:HttpUtil类
四、定时刷新
import com.alibaba.fastjson.JSONObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* 定时刷新accessToken
*/
public class AccessTokenRefresher {
private static Logger log = LogManager.getLogger(AccessTokenRefresher.class);
private int organizationId;
private Thread listener;
public static final AccessTokenRefresher me = new AccessTokenRefresher();
public void start(){
//获取各个机构的AccessToken并定时更新
List<Organization> organizations =Organization.dao.find(SQL.SELECT_ALL_ORGANIZATION_ID);
for (Organization organization:organizations){
start(organization.getId());
}
}
public void start(int id){
this.organizationId = id;
listener = new Thread(()->refresh());
listener.setName("access_token_thread_"+id);
listener.start();
}
public void refresh() {
int retryTimes = 0;
while (true) {
AccessToken accessToken = getAccessToken(organizationId);
if (null != accessToken) {
AccessTokenRedisDao.set(accessToken.getAccessToken(),organizationId);
try {
Thread.sleep((accessToken.getExpiresIn()-200)*1000);//休眠7000秒
} catch (InterruptedException e) {
e.printStackTrace();
}
retryTimes = 0;
} else {
// 当accessToken获取不成功时重试1次
if (retryTimes >= 1) {
break;
}
retryTimes += 1;
}
}
}
/**
* 获取access_token
* @return
*/
private AccessToken getAccessToken(int organizationId){
Organization organization = Organization.dao.findById(organizationId);
//公众号的唯一标识
String appId = organization.getSubscriptionId();
//公众号的appsecret
String appSecret = organization.getSubscriptionKey();
AccessToken accessToken = new AccessToken();
String url = WechatConst.ACCESS_TOKEN_URL.replace("APPID" ,appId).replace("APPSECRET",appSecret);
JSONObject jsonObject = HttpsUtil.request(url, "GET", null);
if(jsonObject !=null){
Integer errCode = jsonObject.getInteger("errcode");
if (errCode == null) {
accessToken.setAccessToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInteger("expires_in"));
}else {
log.warn("获取access_token失败:"+jsonObject.toJSONString());
return null;
}
}
return accessToken;
}
public void shutdown(){
listener.interrupt();
}
}
五、项目启动后开启定时刷新
本人使用的框架为Jfinal:
public void afterJFinalStart() {
//定时刷新accessToken
AccessTokenRefresher.me.start();
}