在前四期的文章中,我們分別學(xué)習(xí)了“環(huán)境搭建與開發(fā)接入”、“文本消息的接收與響應(yīng)”、“被關(guān)注回復(fù)與關(guān)鍵詞回復(fù)”、“圖文消息的發(fā)送與響應(yīng)”等環(huán)節(jié)。那么,從本篇博文開始,我們將進(jìn)去更高級的開發(fā)層面,調(diào)用微信公眾平臺提供的各種接口。
今天,我們來學(xué)習(xí)一下微信公眾平臺最基礎(chǔ)的一個接口——access_token,access_token是公眾號的全局唯一票據(jù),公眾號調(diào)用各接口時都需使用access_token。
當(dāng)然,從本章開始,我們需要調(diào)用的各種接口,均需使用服務(wù)號開發(fā)。沒有服務(wù)號的小伙伴,可以選擇申請一個測試賬號,詳情查看系列博文第一篇<環(huán)境搭建與開發(fā)接入>
一、了解access_token
正如前言所述,access_token是公眾號的全局唯一票據(jù),公眾號調(diào)用各接口時都需使用access_token。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
公眾號可以使用AppID和AppSecret調(diào)用本接口來獲取access_token。AppID和AppSecret可在微信公眾平臺官網(wǎng)-開發(fā)者中心頁中獲得。且一個公眾號每天獲取access_token的次數(shù)上限為2000次。
①接口調(diào)用請求地址
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
② 需要傳遞參數(shù)說明
③ 返回參數(shù)說明
從上述請求地址,以及參數(shù)和響應(yīng)表格可以知道,我們需要通過請求傳遞三個參數(shù)給微信公眾平臺,分別是grant_type(獲取access_token填寫client_credential)、appid、appsecret,請求成功后,公眾平臺會將access_token以及有效期返回給我們。
二、組裝請求access_token的工具類
在了解了access_token之后,我們開始組裝一個工具類,來向服務(wù)器發(fā)送請求獲取access_token。在我們之前的Util包下,新建一個WeiXinUtil.java工具類
[劇透一下]由于在開發(fā)過程中,我們需要①將接收過來的結(jié)果轉(zhuǎn)成JSON格式?② 使用HttpClient發(fā)送HTTP請求,所以需要導(dǎo)入幾個Jar包,導(dǎo)入Jar包列表如下(其中,紅色框為第①部分所需,藍(lán)色框為第②部分所需):
Jar包導(dǎo)入完成后,進(jìn)入我們的代碼實戰(zhàn)環(huán)節(jié),打開我們的WeiXinUtil.java工具類,封裝三個常量,分別是我們的APPID、APPSECRET、以及請求access_token的URL:
接下來我們組裝兩個方法,分別是使用Get和Post對我們的URL發(fā)起請求,當(dāng)我們直接請求URL而不需要傳遞參數(shù)時,可使用Get請求,而當(dāng)我們需要傳遞參數(shù)的時候,就需要使用Post請求,這兩個請求的實現(xiàn),均需借助我們導(dǎo)入HttpClient這兩個Jar包:
① Get請求的實現(xiàn)(相關(guān)代碼解釋已在注釋闡明)
② Post請求的實現(xiàn)(相關(guān)代碼解釋已在注釋闡明)
三、創(chuàng)建AccessToken實體類
由第一部分返回結(jié)果說明我們可以知道,當(dāng)我們執(zhí)行請求URL,并且請求成功后,公眾平臺會將access_token以及有效期返回給我們。所以我們需要新建一個AccessToken實體類用于組裝返回結(jié)果,實體類屬性如下:
四、獲取Access_Token并編寫測試類
① 在WeiXinUtil.java工具類中,新增getAccessToken方法
② 編寫測試類,測試方法
③ 運行測試類,即可取到Access_Token及有效期
由于每個公眾賬號一天請求2000次Access_Token,在一些訪問量大的公眾號上顯然是不夠用的,因此我們可以將取到的Access_Token存到本地,每次使用時判斷是否過期,如果沒有過期就不要再發(fā)送請求啦~
這個問題呢,作為一個課后練習(xí),有能力的小伙伴可能自行嘗試哦~
【附】WeiXinUtil.Java 源碼部分
package com.jredu.util;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import com.jredu.entity.AccessToken;
import net.sf.json.JSONObject;
public class WeiXinUtil {
//從微信后臺拿到APPID和APPSECRET 并封裝為常量
private static final String APPID = "wxe09763a06d980f09";
private static final String APPSECRET = "3a6005a4c7589ca9e93297c72f7eaf4d";
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
* 編寫Get請求的方法。但沒有參數(shù)傳遞的時候,可以使用Get請求
*
* @param url 需要請求的URL
* @return 將請求URL后返回的數(shù)據(jù),轉(zhuǎn)為JSON格式,并return
*/
public static JSONObject doGetStr(String url) throws ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();//獲取DefaultHttpClient請求
HttpGet httpGet = new HttpGet(url);//HttpGet將使用Get方式發(fā)送請求URL
JSONObject jsonObject = null;
HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client執(zhí)行httpGet的結(jié)果
HttpEntity entity = response.getEntity();//從response中獲取結(jié)果,類型為HttpEntity
if(entity != null){
String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity轉(zhuǎn)為字符串類型
jsonObject = JSONObject.fromObject(result);//字符串類型轉(zhuǎn)為JSON類型
}
return jsonObject;
}
/**
* 編寫Post請求的方法。當(dāng)我們需要參數(shù)傳遞的時候,可以使用Post請求
*
* @param url 需要請求的URL
* @param outStr? 需要傳遞的參數(shù)
* @return 將請求URL后返回的數(shù)據(jù),轉(zhuǎn)為JSON格式,并return
*/
public static JSONObject doPostStr(String url,String outStr) throws ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();//獲取DefaultHttpClient請求
HttpPost httpost = new HttpPost(url);//HttpPost將使用Get方式發(fā)送請求URL
JSONObject jsonObject = null;
httpost.setEntity(new StringEntity(outStr,"UTF-8"));//使用setEntity方法,將我們傳進(jìn)來的參數(shù)放入請求中
HttpResponse response = client.execute(httpost);//使用HttpResponse接收client執(zhí)行httpost的結(jié)果
String result = EntityUtils.toString(response.getEntity(),"UTF-8");//HttpEntity轉(zhuǎn)為字符串類型
jsonObject = JSONObject.fromObject(result);//字符串類型轉(zhuǎn)為JSON類型
return jsonObject;
}
/**
* 獲取AccessToken
* @return 返回拿到的access_token及有效期
*/
public static AccessToken getAccessToken() throws ClientProtocolException, IOException{
AccessToken token = new AccessToken();
String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);//將URL中的兩個參數(shù)替換掉
JSONObject jsonObject = doGetStr(url);//使用剛剛寫的doGet方法接收結(jié)果
if(jsonObject!=null){ //如果返回不為空,將返回結(jié)果封裝進(jìn)AccessToken實體類
token.setToken(jsonObject.getString("access_token"));//取出access_token
token.setExpiresIn(jsonObject.getInt("expires_in"));//取出access_token的有效期
}
return token;
}
}