官方文檔連接java
access_token是何物,access_token是公衆號的全局惟一接口調用憑據,公衆號調用各接口時都需使用access_token。開發者須要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。git
官方是這麼介紹的,因爲有請求次數限制,確定不能隨用隨取,須要採用中控服務器保存。github
此外在刷新過程當中,中控服務器可對外繼續輸出的老access_token,此時公衆平臺後臺會保證在5分鐘內,新老access_token均可用,這保證了第三方業務的平滑過渡,這就保證了不須要考慮access_token失效的問題了,前提是正確獲取到並及時刷新了。redis
Linux能夠用docker去安裝,Windows下安裝並設置Redisspring
AppID和AppSecret可在「微信公衆平臺-開發-基本配置」頁中得到(須要已經成爲開發者,且賬號沒有異常狀態)。docker
若是是測試號,不存在白名單一說,正式的公衆號調用接口時,請登陸「微信公衆平臺-開發-基本配置」提早將服務器IP地址添加到IP白名單中,點擊查看設置方法,不然將沒法調用成功json
多環境配置,在application-dev.yml加入 ,appid 、appsecret、token替換成本身的api
#wechat
wechat:
appid: yours
appsecret: yours
token: yours
讀取配置緩存
/** * FileName: WechatAccountConfig * Author: Phil * Date: 11/20/2018 3:10 PM * Description: 配置文件 * History: * <author> <time> <version> <desc> * 做者姓名 修改時間 版本號 描述 */ package com.phil.modules.config; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 〈一句話功能簡述〉<br> * 〈接入配置信息〉 * * @author Phil * @create 11/20/2018 3:10 PM * @since 1.0 */ @Component @Getter @Setter @ConfigurationProperties(prefix = "wechat") public class WechatAccountConfig { /*** * 微信的appid */ private String appid; /*** * 微信的secret */ private String appsecret; /*** * 微信受權url */ private String returnUrl; /*** * 微信的驗證token */ private String token; }
application.properties里加上配置服務器
#auth
#獲取憑證的連接
wechat.auth.get-access-token-url=https://api.weixin.qq.com/cgi-bin/token
讀取配置
/** * FileName: WechatAuthConfig * Author: Phil * Date: 11/21/2018 7:10 PM * Description: * History: * <author> <time> <version> <desc> * 做者姓名 修改時間 版本號 描述 */ package com.phil.wechat.auth.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 〈一句話功能簡述〉<br> * 〈〉 * * @author Phil * @create 11/21/2018 7:10 PM * @since 1.0 */ @Component @Getter @Setter @ToString @ConfigurationProperties(prefix = "wechat.auth") public class WechatAuthConfig { //獲取憑證 private String getAccessTokenUrl; }
定義接收的實體Bean
/**
* FileName: AccessToken
* Author: Phil
* Date: 12/4/2018 2:13 PM
* Description:
* History:
* <author> <time> <version> <desc>
* 做者姓名 修改時間 版本號 描述
*/
package com.phil.wechat.auth.model.response;
import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; import java.io.Serializable; /** * 〈一句話功能簡述〉<br> * 〈微信通用接口憑證〉 * * @author Phil * @create 12/4/2018 2:13 PM * @since 1.0 */ @Getter @Setter public class AccessToken implements Serializable { private static final long serialVersionUID = 5806078615354556552L; // 獲取到的憑證 @SerializedName("access_token") private String accessToken; // 憑證有效時間,單位:秒 private int expires_in; }
讀取並緩存到Redis
/** * FileName: AuthServiceImpl * Author: Phil * Date: 11/21/2018 12:13 PM * Description: * History: * <author> <time> <version> <desc> * 做者姓名 修改時間 版本號 描述 */ package com.phil.wechat.auth.service.impl; import com.google.gson.JsonSyntaxException; import com.phil.modules.config.WechatAccountConfig; import com.phil.modules.result.ResultState; import com.phil.modules.util.HttpUtil; import com.phil.modules.util.JsonUtil; import com.phil.modules.util.RedisUtils; import com.phil.wechat.auth.config.WechatAuthConfig; import com.phil.wechat.auth.model.BasicAuthParam; import com.phil.wechat.auth.model.response.AccessToken; import com.phil.wechat.auth.model.response.AuthAccessToken; import com.phil.wechat.auth.model.response.AuthUserInfo; import com.phil.wechat.auth.service.WechatAuthService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.TreeMap; /** * 〈一句話功能簡述〉<br> * 〈〉 * * @author Phil * @create 11/21/2018 12:13 PM * @since 1.0 */ @Service @Slf4j public class WechatAuthServiceImpl implements WechatAuthService { @Value("${wechat.token}") private String token; @Resource RedisUtils redisUtils; @Resource WechatAuthConfig wechatAuthConfig; @Resource private WechatAccountConfig wechatAccountConfig; /** * 獲取受權憑證token * * @return 受權憑證token */ @Override public String getAccessToken() { String accessToken = null; if (Objects.isNull(redisUtils.get(token))) { Map<String, String> map = new TreeMap<>(); map.put("appid", wechatAccountConfig.getAppid()); map.put("secret", wechatAccountConfig.getAppsecret()); map.put("grant_type", "client_credential"); String json = HttpUtil.doGet(wechatAuthConfig.getGetAccessTokenUrl(), map); AccessToken bean = JsonUtil.fromJson(json, AccessToken.class); if (bean != null) { accessToken = bean.getAccessToken(); log.info("從微信服務器獲取的受權憑證{}", accessToken); redisUtils.set(token, accessToken, 60 * 120); log.info("從微信服務器獲取的token緩存到Redis"); } } else { accessToken = redisUtils.get(token).toString(); log.info("從redis中獲取的受權憑證{}", accessToken); } return accessToken; } }
又或者可使用定時去緩存刷新
完整代碼查看GitHub連接,不定時更新