微信公衆號開發----獲取access_token,定時刷新access_token

首先先查看微信公衆技術文檔之獲取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();
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章