1. 程式人生 > >微信公眾號開發-開發環境搭建並通過java程式碼獲取微信access_token

微信公眾號開發-開發環境搭建並通過java程式碼獲取微信access_token

進入開發文件:

獲取access token

access_token是公眾號的全域性唯一票據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。

公眾平臺的API呼叫所需的access_token的使用及生成方式說明:

1、為了保密appsecrect,第三方需要一個access_token獲取和重新整理的中控伺服器。而其他業務邏輯伺服器所使用的access_token均來自於該中控伺服器,不應該各自去重新整理,否則會造成

access_token覆蓋而影響業務;

2、目前access_token的有效期通過返回的expire_in來傳達,目前是7200秒之內的值。中控伺服器需要根據這個有效時間提前去重新整理新access_token。在重新整理過程中,中控伺服器對外輸出的依然是老access_token,此時公眾平臺後臺會保證在重新整理短時間內,新老access_token都可用,這保證了第三方業務的平滑過渡;

3access_token的有效時間可能會在未來有調整,所以中控伺服器不僅需要內部定時主動重新整理,還需要提供被動重新整理access_token的介面,這樣便於業務伺服器在API呼叫獲知access_token

已超時的情況下,可以觸發access_token的重新整理流程。

介面呼叫請求說明

引數說明

引數

是否必須

說明

grant_type

獲取access_token填寫client_credential

appid

第三方使用者唯一憑證

secret

第三方使用者唯一憑證金鑰,即appsecret

返回說明

正常情況下,微信會返回下述JSON資料包給公眾號:

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

引數

說明

access_token

獲取到的憑證

expires_in

憑證有效時間,單位:秒

錯誤時微信會返回錯誤碼等資訊,JSON資料包示例如下(該示例為AppID無效錯誤):

{"errcode":40013,"errmsg":"invalidappid"}

進入微信後臺管理,點選開發者工具

因為正是賬號正在申請中,所有一個提供測試的公共賬號,微信開發平臺為我們提供了一個專用的測試賬號。在測試賬號中可以獲得一個appID和appsecret


我們在瀏覽器中替換兩個引數進行一個測試,看到可以正常返回獲取到一個token和token的有效時間。


啟動eclipse,新建一個java工程,因為要模擬http訪問,需要下載httpclient元件,下載地址http://hc.apache.org/downloads.cgi

最好使用穩定版本HttpClient 4.5.3 (GA)

讀取token的程式碼如下:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class ClientCustomContext {

	public final static void main(String[] args) throws Exception {
		CloseableHttpClient httpclient = HttpClients.createDefault();
		try {
			CookieStore cookieStore = new BasicCookieStore();

			HttpClientContext localContext = HttpClientContext.create();
			localContext.setCookieStore(cookieStore);

			HttpGet httpget = new HttpGet(
					"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx");
			System.out.println("Executing request " + httpget.getRequestLine());

			CloseableHttpResponse response = httpclient.execute(httpget,
					localContext);
			try {
				System.out.println("----------------------------------------");
				System.out.println(response.getStatusLine());
				InputStream is = response.getEntity().getContent();
				BufferedReader br = new BufferedReader(
						new InputStreamReader(is));
				String str = "";
				while ((str = br.readLine()) != null) {
					System.out.println(str);
				}
			} finally {
				response.close();
			}
		} finally {
			httpclient.close();
		}
	}

}

我們需要根據返回的內容中的expires_in結果,寫一個定時任務,並把返回的token寫入一個全域性變數中,定時任務定時從微信獲取最新的token。程式需要token是直接從全域性變數中讀取。