首先先查看微信公衆技術文檔之獲取access_token,瞭解各參數含義
前提:獲取到公衆號的AppId和AppSecret
一、常量類
/**
* 公衆號相關
*/
public class WechartConst {
//公衆號的唯一標識
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;
}
}
三、工具類
用於發送Http請求
public class HttpUtil {
private static Logger log = LogManager.getLogger(HttpUtil.class);
public static JSONObject request(String requestUrl,String requestMethod,String Output) {
StringBuffer buffer = new StringBuffer();
JSONObject jsonObject = null;
try {
URL conn_url = new URL(requestUrl);
HttpURLConnection conn = (HttpsURLConnection) conn_url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.connect();
// 當有數據需要提交時
if (Output != null) {
OutputStream outputstream = conn.getOutputStream();
//字符集,防止出現中文亂碼
outputstream.write(Output.getBytes("UTF-8"));
outputstream.close();
}
//正常返回代碼爲200
if (conn.getResponseCode() == 200) {
InputStream stream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(stream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
stream.close();
conn.disconnect();
}
} catch (ConnectException ce) {
log.error("connection timed out");
}catch (Exception e) {
log.error("https request error:{}", e);
}
jsonObject = JSONObject.parseObject(buffer.toString());
return jsonObject;
}
}
四、定時刷新
import com.alibaba.fastjson.JSONObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* 定時獲取accessToken
*/
public class AccessTokenThread extends Thread{
private static Logger log = LogManager.getLogger(AccessTokenThread.class);
// 當accessToken獲取不成功時重試次數
private static Integer RETRY_TIMES = 3;
@Override
public void run() {
int retryTimes = 0;
while (true) {
AccessToken accessToken = getAccessToken();
if (null != accessToken) {
WechartConst.ACCESS_TOKEN = accessToken.getAccessToken();
try {
Thread.sleep((accessToken.getExpiresIn()-200)*1000);//休眠7000秒
} catch (InterruptedException e) {
e.printStackTrace();
}
retryTimes = 0;
} else {
if (retryTimes >= RETRY_TIMES) {
break;
}
retryTimes += 1;
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 獲取access_token
* @return
*/
public static AccessToken getAccessToken(){
String appId = WechartConst.appId;
String appSecret = WechartConst.appSecret;
AccessToken accessToken = new AccessToken();
String url = WechartConst.ACCESS_TOKEN_URL.replace("APPID" ,appId).replace("APPSECRET",appSecret);
JSONObject jsonObject = HttpUtil.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.error("獲取access_token失敗:"+jsonObject.toJSONString());
return null;
}
}
return accessToken;
}
五、項目啓動後開啓定時刷新
本人使用的框架爲Jfinal:
public void afterJFinalStart() {
new AccessTokenThread().start();
}