|
|
@@ -0,0 +1,268 @@
|
|
|
+package com.izouma.walkchina.configuration;
|
|
|
+
|
|
|
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
|
|
|
+import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
|
|
|
+import me.chanjar.weixin.common.bean.WxAccessToken;
|
|
|
+import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class WxMaRedisConfig implements WxMaConfig {
|
|
|
+ private final String REDIS_KEY = "miniAppAccessToken";
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
+
|
|
|
+ private volatile String msgDataFormat;
|
|
|
+ private volatile String appid;
|
|
|
+ private volatile String secret;
|
|
|
+ private volatile String token;
|
|
|
+ private volatile String aesKey;
|
|
|
+
|
|
|
+ private volatile String httpProxyHost;
|
|
|
+ private volatile int httpProxyPort;
|
|
|
+ private volatile String httpProxyUsername;
|
|
|
+ private volatile String httpProxyPassword;
|
|
|
+
|
|
|
+ private volatile String jsapiTicket;
|
|
|
+ private volatile long jsapiTicketExpiresTime;
|
|
|
+
|
|
|
+ //微信卡券的ticket单独缓存
|
|
|
+ private volatile String cardApiTicket;
|
|
|
+ private volatile long cardApiTicketExpiresTime;
|
|
|
+
|
|
|
+
|
|
|
+ private Lock accessTokenLock = new ReentrantLock();
|
|
|
+ private Lock jsapiTicketLock = new ReentrantLock();
|
|
|
+ private Lock cardApiTicketLock = new ReentrantLock();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 临时文件目录
|
|
|
+ */
|
|
|
+ protected volatile File tmpDirFile;
|
|
|
+
|
|
|
+ private volatile ApacheHttpClientBuilder apacheHttpClientBuilder;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getAccessToken() {
|
|
|
+ try {
|
|
|
+ Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForValue().get(REDIS_KEY);
|
|
|
+ return (String) map.get("accessToken");
|
|
|
+ } catch (Exception ignored) {
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Lock getAccessTokenLock() {
|
|
|
+ return this.accessTokenLock;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setAccessTokenLock(Lock accessTokenLock) {
|
|
|
+ this.accessTokenLock = accessTokenLock;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isAccessTokenExpired() {
|
|
|
+ try {
|
|
|
+ Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForValue().get(REDIS_KEY);
|
|
|
+ long expiresAt = (long) map.get("expiresAt");
|
|
|
+ return System.currentTimeMillis() >= expiresAt;
|
|
|
+ } catch (Exception ignored) {
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized void updateAccessToken(WxAccessToken accessToken) {
|
|
|
+ updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
|
|
|
+ long expiresAt = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("accessToken", accessToken);
|
|
|
+ map.put("expiresAt", expiresAt);
|
|
|
+ redisTemplate.opsForValue().set(REDIS_KEY, map);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getJsapiTicket() {
|
|
|
+ return this.jsapiTicket;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Lock getJsapiTicketLock() {
|
|
|
+ return this.jsapiTicketLock;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isJsapiTicketExpired() {
|
|
|
+ return System.currentTimeMillis() > this.jsapiTicketExpiresTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void expireJsapiTicket() {
|
|
|
+ this.jsapiTicketExpiresTime = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) {
|
|
|
+ this.jsapiTicket = jsapiTicket;
|
|
|
+ // 预留200秒的时间
|
|
|
+ this.jsapiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getCardApiTicket() {
|
|
|
+ return this.cardApiTicket;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Lock getCardApiTicketLock() {
|
|
|
+ return this.cardApiTicketLock;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isCardApiTicketExpired() {
|
|
|
+ return System.currentTimeMillis() > this.cardApiTicketExpiresTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void expireCardApiTicket() {
|
|
|
+ this.cardApiTicketExpiresTime = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) {
|
|
|
+ this.cardApiTicket = cardApiTicket;
|
|
|
+ // 预留200秒的时间
|
|
|
+ this.cardApiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void expireAccessToken() {
|
|
|
+ redisTemplate.delete(REDIS_KEY);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getSecret() {
|
|
|
+ return this.secret;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setSecret(String secret) {
|
|
|
+ this.secret = secret;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getToken() {
|
|
|
+ return this.token;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setToken(String token) {
|
|
|
+ this.token = token;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public long getExpiresTime() {
|
|
|
+ try {
|
|
|
+ Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForValue().get(REDIS_KEY);
|
|
|
+ return (long) map.get("expiresAt");
|
|
|
+ } catch (Exception ignored) {
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getAesKey() {
|
|
|
+ return this.aesKey;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setAesKey(String aesKey) {
|
|
|
+ this.aesKey = aesKey;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getMsgDataFormat() {
|
|
|
+ return this.msgDataFormat;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setMsgDataFormat(String msgDataFormat) {
|
|
|
+ this.msgDataFormat = msgDataFormat;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getHttpProxyHost() {
|
|
|
+ return this.httpProxyHost;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setHttpProxyHost(String httpProxyHost) {
|
|
|
+ this.httpProxyHost = httpProxyHost;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int getHttpProxyPort() {
|
|
|
+ return this.httpProxyPort;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setHttpProxyPort(int httpProxyPort) {
|
|
|
+ this.httpProxyPort = httpProxyPort;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getHttpProxyUsername() {
|
|
|
+ return this.httpProxyUsername;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setHttpProxyUsername(String httpProxyUsername) {
|
|
|
+ this.httpProxyUsername = httpProxyUsername;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getHttpProxyPassword() {
|
|
|
+ return this.httpProxyPassword;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setHttpProxyPassword(String httpProxyPassword) {
|
|
|
+ this.httpProxyPassword = httpProxyPassword;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String toString() {
|
|
|
+ return WxMaGsonBuilder.create().toJson(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ApacheHttpClientBuilder getApacheHttpClientBuilder() {
|
|
|
+ return this.apacheHttpClientBuilder;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) {
|
|
|
+ this.apacheHttpClientBuilder = apacheHttpClientBuilder;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean autoRefreshToken() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getAppid() {
|
|
|
+ return appid;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setAppid(String appid) {
|
|
|
+ this.appid = appid;
|
|
|
+ }
|
|
|
+}
|