使用Java語言開發微信公眾平台(六)——獲取access_token


 

 

       在前四期的文章中,我們分別學習了“環境搭建與開發接入”、“文本消息的接收與響應”、“被關注回復與關鍵詞回復”、“圖文消息的發送與響應”等環節。那么,從本篇博文開始,我們將進去更高級的開發層面,調用微信公眾平台提供的各種接口。

       今天,我們來學習一下微信公眾平台最基礎的一個接口——access_token,access_token是公眾號的全局唯一票據,公眾號調用各接口時都需使用access_token。

       當然,從本章開始,我們需要調用的各種接口,均需使用服務號開發。沒有服務號的小伙伴,可以選擇申請一個測試賬號,詳情查看系列博文第一篇<環境搭建與開發接入>

       一、了解access_token

      正如前言所述,access_token是公眾號的全局唯一票據,公眾號調用各接口時都需使用access_token。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效。

      公眾號可以使用AppID和AppSecret調用本接口來獲取access_token。AppID和AppSecret可在微信公眾平台官網-開發者中心頁中獲得。且一個公眾號每天獲取access_token的次數上限為2000次。

     ① 接口調用請求地址

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

     ② 需要傳遞參數說明

 

 

 

 

    ③ 返回參數說明

     從上述請求地址,以及參數和響應表格可以知道,我們需要通過請求傳遞三個參數給微信公眾平台,分別是grant_type(獲取access_token填寫client_credential)、appid、appsecret,請求成功后,公眾平台會將access_token以及有效期返回給我們。

 

   二    在了解了access_token之后,我們開始組裝一個工具類,來向服務器發送請求獲取access_token。在我們之前的Util包下,新建一個WeiXinUtil.java工具類

 

    [劇透一下]由於在開發過程中,我們需要① 將接收過來的結果轉成JSON格式 ② 使用HttpClient發送HTTP請求,所以需要導入幾個Jar包,導入Jar包列表如下(其中,紅色框為第①部分所需,藍色框為第②部分所需):

     Jar包導入完成后,進入我們的代碼實戰環節,打開我們的WeiXinUtil.java工具類,封裝三個常量,分別是我們的APPID、APPSECRET、以及請求access_token的URL:

     接下來我們組裝兩個方法,分別是使用Get和Post對我們的URL發起請求,當我們直接請求URL而不需要傳遞參數時,可使用Get請求,而當我們需要傳遞參數的時候,就需要使用Post請求,這兩個請求的實現,均需借助我們導入HttpClient這兩個Jar包:

    ① Get請求的實現(相關代碼解釋已在注釋闡明)

       ② Post請求的實現(相關代碼解釋已在注釋闡明)

       三、創建AccessToken實體類

 

      由第一部分返回結果說明我們可以知道,當我們執行請求URL,並且請求成功后,公眾平台會將access_token以及有效期返回給我們。所以我們需要新建一個AccessToken實體類用於組裝返回結果,實體類屬性如下:

 

     四、獲取Access_Token並編寫測試類

 

    ① 在WeiXinUtil.java工具類中,新增getAccessToken方法

 

       ② 編寫測試類,測試方法

 

        ③ 運行測試類,即可取到Access_Token及有效期

      由於每個公眾賬號一天請求2000次Access_Token,在一些訪問量大的公眾號上顯然是不夠用的,因此我們可以將取到的Access_Token存到本地,每次使用時判斷是否過期,如果沒有過期就不要再發送請求啦~

      這個問題呢,作為一個課后練習,有能力的小伙伴可能自行嘗試哦~

    【附】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請求的方法。但沒有參數傳遞的時候,可以使用Get請求 * * @param url 需要請求的URL * @return 將請求URL后返回的數據,轉為JSON格式,並return */ public static JSONObject doGetStr(String url) throws ClientProtocolException, IOException { DefaultHttpClient client = new DefaultHttpClient();//獲取DefaultHttpClient請求 HttpGet httpGet = new HttpGet(url);//HttpGet將使用Get方式發送請求URL JSONObject jsonObject = null; HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client執行httpGet的結果 HttpEntity entity = response.getEntity();//從response中獲取結果,類型為HttpEntity if(entity != null){ String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity轉為字符串類型 jsonObject = JSONObject.fromObject(result);//字符串類型轉為JSON類型 } return jsonObject; } /** * 編寫Post請求的方法。當我們需要參數傳遞的時候,可以使用Post請求 * * @param url 需要請求的URL * @param outStr 需要傳遞的參數 * @return 將請求URL后返回的數據,轉為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方式發送請求URL JSONObject jsonObject = null; httpost.setEntity(new StringEntity(outStr,"UTF-8"));//使用setEntity方法,將我們傳進來的參數放入請求中 HttpResponse response = client.execute(httpost);//使用HttpResponse接收client執行httpost的結果 String result = EntityUtils.toString(response.getEntity(),"UTF-8");//HttpEntity轉為字符串類型 jsonObject = JSONObject.fromObject(result);//字符串類型轉為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中的兩個參數替換掉 JSONObject jsonObject = doGetStr(url);//使用剛剛寫的doGet方法接收結果 if(jsonObject!=null){ //如果返回不為空,將返回結果封裝進AccessToken實體類 token.setToken(jsonObject.getString("access_token"));//取出access_token token.setExpiresIn(jsonObject.getInt("expires_in"));//取出access_token的有效期 } return token; } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM