微信公眾平臺(tái)獲取access_token的方法步驟
前言:access_token是微信公眾平臺(tái)接口的重要參數(shù),很多接口都需要這個(gè)參數(shù)。
微信公眾平臺(tái)文檔地址:微信公眾平臺(tái)技術(shù)文檔
一、access_token說明
access_token是公眾號(hào)的全局唯一接口調(diào)用憑據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。開發(fā)者需要進(jìn)行妥善保存。access_token的存儲(chǔ)至少要保留512個(gè)字符空間。access_token的有效期目前為2個(gè)小時(shí),需定時(shí)刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
1:公眾平臺(tái)的API調(diào)用所需的access_token的使用
1、建議公眾號(hào)開發(fā)者使用中控服務(wù)器統(tǒng)一獲取和刷新Access_token,其他業(yè)務(wù)邏輯服務(wù)器所使用的access_token均來自于該中控服務(wù)器,不應(yīng)該各自去刷新,否則容易造成沖突,導(dǎo)致access_token覆蓋而影響業(yè)務(wù);
2、目前Access_token的有效期通過返回的expire_in來傳達(dá),目前是7200秒之內(nèi)的值。中控服務(wù)器需要根據(jù)這個(gè)有效時(shí)間提前去刷新新access_token。在刷新過程中,中控服務(wù)器對(duì)外輸出的依然是老access_token,此時(shí)公眾平臺(tái)后臺(tái)會(huì)保證在刷新短時(shí)間內(nèi),新老access_token都可用,這保證了第三方業(yè)務(wù)的平滑過渡;
3、Access_token的有效時(shí)間可能會(huì)在未來有調(diào)整,所以中控服務(wù)器不僅需要內(nèi)部定時(shí)主動(dòng)刷新,還需要提供被動(dòng)刷新access_token的接口,這樣便于業(yè)務(wù)服務(wù)器在API調(diào)用獲知access_token已超時(shí)的情況下,可以觸發(fā)access_token的刷新流程。
2:access_token的生成說明
公眾號(hào)可以使用AppID和AppSecret調(diào)用本接口來獲取access_token。AppID和AppSecret可在“微信公眾平臺(tái)-開發(fā)-基本配置”頁中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ?hào)沒有異常狀態(tài))。調(diào)用接口時(shí),請(qǐng)登錄“微信公眾平臺(tái)-開發(fā)-基本配置”提前將服務(wù)器IP地址添加到IP白名單中,點(diǎn)擊查看設(shè)置方法,否則將無法調(diào)用成功。
二、接口調(diào)用請(qǐng)求說明
1:接口調(diào)用
https請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2:參數(shù)說明
參數(shù) | 是否必須 | 說明 |
---|---|---|
grant_type | 是 | 獲取access_token填寫client_credential |
appid | 是 | 第三方用戶唯一憑證 |
secret | 是 | 第三方用戶唯一憑證密鑰,即appsecret |
3:返回說明
正常情況下,微信會(huì)返回下述JSON數(shù)據(jù)包給公眾號(hào):
{"access_token":"ACCESS_TOKEN","expires_in":7200}
參數(shù)說明
參數(shù) | 說明 |
---|---|
access_token | 獲取到的憑證 |
expires_in | 憑證有效時(shí)間,單位:秒 |
錯(cuò)誤時(shí)微信會(huì)返回錯(cuò)誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無效錯(cuò)誤):
{"errcode":40013,"errmsg":"invalid appid"}
4:返回碼說明
返回碼 | 說明 |
---|---|
-1 | 系統(tǒng)繁忙,此時(shí)請(qǐng)開發(fā)者稍候再試 |
0 | 請(qǐng)求成功 |
40001 | AppSecret錯(cuò)誤或者AppSecret不屬于這個(gè)公眾號(hào),請(qǐng)開發(fā)者確認(rèn)AppSecret的正確性 |
40002 | 請(qǐng)確保grant_type字段值為client_credential |
40164 | 調(diào)用接口的IP地址不在白名單中,請(qǐng)?jiān)诮涌贗P白名單中進(jìn)行設(shè)置 |
三、java接口開發(fā)
1:返回接口封裝類Token
/** * 類名: Token.java</br> * 描述: 憑證</br> */ public class Token { // 接口訪問憑證 private String accessToken; // 憑證有效期,單位:秒 private int expiresIn; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public int getExpiresIn() { return expiresIn; } public void setExpiresIn(int expiresIn) { this.expiresIn = expiresIn; } }
2:獲取接口訪問憑證
/** * 獲取接口訪問憑證 * @param appid 憑證 * @param appsecret 密鑰 * @return */ public static Token getToken(String appid, String appsecret) { Token token = null; String requestUrl = WeixinConstants.TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret); // 發(fā)起GET請(qǐng)求獲取憑證 JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { token = new Token(); token.setAccessToken(jsonObject.getString("access_token")); token.setExpiresIn(jsonObject.getInt("expires_in")); } catch (JSONException e) { token = null; // 獲取token失敗 log.error("獲取token失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } return token; }
3:http請(qǐng)求工具類
/** * 發(fā)送https請(qǐng)求 * @param requestUrl 請(qǐng)求地址 * @param requestMethod 請(qǐng)求方式(GET、POST) * @param outputStr 提交的數(shù)據(jù) * @return JSONObject(通過JSONObject.get(key)的方式獲取json對(duì)象的屬性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; try { // 創(chuàng)建SSLContext對(duì)象,并使用我們指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 從上述SSLContext對(duì)象中得到SSLSocketFactory對(duì)象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 設(shè)置請(qǐng)求方式(GET/POST) conn.setRequestMethod(requestMethod); // 當(dāng)outputStr不為null時(shí)向輸出流寫數(shù)據(jù) if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意編碼格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 從輸入流讀取返回內(nèi)容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("連接超時(shí):{}", ce); } catch (Exception e) { log.error("https請(qǐng)求異常:{}", e); } return jsonObject; }
4:信任管理器工具類
/** * 類名: MyX509TrustManager.java</br> * 描述: 信任管理器</br> */ public class MyX509TrustManager implements X509TrustManager { // 檢查客戶端證書 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 檢查服務(wù)器端證書 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 返回受信任的X509證書數(shù)組 public X509Certificate[] getAcceptedIssuers() { return null; } }
四、總結(jié)
上述java接口簡單歸納就是按照接口地址通過GET方式傳遞appid和appsecret兩個(gè)參數(shù)發(fā)送http請(qǐng)求,獲取access_token??此坪芎唵?,請(qǐng)求后也可以獲取access_token參數(shù),但是微信公眾平臺(tái)的接口文檔也說明了,access_token的有效期是7200秒,而且還需要中控服務(wù)器去控制access_token的刷新,所以建議將生產(chǎn)的access_token存放在redis中,redis緩存的有效時(shí)間等于access_token的有效時(shí)間。這樣可以避免接口的不必要請(qǐng)求,減少并發(fā)量。先去redis中判斷access_token是否有效,有效就獲取,無效再去請(qǐng)求接口。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 微信公眾號(hào)獲取access_token的方法實(shí)例分析
- java獲取微信accessToken的方法
- 微信公眾號(hào)平臺(tái)接口開發(fā) 獲取access_token過程解析
- 詳解微信開發(fā)之a(chǎn)ccess_token之坑
- php獲取微信基礎(chǔ)接口憑證Access_token
- 微信小程序登錄換取token的教程
- 微信小程序url與token設(shè)置詳解
- Java微信公眾平臺(tái)開發(fā)(6) 微信開發(fā)中的token獲取
- 基于thinkPHP3.2實(shí)現(xiàn)微信接入及查詢token值的方法
- 微信公眾號(hào)服務(wù)器驗(yàn)證Token步驟圖解
相關(guān)文章
JS canvas實(shí)現(xiàn)畫板和簽字板功能
這篇文章主要為大家詳細(xì)介紹了JS canvas實(shí)現(xiàn)畫板和簽字板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02js刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組方法示例
這篇文章主要給大家介紹了關(guān)于js刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編一起來看看吧2018-11-11Bootstrap彈出框modal上層的輸入框不能獲得焦點(diǎn)問題的解決方法
這篇文章主要介紹了Bootstrap彈出框modal上層的輸入框不能獲得焦點(diǎn)問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12JS利用原生canvas實(shí)現(xiàn)圖形標(biāo)注功能
這篇文章主要為大家詳細(xì)介紹了JS如何利用原生canvas實(shí)現(xiàn)圖形標(biāo)注功能,支持矩形、多邊形、線段、圓形等已繪制的圖形進(jìn)行縮放,移動(dòng),需要的可以參考下2024-03-03javascript將16進(jìn)制的字符串轉(zhuǎn)換為10進(jìn)制整數(shù)hex
這篇文章主要介紹了javascript將16進(jìn)制的字符串轉(zhuǎn)換為10進(jìn)制整數(shù)hex,需要的朋友可以參考下2020-03-03利用es6 new.target來對(duì)模擬抽象類的方法
這篇文章主要介紹了利用es6 new.target來對(duì)模擬抽象類的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05