access_token是與微信服務器交互過程當中的一個憑證,每次客戶服務器主動與微信服務器通訊都須要帶上access_token以確認本身的身份。wechat4j內部封裝了對access_token的操做,包括獲取access_token和access_token中控服務器的實現。java
要獲取access_token可使用以下的方法git
String accessToken = TokenProxy.accessToken();
access_token每日有一個次數限制,因此客戶服務器不能每次是都去請求一個新的access_token,每次請求以後,access_token都有一個過時時間。所以微信平臺建議你使用一箇中控服務器來定時刷新token,取得以後存起來不用再去請求token,由於access_token請求有次數限制。 這樣處理只有有兩個好處:github
wechat4j獲取access_token是經過access_token的代理TokenProxy來獲取,而此代理封裝了access_token的中控服務器。對access_token的保存有兩種方式,一種是內存保存,一種是持久化保存(數據庫或者文件)。內存保存方式的中控服務器由wehcat4j實現,客戶不作任何操做。若是客戶要使用持久化保存,那麼就須要本身去定義中控服務器。因此有以下兩種中控服務器:web
wechat4j的默認中控服務器是內存模式,即將access_token保存在內存中,直到過時的時候再去請求一個新的來替代。默認中控服務器對應的類是AccessTokenMemServer。sql
若是你須要將access_token保存在數據庫或者文件中,那麼就須要使用自定義的中控服務器。自定義的服務器須要客戶本身完成,必須繼承抽象類CustomerServer,完成其中的保存和查詢方法便可,同時自定義的服務器是由定時器來驅動操做的,須要配置監聽器。
配置自定義access_token服務器的詳細步驟:數據庫
public class CustomerAccessTokenServer extends CustomerServer{ /* (non-Javadoc) * @see org.sword.wechat4j.token.DbAccessTokenServer#find() */ @Override public String find() { String accessToken = null; //執行數據庫操做 // String sql = "select cfgValue from cfg where cfg.cfgKey = 'access_token'"; // accessToken = DBUtil.query(sql); return accessToken; } /* (non-Javadoc) * @see org.sword.wechat4j.token.DbAccessTokenServer#save() */ @Override public boolean save(Token accessToken) { //若是沒有須要插入,若是有的就更新,假設已經有了數據庫配置項 // String sql = "update cfg set cfg.cfgValue=" + accessToken.getToken() + // " where cfg.cfgKey= 'access_token'"; // DBUtil.execute(sql); return true; } }
wechat.accessToken.server.class=com.sample.wechat.CustomerAccessTokenServer
<listener> <listener-class>org.sword.wechat4j.token.TokenListener</listener-class> </listener>
經過如上三步就能配置好本身的數據庫access_token服務器。這樣由中控服務器定時去刷新access_token,而後保存到數據庫中,業務邏輯中要使用access_token的時候,是經過代理去數據庫拿到數據。
定時刷新任務會提早200秒運行,防止到有效期以後運行過程當中新access_token沒有取得舊的access_token過時的狀況發生。服務器
wechat4j框架官方文檔: https://github.com/sword-org/wechat4j/wiki
wechat4j技術交流QQ羣: 423134346微信