@@ -242,6 +242,12 @@ | |||||
<version>2.9.0</version> | <version>2.9.0</version> | ||||
<scope>provided</scope> | <scope>provided</scope> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.redisson</groupId> | |||||
<artifactId>redisson</artifactId> | |||||
<version>3.12.0</version> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>org.projectlombok</groupId> | <groupId>org.projectlombok</groupId> | ||||
<artifactId>lombok</artifactId> | <artifactId>lombok</artifactId> | ||||
@@ -24,6 +24,11 @@ | |||||
<artifactId>jedis</artifactId> | <artifactId>jedis</artifactId> | ||||
<scope>compile</scope> | <scope>compile</scope> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.redisson</groupId> | |||||
<artifactId>redisson</artifactId> | |||||
<scope>compile</scope> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<build> | <build> | ||||
@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; | |||||
import me.chanjar.weixin.mp.config.WxMpConfigStorage; | import me.chanjar.weixin.mp.config.WxMpConfigStorage; | ||||
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; | import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; | ||||
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; | import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; | ||||
import org.redisson.api.RedissonClient; | |||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||
@@ -26,6 +27,9 @@ public class WxMpStorageAutoConfiguration { | |||||
@Autowired(required = false) | @Autowired(required = false) | ||||
private JedisPool jedisPool; | private JedisPool jedisPool; | ||||
@Autowired(required = false) | |||||
private RedissonClient redissonClient; | |||||
@Bean | @Bean | ||||
@ConditionalOnMissingBean(WxMpConfigStorage.class) | @ConditionalOnMissingBean(WxMpConfigStorage.class) | ||||
public WxMpConfigStorage wxMpInMemoryConfigStorage() { | public WxMpConfigStorage wxMpInMemoryConfigStorage() { | ||||
@@ -24,6 +24,11 @@ | |||||
<artifactId>jedis</artifactId> | <artifactId>jedis</artifactId> | ||||
<scope>compile</scope> | <scope>compile</scope> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.redisson</groupId> | |||||
<artifactId>redisson</artifactId> | |||||
<scope>compile</scope> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<build> | <build> | ||||
@@ -6,7 +6,12 @@ import lombok.RequiredArgsConstructor; | |||||
import me.chanjar.weixin.open.api.WxOpenConfigStorage; | import me.chanjar.weixin.open.api.WxOpenConfigStorage; | ||||
import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; | import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; | ||||
import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage; | import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage; | ||||
import me.chanjar.weixin.open.api.impl.WxOpenInRedissonConfigStorage; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.redisson.Redisson; | |||||
import org.redisson.api.RedissonClient; | |||||
import org.redisson.config.Config; | |||||
import org.redisson.config.TransportMode; | |||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
@@ -28,6 +33,9 @@ public class WxOpenStorageAutoConfiguration { | |||||
@Autowired(required = false) | @Autowired(required = false) | ||||
private JedisPool jedisPool; | private JedisPool jedisPool; | ||||
@Autowired(required = false) | |||||
private RedissonClient redissonClient; | |||||
@Value("${wx.open.config-storage.redis.host:}") | @Value("${wx.open.config-storage.redis.host:}") | ||||
private String redisHost; | private String redisHost; | ||||
@@ -40,12 +48,20 @@ public class WxOpenStorageAutoConfiguration { | |||||
if (type == WxOpenProperties.StorageType.redis) { | if (type == WxOpenProperties.StorageType.redis) { | ||||
return getWxOpenInRedisConfigStorage(); | return getWxOpenInRedisConfigStorage(); | ||||
} | } | ||||
if (type == WxOpenProperties.StorageType.jedis){ | |||||
return getWxOpenInRedisConfigStorage(); | |||||
} | |||||
if (type == WxOpenProperties.StorageType.redisson){ | |||||
return getWxOpenInRedissonConfigStorage(); | |||||
} | |||||
return getWxOpenInMemoryConfigStorage(); | return getWxOpenInMemoryConfigStorage(); | ||||
} | } | ||||
private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { | private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { | ||||
WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); | WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); | ||||
setWxOpenInfo(config); | |||||
config.setWxOpenInfo(properties.getAppId(),properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
return config; | return config; | ||||
} | } | ||||
@@ -55,17 +71,21 @@ public class WxOpenStorageAutoConfiguration { | |||||
poolToUse = getJedisPool(); | poolToUse = getJedisPool(); | ||||
} | } | ||||
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse); | WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse); | ||||
setWxOpenInfo(config); | |||||
config.setWxOpenInfo(properties.getAppId(),properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
return config; | return config; | ||||
} | } | ||||
private void setWxOpenInfo(WxOpenConfigStorage config) { | |||||
config.setComponentAppId(properties.getAppId()); | |||||
config.setComponentAppSecret(properties.getSecret()); | |||||
config.setComponentToken(properties.getToken()); | |||||
config.setComponentAesKey(properties.getAesKey()); | |||||
private WxOpenInRedissonConfigStorage getWxOpenInRedissonConfigStorage(){ | |||||
RedissonClient redissonClientToUse = this.redissonClient; | |||||
if(redissonClient == null){ | |||||
redissonClientToUse = getRedissonClient(); | |||||
} | |||||
WxOpenInRedissonConfigStorage config = new WxOpenInRedissonConfigStorage(redissonClientToUse); | |||||
config.setWxOpenInfo(properties.getAppId(),properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
return config; | |||||
} | } | ||||
private JedisPool getJedisPool() { | private JedisPool getJedisPool() { | ||||
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); | WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); | ||||
RedisProperties redis = storage.getRedis(); | RedisProperties redis = storage.getRedis(); | ||||
@@ -90,4 +110,16 @@ public class WxOpenStorageAutoConfiguration { | |||||
redis.getTimeout(), redis.getPassword(), redis.getDatabase()); | redis.getTimeout(), redis.getPassword(), redis.getDatabase()); | ||||
return pool; | return pool; | ||||
} | } | ||||
private RedissonClient getRedissonClient(){ | |||||
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); | |||||
RedisProperties redis = storage.getRedis(); | |||||
Config config = new Config(); | |||||
config.useSingleServer() | |||||
.setAddress("redis://" + redis.getHost() + ":" + redis.getPort()) | |||||
.setPassword(redis.getPassword()); | |||||
config.setTransportMode(TransportMode.NIO); | |||||
return Redisson.create(config); | |||||
} | |||||
} | } |
@@ -63,6 +63,14 @@ public class WxOpenProperties { | |||||
/** | /** | ||||
* redis. | * redis. | ||||
*/ | */ | ||||
redis | |||||
redis, | |||||
/** | |||||
* jedis. | |||||
*/ | |||||
jedis, | |||||
/** | |||||
* redisson. | |||||
*/ | |||||
redisson | |||||
} | } | ||||
} | } |
@@ -87,6 +87,10 @@ | |||||
<groupId>org.projectlombok</groupId> | <groupId>org.projectlombok</groupId> | ||||
<artifactId>lombok</artifactId> | <artifactId>lombok</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.redisson</groupId> | |||||
<artifactId>redisson</artifactId> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<build> | <build> | ||||
@@ -128,4 +128,13 @@ public interface WxOpenConfigStorage { | |||||
* @param expiresInSeconds 过期时间,以秒为单位 | * @param expiresInSeconds 过期时间,以秒为单位 | ||||
*/ | */ | ||||
void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds); | void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds); | ||||
/** | |||||
* 设置第三方平台基础信息 | |||||
* @param componentAppId 第三方平台 appid | |||||
* @param componentAppSecret 第三方平台 appsecret | |||||
* @param componentToken 消息校验Token | |||||
* @param componentAesKey 消息加解密Key | |||||
*/ | |||||
void setWxOpenInfo(String componentAppId, String componentAppSecret, String componentToken, String componentAesKey); | |||||
} | } |
@@ -0,0 +1,47 @@ | |||||
package me.chanjar.weixin.open.api.impl; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | |||||
* @author yangyidian | |||||
* @date 2020/01/09 | |||||
**/ | |||||
public abstract class AbstractWxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
protected final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:"; | |||||
protected final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:"; | |||||
protected final static String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:"; | |||||
protected final static String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:"; | |||||
protected final static String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:"; | |||||
protected final static String CARD_API_TICKET_KEY = "wechat_card_api_ticket:"; | |||||
/** | |||||
* redis 存储的 key 的前缀,可为空 | |||||
*/ | |||||
protected String keyPrefix; | |||||
protected String componentVerifyTicketKey; | |||||
protected String componentAccessTokenKey; | |||||
protected String authorizerRefreshTokenKey; | |||||
protected String authorizerAccessTokenKey; | |||||
protected String jsapiTicketKey; | |||||
protected String cardApiTicket; | |||||
@Override | |||||
public void setComponentAppId(String componentAppId) { | |||||
super.setComponentAppId(componentAppId); | |||||
String prefix = StringUtils.isBlank(keyPrefix) ? "" : | |||||
(StringUtils.endsWith(keyPrefix, ":") ? keyPrefix : (keyPrefix + ":")); | |||||
componentVerifyTicketKey = prefix + COMPONENT_VERIFY_TICKET_KEY.concat(componentAppId); | |||||
componentAccessTokenKey = prefix + COMPONENT_ACCESS_TOKEN_KEY.concat(componentAppId); | |||||
authorizerRefreshTokenKey = prefix + AUTHORIZER_REFRESH_TOKEN_KEY.concat(componentAppId); | |||||
authorizerAccessTokenKey = prefix + AUTHORIZER_ACCESS_TOKEN_KEY.concat(componentAppId); | |||||
this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(componentAppId); | |||||
this.cardApiTicket = CARD_API_TICKET_KEY.concat(componentAppId); | |||||
} | |||||
protected String getKey(String prefix, String appId) { | |||||
return prefix.endsWith(":") ? prefix.concat(appId) : prefix.concat(":").concat(appId); | |||||
} | |||||
} |
@@ -2,6 +2,7 @@ package me.chanjar.weixin.open.api.impl; | |||||
import cn.binarywang.wx.miniapp.config.WxMaConfig; | import cn.binarywang.wx.miniapp.config.WxMaConfig; | ||||
import lombok.Data; | |||||
import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | ||||
import me.chanjar.weixin.mp.bean.WxMpHostConfig; | import me.chanjar.weixin.mp.bean.WxMpHostConfig; | ||||
@@ -23,6 +24,7 @@ import java.util.concurrent.locks.ReentrantLock; | |||||
* | * | ||||
* @author <a href="https://github.com/007gzs">007</a> | * @author <a href="https://github.com/007gzs">007</a> | ||||
*/ | */ | ||||
@Data | |||||
public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | ||||
private String componentAppId; | private String componentAppId; | ||||
private String componentAppSecret; | private String componentAppSecret; | ||||
@@ -43,60 +45,7 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
private Map<String, Token> jsapiTickets = new ConcurrentHashMap<>(); | private Map<String, Token> jsapiTickets = new ConcurrentHashMap<>(); | ||||
private Map<String, Token> cardApiTickets = new ConcurrentHashMap<>(); | private Map<String, Token> cardApiTickets = new ConcurrentHashMap<>(); | ||||
@Override | |||||
public String getComponentAppId() { | |||||
return componentAppId; | |||||
} | |||||
@Override | |||||
public void setComponentAppId(String componentAppId) { | |||||
this.componentAppId = componentAppId; | |||||
} | |||||
@Override | |||||
public String getComponentAppSecret() { | |||||
return componentAppSecret; | |||||
} | |||||
@Override | |||||
public void setComponentAppSecret(String componentAppSecret) { | |||||
this.componentAppSecret = componentAppSecret; | |||||
} | |||||
@Override | |||||
public String getComponentToken() { | |||||
return componentToken; | |||||
} | |||||
@Override | |||||
public void setComponentToken(String componentToken) { | |||||
this.componentToken = componentToken; | |||||
} | |||||
@Override | |||||
public String getComponentAesKey() { | |||||
return componentAesKey; | |||||
} | |||||
@Override | |||||
public void setComponentAesKey(String componentAesKey) { | |||||
this.componentAesKey = componentAesKey; | |||||
} | |||||
@Override | |||||
public String getComponentVerifyTicket() { | |||||
return componentVerifyTicket; | |||||
} | |||||
@Override | |||||
public void setComponentVerifyTicket(String componentVerifyTicket) { | |||||
this.componentVerifyTicket = componentVerifyTicket; | |||||
} | |||||
@Override | |||||
public String getComponentAccessToken() { | |||||
return componentAccessToken; | |||||
} | |||||
@Override | @Override | ||||
public boolean isComponentAccessTokenExpired() { | public boolean isComponentAccessTokenExpired() { | ||||
@@ -113,51 +62,6 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
updateComponentAccessToken(componentAccessToken.getComponentAccessToken(), componentAccessToken.getExpiresIn()); | updateComponentAccessToken(componentAccessToken.getComponentAccessToken(), componentAccessToken.getExpiresIn()); | ||||
} | } | ||||
@Override | |||||
public String getHttpProxyHost() { | |||||
return httpProxyHost; | |||||
} | |||||
public void setHttpProxyHost(String httpProxyHost) { | |||||
this.httpProxyHost = httpProxyHost; | |||||
} | |||||
@Override | |||||
public int getHttpProxyPort() { | |||||
return httpProxyPort; | |||||
} | |||||
public void setHttpProxyPort(int httpProxyPort) { | |||||
this.httpProxyPort = httpProxyPort; | |||||
} | |||||
@Override | |||||
public String getHttpProxyUsername() { | |||||
return httpProxyUsername; | |||||
} | |||||
public void setHttpProxyUsername(String httpProxyUsername) { | |||||
this.httpProxyUsername = httpProxyUsername; | |||||
} | |||||
@Override | |||||
public String getHttpProxyPassword() { | |||||
return httpProxyPassword; | |||||
} | |||||
public void setHttpProxyPassword(String httpProxyPassword) { | |||||
this.httpProxyPassword = httpProxyPassword; | |||||
} | |||||
@Override | |||||
public ApacheHttpClientBuilder getApacheHttpClientBuilder() { | |||||
return apacheHttpClientBuilder; | |||||
} | |||||
public ApacheHttpClientBuilder setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) { | |||||
return this.apacheHttpClientBuilder = apacheHttpClientBuilder; | |||||
} | |||||
@Override | @Override | ||||
public WxMpConfigStorage getWxMpConfigStorage(String appId) { | public WxMpConfigStorage getWxMpConfigStorage(String appId) { | ||||
return new WxOpenInnerConfigStorage(this, appId); | return new WxOpenInnerConfigStorage(this, appId); | ||||
@@ -174,6 +78,14 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
this.componentExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; | this.componentExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; | ||||
} | } | ||||
@Override | |||||
public void setWxOpenInfo(String componentAppId, String componentAppSecret, String componentToken, String componentAesKey) { | |||||
setComponentAppId(componentAppId); | |||||
setComponentAppSecret(componentAppSecret); | |||||
setComponentToken(componentToken); | |||||
setComponentAesKey(componentAesKey); | |||||
} | |||||
@Override | @Override | ||||
public boolean autoRefreshToken() { | public boolean autoRefreshToken() { | ||||
return true; | return true; | ||||
@@ -1,6 +1,5 @@ | |||||
package me.chanjar.weixin.open.api.impl; | package me.chanjar.weixin.open.api.impl; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import redis.clients.jedis.Jedis; | import redis.clients.jedis.Jedis; | ||||
import redis.clients.jedis.JedisPool; | import redis.clients.jedis.JedisPool; | ||||
import redis.clients.util.Pool; | import redis.clients.util.Pool; | ||||
@@ -8,26 +7,9 @@ import redis.clients.util.Pool; | |||||
/** | /** | ||||
* @author <a href="https://github.com/007gzs">007</a> | * @author <a href="https://github.com/007gzs">007</a> | ||||
*/ | */ | ||||
public class WxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
private final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:"; | |||||
private final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:"; | |||||
private final static String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:"; | |||||
private final static String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:"; | |||||
private final static String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:"; | |||||
private final static String CARD_API_TICKET_KEY = "wechat_card_api_ticket:"; | |||||
public class WxOpenInRedisConfigStorage extends AbstractWxOpenInRedisConfigStorage { | |||||
protected final Pool<Jedis> jedisPool; | protected final Pool<Jedis> jedisPool; | ||||
/** | |||||
* redis 存储的 key 的前缀,可为空 | |||||
*/ | |||||
private String keyPrefix; | |||||
private String componentVerifyTicketKey; | |||||
private String componentAccessTokenKey; | |||||
private String authorizerRefreshTokenKey; | |||||
private String authorizerAccessTokenKey; | |||||
private String jsapiTicketKey; | |||||
private String cardApiTicket; | |||||
public WxOpenInRedisConfigStorage(Pool<Jedis> jedisPool) { | public WxOpenInRedisConfigStorage(Pool<Jedis> jedisPool) { | ||||
this.jedisPool = jedisPool; | this.jedisPool = jedisPool; | ||||
@@ -42,19 +24,6 @@ public class WxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
this.jedisPool = jedisPool; | this.jedisPool = jedisPool; | ||||
} | } | ||||
@Override | |||||
public void setComponentAppId(String componentAppId) { | |||||
super.setComponentAppId(componentAppId); | |||||
String prefix = StringUtils.isBlank(keyPrefix) ? "" : | |||||
(StringUtils.endsWith(keyPrefix, ":") ? keyPrefix : (keyPrefix + ":")); | |||||
componentVerifyTicketKey = prefix + COMPONENT_VERIFY_TICKET_KEY.concat(componentAppId); | |||||
componentAccessTokenKey = prefix + COMPONENT_ACCESS_TOKEN_KEY.concat(componentAppId); | |||||
authorizerRefreshTokenKey = prefix + AUTHORIZER_REFRESH_TOKEN_KEY.concat(componentAppId); | |||||
authorizerAccessTokenKey = prefix + AUTHORIZER_ACCESS_TOKEN_KEY.concat(componentAppId); | |||||
this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(componentAppId); | |||||
this.cardApiTicket = CARD_API_TICKET_KEY.concat(componentAppId); | |||||
} | |||||
@Override | @Override | ||||
public String getComponentVerifyTicket() { | public String getComponentVerifyTicket() { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | try (Jedis jedis = this.jedisPool.getResource()) { | ||||
@@ -97,10 +66,6 @@ public class WxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
} | } | ||||
} | } | ||||
private String getKey(String prefix, String appId) { | |||||
return prefix.endsWith(":") ? prefix.concat(appId) : prefix.concat(":").concat(appId); | |||||
} | |||||
@Override | @Override | ||||
public String getAuthorizerRefreshToken(String appId) { | public String getAuthorizerRefreshToken(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | try (Jedis jedis = this.jedisPool.getResource()) { | ||||
@@ -0,0 +1,128 @@ | |||||
package me.chanjar.weixin.open.api.impl; | |||||
import java.util.concurrent.TimeUnit; | |||||
import org.redisson.api.RedissonClient; | |||||
/** | |||||
* @author yangyidian | |||||
* @date 2020/01/06 | |||||
**/ | |||||
public class WxOpenInRedissonConfigStorage extends AbstractWxOpenInRedisConfigStorage{ | |||||
private RedissonClient redissonClient; | |||||
public WxOpenInRedissonConfigStorage(RedissonClient redissonClient, String keyPrefix) { | |||||
this.keyPrefix = keyPrefix; | |||||
this.redissonClient = redissonClient; | |||||
} | |||||
public WxOpenInRedissonConfigStorage(RedissonClient redissonClient) { | |||||
this.redissonClient = redissonClient; | |||||
} | |||||
@Override | |||||
public String getComponentVerifyTicket() { | |||||
Object value = redissonClient.getBucket(this.componentVerifyTicketKey).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public void setComponentVerifyTicket(String componentVerifyTicket) { | |||||
redissonClient.getBucket(this.componentVerifyTicketKey).set(componentVerifyTicket); | |||||
} | |||||
@Override | |||||
public String getComponentAccessToken() { | |||||
Object value = redissonClient.getBucket(this.componentAccessTokenKey).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public boolean isComponentAccessTokenExpired() { | |||||
return redissonClient.getBucket(this.componentAccessTokenKey).remainTimeToLive() < 2; | |||||
} | |||||
@Override | |||||
public void expireComponentAccessToken() { | |||||
redissonClient.getBucket(this.componentAccessTokenKey).expire(0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { | |||||
redissonClient.getBucket(this.componentAccessTokenKey).set(componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getAuthorizerRefreshToken(String appId) { | |||||
Object value = redissonClient.getBucket(this.getKey(this.authorizerRefreshTokenKey, appId)).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { | |||||
redissonClient.getBucket(this.getKey(this.authorizerRefreshTokenKey, appId)).set(authorizerRefreshToken); | |||||
} | |||||
@Override | |||||
public String getAuthorizerAccessToken(String appId) { | |||||
Object value = redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public boolean isAuthorizerAccessTokenExpired(String appId) { | |||||
return redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).remainTimeToLive() < 2; | |||||
} | |||||
@Override | |||||
public void expireAuthorizerAccessToken(String appId) { | |||||
redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).expire(0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { | |||||
redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).set(authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getJsapiTicket(String appId) { | |||||
Object value = redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public boolean isJsapiTicketExpired(String appId) { | |||||
return redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).remainTimeToLive() < 2; | |||||
} | |||||
@Override | |||||
public void expireJsapiTicket(String appId) { | |||||
redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).expire(0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { | |||||
redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).set(jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getCardApiTicket(String appId) { | |||||
Object value = redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).get(); | |||||
return value == null ? null : value.toString(); | |||||
} | |||||
@Override | |||||
public boolean isCardApiTicketExpired(String appId) { | |||||
return redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).remainTimeToLive() < 2; | |||||
} | |||||
@Override | |||||
public void expireCardApiTicket(String appId) { | |||||
redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).expire(0 ,TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { | |||||
redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).set(cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
} |
@@ -0,0 +1,131 @@ | |||||
package me.chanjar.weixin.open.api.impl; | |||||
import me.chanjar.weixin.open.api.WxOpenConfigStorage; | |||||
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; | |||||
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.AfterClass; | |||||
import org.testng.annotations.BeforeClass; | |||||
import org.testng.annotations.Test; | |||||
import redis.clients.jedis.JedisPool; | |||||
public class WxOpenInRedisConfigStorageTest { | |||||
private WxOpenConfigStorage wxOpenConfigStorage; | |||||
private JedisPool pool; | |||||
@BeforeClass | |||||
public void setWxOpenConfigStorage(){ | |||||
pool = new JedisPool("127.0.0.1", 6379); | |||||
this.wxOpenConfigStorage = new WxOpenInRedisConfigStorage(pool); | |||||
this.wxOpenConfigStorage.setWxOpenInfo("ComponentAppId", "ComponentAppSecret", "ComponentToken","ComponentAesKey"); | |||||
this.wxOpenConfigStorage.setComponentVerifyTicket("ComponentVerifyTicket"); | |||||
} | |||||
@AfterClass | |||||
public void clearResource(){ | |||||
pool.close(); | |||||
} | |||||
@Test | |||||
public void testGetComponentVerifyTicket() { | |||||
String componentVerifyTicket = this.wxOpenConfigStorage.getComponentVerifyTicket(); | |||||
Assert.assertEquals(componentVerifyTicket, "ComponentVerifyTicket"); | |||||
} | |||||
@Test | |||||
public void testSetComponentVerifyTicket() { | |||||
this.wxOpenConfigStorage.setComponentVerifyTicket("new ComponentVerifyTicket"); | |||||
String componentVerifyTicket = this.wxOpenConfigStorage.getComponentVerifyTicket(); | |||||
Assert.assertEquals(componentVerifyTicket, "new ComponentVerifyTicket"); | |||||
} | |||||
@Test | |||||
public void testIsComponentAccessTokenExpired() { | |||||
String responseContent = "{\"component_access_token\": \"new componentAccessToken\", \"expires_in\": 10000}"; | |||||
WxOpenComponentAccessToken componentAccessToken = WxOpenComponentAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateComponentAccessToken(componentAccessToken); | |||||
boolean expired = this.wxOpenConfigStorage.isComponentAccessTokenExpired(); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireComponentAccessToken(); | |||||
expired = this.wxOpenConfigStorage.isComponentAccessTokenExpired(); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetAuthorizerRefreshToken() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.setAuthorizerRefreshToken(appid, "AuthorizerRefreshToken 1"); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerRefreshToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "AuthorizerRefreshToken 1"); | |||||
this.wxOpenConfigStorage.setAuthorizerRefreshToken(appid, "AuthorizerRefreshToken 2"); | |||||
authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerRefreshToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "AuthorizerRefreshToken 2"); | |||||
} | |||||
@Test | |||||
public void testGetAuthorizerAccessToken() { | |||||
String appid = "appid1"; | |||||
String responseContent = "{\"authorizer_access_token\": \"new authorizer_access_token\",\"expires_in\": 100000}"; | |||||
WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateAuthorizerAccessToken(appid, wxOpenAuthorizerAccessToken); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerAccessToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "new authorizer_access_token"); | |||||
} | |||||
@Test | |||||
public void testIsAuthorizerAccessTokenExpired() { | |||||
String appid = "appid1"; | |||||
String responseContent = "{\"authorizer_access_token\": \"new authorizer_access_token\",\"expires_in\": 100000}"; | |||||
WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateAuthorizerAccessToken(appid, wxOpenAuthorizerAccessToken); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerAccessToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "new authorizer_access_token"); | |||||
boolean expired = this.wxOpenConfigStorage.isAuthorizerAccessTokenExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireAuthorizerAccessToken(appid); | |||||
expired = this.wxOpenConfigStorage.isAuthorizerAccessTokenExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetJsapiTicket() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.updateJsapiTicket(appid, "jsapiTicket", 100000); | |||||
String jsapiTicket = this.wxOpenConfigStorage.getJsapiTicket(appid); | |||||
Assert.assertEquals(jsapiTicket, "jsapiTicket"); | |||||
boolean expired = this.wxOpenConfigStorage.isJsapiTicketExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireJsapiTicket(appid); | |||||
jsapiTicket = this.wxOpenConfigStorage.getJsapiTicket(appid); | |||||
Assert.assertEquals(jsapiTicket, null); | |||||
expired = this.wxOpenConfigStorage.isJsapiTicketExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetCardApiTicket() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.updateCardApiTicket(appid, "new CardApiTicket", 10000); | |||||
String cardApiTicket = this.wxOpenConfigStorage.getCardApiTicket(appid); | |||||
Assert.assertEquals(cardApiTicket, "new CardApiTicket"); | |||||
boolean expired = this.wxOpenConfigStorage.isCardApiTicketExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireCardApiTicket(appid); | |||||
expired = this.wxOpenConfigStorage.isCardApiTicketExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
} |
@@ -0,0 +1,129 @@ | |||||
package me.chanjar.weixin.open.api.impl; | |||||
import me.chanjar.weixin.open.api.WxOpenConfigStorage; | |||||
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; | |||||
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; | |||||
import org.redisson.Redisson; | |||||
import org.redisson.api.RedissonClient; | |||||
import org.redisson.config.Config; | |||||
import org.redisson.config.TransportMode; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.BeforeClass; | |||||
import org.testng.annotations.Test; | |||||
public class WxOpenInRedissonConfigStorageTest { | |||||
private WxOpenConfigStorage wxOpenConfigStorage; | |||||
@BeforeClass | |||||
public void setWxOpenConfigStorage(){ | |||||
Config config = new Config(); | |||||
config.useSingleServer().setAddress("redis://127.0.0.1:6379") | |||||
.setDatabase(0); | |||||
config.setTransportMode(TransportMode.NIO); | |||||
RedissonClient redisson = Redisson.create(config); | |||||
this.wxOpenConfigStorage = new WxOpenInRedissonConfigStorage(redisson); | |||||
this.wxOpenConfigStorage.setWxOpenInfo("ComponentAppId", "ComponentAppSecret", "ComponentToken","ComponentAesKey"); | |||||
this.wxOpenConfigStorage.setComponentVerifyTicket("ComponentVerifyTicket"); | |||||
} | |||||
@Test | |||||
public void testGetComponentVerifyTicket() { | |||||
String componentVerifyTicket = this.wxOpenConfigStorage.getComponentVerifyTicket(); | |||||
Assert.assertEquals(componentVerifyTicket, "ComponentVerifyTicket"); | |||||
} | |||||
@Test | |||||
public void testSetComponentVerifyTicket() { | |||||
this.wxOpenConfigStorage.setComponentVerifyTicket("new ComponentVerifyTicket"); | |||||
String componentVerifyTicket = this.wxOpenConfigStorage.getComponentVerifyTicket(); | |||||
Assert.assertEquals(componentVerifyTicket, "new ComponentVerifyTicket"); | |||||
} | |||||
@Test | |||||
public void testIsComponentAccessTokenExpired() { | |||||
String responseContent = "{\"component_access_token\": \"new componentAccessToken\", \"expires_in\": 10000}"; | |||||
WxOpenComponentAccessToken componentAccessToken = WxOpenComponentAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateComponentAccessToken(componentAccessToken); | |||||
boolean expired = this.wxOpenConfigStorage.isComponentAccessTokenExpired(); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireComponentAccessToken(); | |||||
expired = this.wxOpenConfigStorage.isComponentAccessTokenExpired(); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetAuthorizerRefreshToken() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.setAuthorizerRefreshToken(appid, "AuthorizerRefreshToken 1"); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerRefreshToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "AuthorizerRefreshToken 1"); | |||||
this.wxOpenConfigStorage.setAuthorizerRefreshToken(appid, "AuthorizerRefreshToken 2"); | |||||
authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerRefreshToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "AuthorizerRefreshToken 2"); | |||||
} | |||||
@Test | |||||
public void testGetAuthorizerAccessToken() { | |||||
String appid = "appid1"; | |||||
String responseContent = "{\"authorizer_access_token\": \"new authorizer_access_token\",\"expires_in\": 100000}"; | |||||
WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateAuthorizerAccessToken(appid, wxOpenAuthorizerAccessToken); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerAccessToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "new authorizer_access_token"); | |||||
} | |||||
@Test | |||||
public void testIsAuthorizerAccessTokenExpired() { | |||||
String appid = "appid1"; | |||||
String responseContent = "{\"authorizer_access_token\": \"new authorizer_access_token\",\"expires_in\": 100000}"; | |||||
WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent); | |||||
this.wxOpenConfigStorage.updateAuthorizerAccessToken(appid, wxOpenAuthorizerAccessToken); | |||||
String authorizerAccessToken = this.wxOpenConfigStorage.getAuthorizerAccessToken(appid); | |||||
Assert.assertEquals(authorizerAccessToken, "new authorizer_access_token"); | |||||
boolean expired = this.wxOpenConfigStorage.isAuthorizerAccessTokenExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireAuthorizerAccessToken(appid); | |||||
expired = this.wxOpenConfigStorage.isAuthorizerAccessTokenExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetJsapiTicket() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.updateJsapiTicket(appid, "jsapiTicket", 100000); | |||||
String jsapiTicket = this.wxOpenConfigStorage.getJsapiTicket(appid); | |||||
Assert.assertEquals(jsapiTicket, "jsapiTicket"); | |||||
boolean expired = this.wxOpenConfigStorage.isJsapiTicketExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireJsapiTicket(appid); | |||||
jsapiTicket = this.wxOpenConfigStorage.getJsapiTicket(appid); | |||||
Assert.assertEquals(jsapiTicket, null); | |||||
expired = this.wxOpenConfigStorage.isJsapiTicketExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
@Test | |||||
public void testGetCardApiTicket() { | |||||
String appid = "appid1"; | |||||
this.wxOpenConfigStorage.updateCardApiTicket(appid, "new CardApiTicket", 10000); | |||||
String cardApiTicket = this.wxOpenConfigStorage.getCardApiTicket(appid); | |||||
Assert.assertEquals(cardApiTicket, "new CardApiTicket"); | |||||
boolean expired = this.wxOpenConfigStorage.isCardApiTicketExpired(appid); | |||||
Assert.assertEquals(expired, false); | |||||
this.wxOpenConfigStorage.expireCardApiTicket(appid); | |||||
expired = this.wxOpenConfigStorage.isCardApiTicketExpired(appid); | |||||
Assert.assertEquals(expired, true); | |||||
} | |||||
} |