連小白都能看懂的微信開發之獲取access_token

獲取access_token

access_token 做爲微信接口全局訪問的惟一調用憑據 ,公衆號調用各個接口時候都須要使用access_token 。java

access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。 json

注意:小程序

access_token 儘可能獲取一次,而後各個地方調用便可,切勿屢次請求接口獲取,防止形成衝突。

文檔原文以下:api

在這裏插入圖片描述

獲取方式

接口調用請求說明安全

https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

參數說明服務器

參數 是否必須 說明
grant_type 獲取access_token填寫client_credential
appid 第三方用戶惟一憑證
secret 第三方用戶惟一憑證密鑰,即appsecret

返回說明微信

正常狀況下,微信會返回下述JSON數據包給公衆號:app

{"access_token":"ACCESS_TOKEN","expires_in":7200}

參數說明微信公衆平臺

參數 說明
access_token 獲取到的憑證
expires_in 憑證有效時間,單位:秒

錯誤時微信會返回錯誤碼等信息,JSON數據包示例以下(該示例爲AppID無效錯誤):工具

{"errcode":40013,"errmsg":"invalid appid"}

返回碼說明

返回碼 說明
-1 系統繁忙,此時請開發者稍候再試
0 請求成功
40001 AppSecret錯誤或者AppSecret不屬於這個公衆號,請開發者確認AppSecret的正確性
40002 請確保grant_type字段值爲client_credential
40164 調用接口的IP地址不在白名單中,請在接口IP白名單中進行設置。(小程序及小遊戲調用不要求IP地址在白名單內。)

代碼實現

實體類

public class AccessToken {

    private String expires_in; //成功有效時間
    private String access_token;  // 普通Token
    private String errcode; //失敗ID
    private String errmsg; //失敗消息
    private long expiresIn; //過時時間 , 默認2小時

    public long getExpiresIn() {
        return expiresIn;
    }

    public void setExpiresIn(long expiresIn) {
        this.expiresIn = expiresIn;
    }

    public String getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(String expires_in) {
        this.expires_in = expires_in;
    }

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public String getErrcode() {
        return errcode;
    }

    public void setErrcode(String errcode) {
        this.errcode = errcode;
    }

    public String getErrmsg() {
        return errmsg;
    }

    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    /**
     *
     * @param expires_in 從微信服務器獲取到的過時時間
     * @param access_token 從微信服務器獲取到的過時時間access-token
     */
    public AccessToken(String expires_in, String access_token) {
        this.access_token = access_token;
        //當前系統時間+上過時時間
        expiresIn = System.currentTimeMillis() + Integer.parseInt(expires_in) * 1000;
    }

    //判斷token是否過時
    public boolean isExpired() {
        return System.currentTimeMillis() > expiresIn;
    }
}

HttpUtil工具

/**
     * @param url 發送get請求方法
     * @return
     */
    public static String sendHttpByGet(String url){
        try {
            URL urlGet = new URL(url);
            URLConnection urlConnection = urlGet.openConnection();
            InputStream is = urlConnection.getInputStream();
            String inputStreamData = getInputStreamData(is);
            return inputStreamData;
        } catch (Exception e) {
            logger.info("發送get請求方法異常! " + e);
            e.printStackTrace();
        }
        return null;
    }

請求獲取

public class AccessTokenTool {

    static Logger logger = LoggerFactory.getLogger(AccessTokenTool.class);
    //本身的appid 和 appsecret
    private static final String APPID = "wxb24662xxxx";
    private static final String APPSECRET = "1864f91ecdd3xxxxxxxxxxx";
    //用於存儲token
    private static AccessToken at;

    /**
     * @return
     * @throws Exception
     */
    private static com.example.bwjf.demo.pojo.AccessToken getAccessToken(){
        String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
        accessTokenUrl = accessTokenUrl.replace("APPID",APPID).replace("APPSECRET",APPSECRET);
        logger.info(" 微信全局token的url " + accessTokenUrl );

        String message = HttpUtil.sendHttpByGet(accessTokenUrl);

            /**
             *  獲取access_token
             *  成功返回的json : {"access_token":"ACCESS_TOKEN","expires_in":7200}
             *  失敗放的json  : {"errcode":40013,"errmsg":"invalid appid"}
             *
             */
            JSONObject jsonObject = JSONObject.parseObject(message);
            String accessToken = jsonObject.getString("access_token");
            String expires_in = jsonObject.getString("expires_in");
            String errcode = jsonObject.getString("errcode");

            logger.info("accessToken = " + accessToken);
            logger.info("expires_in = "+ expires_in);

            if(!jsonObject.containsKey(errcode)){
                //建立token,而且存起來
                at = new AccessToken(expires_in,accessToken);
                return at;
            }

        return null;
    }


    /**
     * 對外提供獲取 AccessTokenTool
     * @return
     */
    public static String getToken(){
        if(at==null || at.isExpired() == false){
            //logger.info("過時");
            try {
                getAccessToken();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return at.getAccess_token();
    }
    
}

注:

認證後公衆號,可能出現的問題調用Api無權限或者爲空 (開發者測試帳號除外 )

請在微信公衆平臺,安全中心設置ip白名單便可!

相關文章
相關標籤/搜索