| @@ -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); | |||||
| } | |||||
| } | |||||