diff --git a/pom.xml b/pom.xml index fe57185a..f9d48319 100644 --- a/pom.xml +++ b/pom.xml @@ -242,6 +242,12 @@ 2.9.0 provided + + org.redisson + redisson + 3.12.0 + provided + org.projectlombok lombok diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index ab75bdde..10ae9649 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -24,6 +24,11 @@ jedis compile + + org.redisson + redisson + compile + diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpStorageAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpStorageAutoConfiguration.java index 18024707..4ddff5a7 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpStorageAutoConfiguration.java +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpStorageAutoConfiguration.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -26,6 +27,9 @@ public class WxMpStorageAutoConfiguration { @Autowired(required = false) private JedisPool jedisPool; + @Autowired(required = false) + private RedissonClient redissonClient; + @Bean @ConditionalOnMissingBean(WxMpConfigStorage.class) public WxMpConfigStorage wxMpInMemoryConfigStorage() { diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 64e479a2..55c23378 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -24,6 +24,11 @@ jedis compile + + org.redisson + redisson + compile + diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java index 5b575519..b7afd532 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java @@ -6,7 +6,12 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.open.api.WxOpenConfigStorage; import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage; +import me.chanjar.weixin.open.api.impl.WxOpenInRedissonConfigStorage; 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.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -28,6 +33,9 @@ public class WxOpenStorageAutoConfiguration { @Autowired(required = false) private JedisPool jedisPool; + @Autowired(required = false) + private RedissonClient redissonClient; + @Value("${wx.open.config-storage.redis.host:}") private String redisHost; @@ -40,12 +48,20 @@ public class WxOpenStorageAutoConfiguration { if (type == WxOpenProperties.StorageType.redis) { return getWxOpenInRedisConfigStorage(); } + + if (type == WxOpenProperties.StorageType.jedis){ + return getWxOpenInRedisConfigStorage(); + } + + if (type == WxOpenProperties.StorageType.redisson){ + return getWxOpenInRedissonConfigStorage(); + } return getWxOpenInMemoryConfigStorage(); } private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); - setWxOpenInfo(config); + config.setWxOpenInfo(properties.getAppId(),properties.getSecret(), properties.getToken(), properties.getAesKey()); return config; } @@ -55,17 +71,21 @@ public class WxOpenStorageAutoConfiguration { poolToUse = getJedisPool(); } WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse); - setWxOpenInfo(config); + config.setWxOpenInfo(properties.getAppId(),properties.getSecret(), properties.getToken(), properties.getAesKey()); 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() { WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); RedisProperties redis = storage.getRedis(); @@ -90,4 +110,16 @@ public class WxOpenStorageAutoConfiguration { redis.getTimeout(), redis.getPassword(), redis.getDatabase()); 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); + } } diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java index 64cc3d06..03e3427e 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java @@ -63,6 +63,14 @@ public class WxOpenProperties { /** * redis. */ - redis + redis, + /** + * jedis. + */ + jedis, + /** + * redisson. + */ + redisson } } diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index abf673bd..2d40676b 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -87,6 +87,10 @@ org.projectlombok lombok + + org.redisson + redisson + diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java index 40833c1b..79969228 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java @@ -128,4 +128,13 @@ public interface WxOpenConfigStorage { * @param 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); } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java new file mode 100644 index 00000000..0d0b1bf2 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java @@ -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); + } + +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java index e67cb29e..491dc6b7 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.open.api.impl; import cn.binarywang.wx.miniapp.config.WxMaConfig; +import lombok.Data; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import me.chanjar.weixin.mp.bean.WxMpHostConfig; @@ -23,6 +24,7 @@ import java.util.concurrent.locks.ReentrantLock; * * @author 007 */ +@Data public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { private String componentAppId; private String componentAppSecret; @@ -43,60 +45,7 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { private Map jsapiTickets = new ConcurrentHashMap<>(); private Map 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 public boolean isComponentAccessTokenExpired() { @@ -113,51 +62,6 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { 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 public WxMpConfigStorage getWxMpConfigStorage(String appId) { return new WxOpenInnerConfigStorage(this, appId); @@ -174,6 +78,14 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { 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 public boolean autoRefreshToken() { return true; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java index 8962b38c..f1b903d4 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.open.api.impl; -import org.apache.commons.lang3.StringUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.util.Pool; @@ -8,26 +7,9 @@ import redis.clients.util.Pool; /** * @author 007 */ -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 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 jedisPool) { this.jedisPool = jedisPool; @@ -42,19 +24,6 @@ public class WxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { 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 public String getComponentVerifyTicket() { 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 public String getAuthorizerRefreshToken(String appId) { try (Jedis jedis = this.jedisPool.getResource()) { diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java new file mode 100644 index 00000000..7fdf1ba1 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java @@ -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); + } +} diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorageTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorageTest.java new file mode 100644 index 00000000..26a30a20 --- /dev/null +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorageTest.java @@ -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); + } +} diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorageTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorageTest.java new file mode 100644 index 00000000..7168d93f --- /dev/null +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorageTest.java @@ -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); + } +}