微信公眾號開發-開發環境搭建並通過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均來自於該中控伺服器,不應該各自去重新整理,否則會造成
2、目前access_token的有效期通過返回的expire_in來傳達,目前是7200秒之內的值。中控伺服器需要根據這個有效時間提前去重新整理新access_token。在重新整理過程中,中控伺服器對外輸出的依然是老access_token,此時公眾平臺後臺會保證在重新整理短時間內,新老access_token都可用,這保證了第三方業務的平滑過渡;
3、access_token的有效時間可能會在未來有調整,所以中控伺服器不僅需要內部定時主動重新整理,還需要提供被動重新整理access_token的介面,這樣便於業務伺服器在API呼叫獲知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是直接從全域性變數中讀取。