微信公眾平臺獲取access_token的方法步驟
前言:access_token是微信公眾平臺接口的重要參數(shù),很多接口都需要這個參數(shù)。
微信公眾平臺文檔地址:微信公眾平臺技術(shù)文檔
一、access_token說明
access_token是公眾號的全局唯一接口調(diào)用憑據(jù),公眾號調(diào)用各接口時都需使用access_token。開發(fā)者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效。
1:公眾平臺的API調(diào)用所需的access_token的使用
1、建議公眾號開發(fā)者使用中控服務器統(tǒng)一獲取和刷新Access_token,其他業(yè)務邏輯服務器所使用的access_token均來自于該中控服務器,不應該各自去刷新,否則容易造成沖突,導致access_token覆蓋而影響業(yè)務;
2、目前Access_token的有效期通過返回的expire_in來傳達,目前是7200秒之內(nèi)的值。中控服務器需要根據(jù)這個有效時間提前去刷新新access_token。在刷新過程中,中控服務器對外輸出的依然是老access_token,此時公眾平臺后臺會保證在刷新短時間內(nèi),新老access_token都可用,這保證了第三方業(yè)務的平滑過渡;
3、Access_token的有效時間可能會在未來有調(diào)整,所以中控服務器不僅需要內(nèi)部定時主動刷新,還需要提供被動刷新access_token的接口,這樣便于業(yè)務服務器在API調(diào)用獲知access_token已超時的情況下,可以觸發(fā)access_token的刷新流程。
2:access_token的生成說明
公眾號可以使用AppID和AppSecret調(diào)用本接口來獲取access_token。AppID和AppSecret可在“微信公眾平臺-開發(fā)-基本配置”頁中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ枦]有異常狀態(tài))。調(diào)用接口時,請登錄“微信公眾平臺-開發(fā)-基本配置”提前將服務器IP地址添加到IP白名單中,點擊查看設(shè)置方法,否則將無法調(diào)用成功。

二、接口調(diào)用請求說明
1:接口調(diào)用
https請求方式: 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:返回說明
正常情況下,微信會返回下述JSON數(shù)據(jù)包給公眾號:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
參數(shù)說明
| 參數(shù) | 說明 |
|---|---|
| access_token | 獲取到的憑證 |
| expires_in | 憑證有效時間,單位:秒 |
錯誤時微信會返回錯誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
4:返回碼說明
| 返回碼 | 說明 |
|---|---|
| -1 | 系統(tǒng)繁忙,此時請開發(fā)者稍候再試 |
| 0 | 請求成功 |
| 40001 | AppSecret錯誤或者AppSecret不屬于這個公眾號,請開發(fā)者確認AppSecret的正確性 |
| 40002 | 請確保grant_type字段值為client_credential |
| 40164 | 調(diào)用接口的IP地址不在白名單中,請在接口IP白名單中進行設(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請求獲取憑證
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請求工具類
/**
* 發(fā)送https請求
* @param requestUrl 請求地址
* @param requestMethod 請求方式(GET、POST)
* @param outputStr 提交的數(shù)據(jù)
* @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值)
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 創(chuàng)建SSLContext對象,并使用我們指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 從上述SSLContext對象中得到SSLSocketFactory對象
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è)置請求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 當outputStr不為null時向輸出流寫數(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("連接超時:{}", ce);
} catch (Exception e) {
log.error("https請求異常:{}", e);
}
return jsonObject;
}
4:信任管理器工具類
/**
* 類名: MyX509TrustManager.java</br>
* 描述: 信任管理器</br>
*/
public class MyX509TrustManager implements X509TrustManager {
// 檢查客戶端證書
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 檢查服務器端證書
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 返回受信任的X509證書數(shù)組
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
四、總結(jié)
上述java接口簡單歸納就是按照接口地址通過GET方式傳遞appid和appsecret兩個參數(shù)發(fā)送http請求,獲取access_token??此坪芎唵?,請求后也可以獲取access_token參數(shù),但是微信公眾平臺的接口文檔也說明了,access_token的有效期是7200秒,而且還需要中控服務器去控制access_token的刷新,所以建議將生產(chǎn)的access_token存放在redis中,redis緩存的有效時間等于access_token的有效時間。這樣可以避免接口的不必要請求,減少并發(fā)量。先去redis中判斷access_token是否有效,有效就獲取,無效再去請求接口。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用JavaScript實現(xiàn)仿Windows關(guān)機效果
用JavaScript實現(xiàn)仿Windows關(guān)機效果...2007-03-03
JavaScript實現(xiàn)將文本框的值插入指定位置的方法
這篇文章主要介紹了JavaScript實現(xiàn)將文本框的值插入指定位置的方法,涉及javascript節(jié)點添加操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08

