|
@@ -1,21 +1,14 @@ |
|
|
package me.chanjar.weixin.mp.api; |
|
|
package me.chanjar.weixin.mp.api; |
|
|
|
|
|
|
|
|
import me.chanjar.weixin.common.bean.WxAccessToken; |
|
|
|
|
|
import me.chanjar.weixin.common.util.ToStringUtils; |
|
|
|
|
|
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; |
|
|
|
|
|
import redis.clients.jedis.Jedis; |
|
|
import redis.clients.jedis.Jedis; |
|
|
|
|
|
|
|
|
import javax.net.ssl.SSLContext; |
|
|
|
|
|
import java.io.File; |
|
|
|
|
|
import java.util.concurrent.locks.Lock; |
|
|
|
|
|
import java.util.concurrent.locks.ReentrantLock; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 基于Redis的微信配置provider |
|
|
* 基于Redis的微信配置provider |
|
|
* |
|
|
* |
|
|
* @author lly835 |
|
|
* @author lly835 |
|
|
*/ |
|
|
*/ |
|
|
public class WxMpInRedisConfigStorage implements WxMpConfigStorage { |
|
|
|
|
|
|
|
|
@SuppressWarnings("hiding") |
|
|
|
|
|
public class WxMpInRedisConfigStorage extends WxMpInMemoryConfigStorage { |
|
|
|
|
|
|
|
|
private final static String ACCESS_TOKEN_KEY = "wechat_access_token_"; |
|
|
private final static String ACCESS_TOKEN_KEY = "wechat_access_token_"; |
|
|
|
|
|
|
|
@@ -23,43 +16,6 @@ public class WxMpInRedisConfigStorage implements WxMpConfigStorage { |
|
|
|
|
|
|
|
|
private final static String CARDAPI_TICKET_KEY = "wechat_cardapi_ticket_"; |
|
|
private final static String CARDAPI_TICKET_KEY = "wechat_cardapi_ticket_"; |
|
|
|
|
|
|
|
|
protected volatile String appId; |
|
|
|
|
|
protected volatile String secret; |
|
|
|
|
|
protected volatile String partnerId; |
|
|
|
|
|
protected volatile String partnerKey; |
|
|
|
|
|
protected volatile String notifyURL; |
|
|
|
|
|
protected volatile String tradeType; |
|
|
|
|
|
protected volatile String token; |
|
|
|
|
|
protected volatile String accessToken; |
|
|
|
|
|
protected volatile String aesKey; |
|
|
|
|
|
protected volatile long expiresTime; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile String oauth2redirectUri; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile String httpProxyHost; |
|
|
|
|
|
protected volatile int httpProxyPort; |
|
|
|
|
|
protected volatile String httpProxyUsername; |
|
|
|
|
|
protected volatile String httpProxyPassword; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile String jsapiTicket; |
|
|
|
|
|
protected volatile long jsapiTicketExpiresTime; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile String cardApiTicket; |
|
|
|
|
|
protected volatile long cardApiTicketExpiresTime; |
|
|
|
|
|
|
|
|
|
|
|
protected Lock accessTokenLock = new ReentrantLock(); |
|
|
|
|
|
protected Lock jsapiTicketLock = new ReentrantLock(); |
|
|
|
|
|
protected Lock cardApiTicketLock = new ReentrantLock(); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 临时文件目录 |
|
|
|
|
|
*/ |
|
|
|
|
|
protected volatile File tmpDirFile; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile SSLContext sslContext; |
|
|
|
|
|
|
|
|
|
|
|
protected volatile ApacheHttpClientBuilder apacheHttpClientBuilder; |
|
|
|
|
|
|
|
|
|
|
|
protected Jedis jedis; |
|
|
protected Jedis jedis; |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@@ -67,46 +23,25 @@ public class WxMpInRedisConfigStorage implements WxMpConfigStorage { |
|
|
return jedis.get(ACCESS_TOKEN_KEY.concat(appId)); |
|
|
return jedis.get(ACCESS_TOKEN_KEY.concat(appId)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Lock getAccessTokenLock() { |
|
|
|
|
|
return this.accessTokenLock; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public boolean isAccessTokenExpired() { |
|
|
public boolean isAccessTokenExpired() { |
|
|
return getAccessToken() == null ? true : false; |
|
|
return getAccessToken() == null ? true : false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public synchronized void updateAccessToken(WxAccessToken accessToken) { |
|
|
|
|
|
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
|
@Override |
|
|
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { |
|
|
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { |
|
|
this.accessToken = accessToken; |
|
|
|
|
|
this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; |
|
|
|
|
|
jedis.set(ACCESS_TOKEN_KEY.concat(appId), accessToken); |
|
|
jedis.set(ACCESS_TOKEN_KEY.concat(appId), accessToken); |
|
|
jedis.expire(ACCESS_TOKEN_KEY.concat(appId), expiresInSeconds - 200); |
|
|
jedis.expire(ACCESS_TOKEN_KEY.concat(appId), expiresInSeconds - 200); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void expireAccessToken() { |
|
|
public void expireAccessToken() { |
|
|
this.expiresTime = 0; |
|
|
|
|
|
|
|
|
jedis.expire(ACCESS_TOKEN_KEY.concat(appId), 0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public String getJsapiTicket() { |
|
|
public String getJsapiTicket() { |
|
|
return this.jsapiTicket; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setJsapiTicket(String jsapiTicket) { |
|
|
|
|
|
this.jsapiTicket = jsapiTicket; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Lock getJsapiTicketLock() { |
|
|
|
|
|
return this.jsapiTicketLock; |
|
|
|
|
|
|
|
|
return jedis.get(JSAPI_TICKET_KEY.concat(appId)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@@ -116,16 +51,13 @@ public class WxMpInRedisConfigStorage implements WxMpConfigStorage { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) { |
|
|
public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) { |
|
|
this.jsapiTicket = jsapiTicket; |
|
|
|
|
|
// 预留200秒的时间 |
|
|
|
|
|
this.jsapiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; |
|
|
|
|
|
jedis.set(JSAPI_TICKET_KEY.concat(appId), accessToken); |
|
|
|
|
|
|
|
|
jedis.set(JSAPI_TICKET_KEY.concat(appId), jsapiTicket); |
|
|
jedis.expire(JSAPI_TICKET_KEY.concat(appId), expiresInSeconds - 200); |
|
|
jedis.expire(JSAPI_TICKET_KEY.concat(appId), expiresInSeconds - 200); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void expireJsapiTicket() { |
|
|
public void expireJsapiTicket() { |
|
|
this.jsapiTicketExpiresTime = 0; |
|
|
|
|
|
|
|
|
jedis.expire(JSAPI_TICKET_KEY.concat(appId), 0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@@ -133,177 +65,26 @@ public class WxMpInRedisConfigStorage implements WxMpConfigStorage { |
|
|
*/ |
|
|
*/ |
|
|
@Override |
|
|
@Override |
|
|
public String getCardApiTicket() { |
|
|
public String getCardApiTicket() { |
|
|
return this.cardApiTicket; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Lock getCardApiTicketLock() { |
|
|
|
|
|
return this.cardApiTicketLock; |
|
|
|
|
|
|
|
|
return jedis.get(CARDAPI_TICKET_KEY.concat(appId)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public boolean isCardApiTicketExpired() { |
|
|
public boolean isCardApiTicketExpired() { |
|
|
return System.currentTimeMillis() > this.cardApiTicketExpiresTime; |
|
|
|
|
|
|
|
|
return getCardApiTicket() == null ? true : false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public synchronized void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) { |
|
|
public synchronized void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) { |
|
|
this.cardApiTicket = cardApiTicket; |
|
|
|
|
|
// 预留200秒的时间 |
|
|
|
|
|
this.cardApiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; |
|
|
|
|
|
jedis.set(CARDAPI_TICKET_KEY.concat(appId), accessToken); |
|
|
|
|
|
|
|
|
jedis.set(CARDAPI_TICKET_KEY.concat(appId), cardApiTicket); |
|
|
jedis.expire(CARDAPI_TICKET_KEY.concat(appId), expiresInSeconds - 200); |
|
|
jedis.expire(CARDAPI_TICKET_KEY.concat(appId), expiresInSeconds - 200); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void expireCardApiTicket() { |
|
|
public void expireCardApiTicket() { |
|
|
this.cardApiTicketExpiresTime = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public String getAppId() { |
|
|
|
|
|
return this.appId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setAppId(String appId) { |
|
|
|
|
|
this.appId = appId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@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() { |
|
|
|
|
|
return this.expiresTime; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setExpiresTime(long expiresTime) { |
|
|
|
|
|
this.expiresTime = expiresTime; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public String getAesKey() { |
|
|
|
|
|
return this.aesKey; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setAesKey(String aesKey) { |
|
|
|
|
|
this.aesKey = aesKey; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public String getOauth2redirectUri() { |
|
|
|
|
|
return this.oauth2redirectUri; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setOauth2redirectUri(String oauth2redirectUri) { |
|
|
|
|
|
this.oauth2redirectUri = oauth2redirectUri; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@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 ToStringUtils.toSimpleString(this); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setPartnerId(String partnerId) { |
|
|
|
|
|
this.partnerId = partnerId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setPartnerKey(String partnerKey) { |
|
|
|
|
|
this.partnerKey = partnerKey; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getNotifyURL() { |
|
|
|
|
|
return notifyURL; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setNotifyURL(String notifyURL) { |
|
|
|
|
|
this.notifyURL = notifyURL; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public String getTradeType() { |
|
|
|
|
|
return tradeType; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setTradeType(String tradeType) { |
|
|
|
|
|
this.tradeType = tradeType; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public File getTmpDirFile() { |
|
|
|
|
|
return this.tmpDirFile; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setTmpDirFile(File tmpDirFile) { |
|
|
|
|
|
this.tmpDirFile = tmpDirFile; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public ApacheHttpClientBuilder getApacheHttpClientBuilder() { |
|
|
|
|
|
return this.apacheHttpClientBuilder; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) { |
|
|
|
|
|
this.apacheHttpClientBuilder = apacheHttpClientBuilder; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public boolean autoRefreshToken() { |
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
jedis.expire(CARDAPI_TICKET_KEY.concat(appId), 0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void setJedis(Jedis jedis) { |
|
|
public void setJedis(Jedis jedis) { |
|
|
this.jedis = jedis; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
this.jedis = jedis; |
|
|
|
|
|
} |
|
|
|
|
|
} |