国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

微信公眾平臺(tái)獲取access_token的方法步驟

2019-11-19 11:55:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言:access_token是微信公眾平臺(tái)接口的重要參數(shù),很多接口都需要這個(gè)參數(shù)。

微信公眾平臺(tái)文檔地址:微信公眾平臺(tái)技術(shù)文檔

一、access_token說(shuō)明

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均來(lái)自于該中控服務(wù)器,不應(yīng)該各自去刷新,否則容易造成沖突,導(dǎo)致access_token覆蓋而影響業(yè)務(wù);
2、目前Access_token的有效期通過(guò)返回的expire_in來(lái)傳達(dá),目前是7200秒之內(nèi)的值。中控服務(wù)器需要根據(jù)這個(gè)有效時(shí)間提前去刷新新access_token。在刷新過(guò)程中,中控服務(wù)器對(duì)外輸出的依然是老access_token,此時(shí)公眾平臺(tái)后臺(tái)會(huì)保證在刷新短時(shí)間內(nèi),新老access_token都可用,這保證了第三方業(yè)務(wù)的平滑過(guò)渡;
3、Access_token的有效時(shí)間可能會(huì)在未來(lái)有調(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的生成說(shuō)明

公眾號(hào)可以使用AppID和AppSecret調(diào)用本接口來(lái)獲取access_token。AppID和AppSecret可在“微信公眾平臺(tái)-開發(fā)-基本配置”頁(yè)中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ?hào)沒(méi)有異常狀態(tài))。調(diào)用接口時(shí),請(qǐng)登錄“微信公眾平臺(tái)-開發(fā)-基本配置”提前將服務(wù)器IP地址添加到IP白名單中,點(diǎn)擊查看設(shè)置方法,否則將無(wú)法調(diào)用成功。

二、接口調(diào)用請(qǐng)求說(shuō)明

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ù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
grant_type 獲取access_token填寫client_credential
appid 第三方用戶唯一憑證
secret 第三方用戶唯一憑證密鑰,即appsecret

3:返回說(shuō)明

正常情況下,微信會(huì)返回下述JSON數(shù)據(jù)包給公眾號(hào):

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

參數(shù)說(shuō)明

參數(shù) 說(shuō)明
access_token 獲取到的憑證
expires_in 憑證有效時(shí)間,單位:秒

錯(cuò)誤時(shí)微信會(huì)返回錯(cuò)誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無(wú)效錯(cuò)誤):

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

4:返回碼說(shuō)明

返回碼 說(shuō)明
-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 {  // 接口訪問(wèn)憑證  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:獲取接口訪問(wèn)憑證

  /**   * 獲取接口訪問(wèn)憑證   * @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(通過(guò)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接口簡(jiǎn)單歸納就是按照接口地址通過(guò)GET方式傳遞appid和appsecret兩個(gè)參數(shù)發(fā)送http請(qǐng)求,獲取access_token。看似很簡(jiǎn)單,請(qǐng)求后也可以獲取access_token參數(shù),但是微信公眾平臺(tái)的接口文檔也說(shuō)明了,access_token的有效期是7200秒,而且還需要中控服務(wù)器去控制access_token的刷新,所以建議將生產(chǎn)的access_token存放在redis中,redis緩存的有效時(shí)間等于access_token的有效時(shí)間。這樣可以避免接口的不必要請(qǐng)求,減少并發(fā)量。先去redis中判斷access_token是否有效,有效就獲取,無(wú)效再去請(qǐng)求接口。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁乡县| 漳浦县| 江华| 峨山| 麟游县| 犍为县| 依兰县| 民乐县| 铁岭市| 荣成市| 隆回县| 孟州市| 大埔县| 濮阳县| 武乡县| 长兴县| 辉南县| 晋宁县| 沾化县| 内丘县| 凌云县| 泸定县| 沁源县| 黄浦区| 万荣县| 盘山县| 长乐市| 江西省| 漳浦县| 琼结县| 明光市| 新乡县| 丰城市| 呼图壁县| 南乐县| 清新县| 长岛县| 公安县| 合水县| 宁安市| 梅河口市|