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


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

       今天我們來學習一下微信公眾平台最基礎的一個接口——access_tokenaccess_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)、appidappsecret請求成功后公眾平台會將access_token以及有效期返回給我們

 

    二組裝請求access_token的工具類

 

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

 

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

     Jar包導入完成后進入我們的代碼實戰環節打開我們的WeiXinUtil.java工具類封裝三個常量分別是我們的APPIDAPPSECRET以及請求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