@@ -1,26 +1,35 @@ | |||||
# 使用说明 | |||||
1. 在自己的Spring Boot项目里,引入maven依赖 | |||||
```xml | |||||
# wx-java-miniapp-spring-boot-starter | |||||
## 快速开始 | |||||
1. 引入依赖 | |||||
```xml | |||||
<dependency> | <dependency> | ||||
<groupId>com.github.binarywang</groupId> | <groupId>com.github.binarywang</groupId> | ||||
<artifactId>wx-java-miniapp-spring-boot-starter</artifactId> | <artifactId>wx-java-miniapp-spring-boot-starter</artifactId> | ||||
<version>${version}</version> | <version>${version}</version> | ||||
</dependency> | </dependency> | ||||
``` | |||||
2. 添加配置(application.yml) | |||||
```yml | |||||
wx: | |||||
miniapp: | |||||
appid: 111 | |||||
secret: 111 | |||||
token: 111 | |||||
aesKey: 111 | |||||
msgDataFormat: JSON | |||||
``` | |||||
``` | |||||
2. 添加配置(application.properties) | |||||
```properties | |||||
# 公众号配置(必填) | |||||
wx.miniapp.appid = appId | |||||
wx.miniapp.secret = @secret | |||||
wx.miniapp.token = @token | |||||
wx.miniapp.aesKey = @aesKey | |||||
wx.miniapp.msgDataFormat = @msgDataFormat # 消息格式,XML或者JSON. | |||||
# 存储配置redis(可选) | |||||
# 注意: 指定redis.host值后不会使用容器注入的redis连接(JedisPool) | |||||
wx.miniapp.config-storage.type = jedis # 配置类型: memory(默认), jedis, redistemplate | |||||
wx.miniapp.config-storage.key-prefix = wa # 相关redis前缀配置: wa(默认) | |||||
wx.miniapp.config-storage.redis.host = 127.0.0.1 | |||||
wx.miniapp.config-storage.redis.port = 6379 | |||||
# http客户端配置 | |||||
wx.miniapp.config-storage.http-client-type=httpclient # http客户端类型: httpclient(默认) | |||||
wx.miniapp.config-storage.http-proxy-host= | |||||
wx.miniapp.config-storage.http-proxy-port= | |||||
wx.miniapp.config-storage.http-proxy-username= | |||||
wx.miniapp.config-storage.http-proxy-password= | |||||
``` | |||||
3. 自动注入的类型 | |||||
- `WxMaService` | |||||
- `WxMaConfig` | |||||
@@ -1,4 +1,4 @@ | |||||
# wx-java-mp-starter | |||||
# wx-java-mp-spring-boot-starter | |||||
## 快速开始 | ## 快速开始 | ||||
1. 引入依赖 | 1. 引入依赖 | ||||
```xml | ```xml | ||||
@@ -27,9 +27,9 @@ | |||||
wx.mp.config-storage.http-proxy-username= | wx.mp.config-storage.http-proxy-username= | ||||
wx.mp.config-storage.http-proxy-password= | wx.mp.config-storage.http-proxy-password= | ||||
``` | ``` | ||||
3. 支持自动注入的类型 | |||||
`WxMpService`以及~~相关的服务类, 比如: `wxMpService.getXxxService`。~~ | |||||
3. 自动注入的类型 | |||||
- `WxMpService`以及~~相关的服务类, 比如: `wxMpService.getXxxService`。~~ | |||||
- `WxMpConfigStorage` | |||||
@@ -9,26 +9,27 @@ | |||||
</dependency> | </dependency> | ||||
``` | ``` | ||||
2. 添加配置(application.properties) | 2. 添加配置(application.properties) | ||||
``` | |||||
# 开放平台配置(必填) | |||||
wx.open.appId = @appId | |||||
wx.open.secret = @secret | |||||
wx.open.token = @token | |||||
wx.open.aesKey = @aesKey | |||||
# 存储配置redis(可选), 优先使用(wx.open.config-storage.redis)配置的redis, 支持自定注入的JedisPool | |||||
wx.open.config-storage.type = redis # 可选值, memory(默认), redis | |||||
wx.open.config-storage.redis.host = 127.0.0.1 | |||||
wx.open.config-storage.redis.port = 6379 | |||||
```properties | |||||
# 公众号配置(必填) | |||||
wx.open.appId = appId | |||||
wx.open.secret = @secret | |||||
wx.open.token = @token | |||||
wx.open.aesKey = @aesKey | |||||
# 存储配置redis(可选) | |||||
# 优先注入容器的(JedisPool, RedissonClient), 当配置了wx.open.config-storage.redis.host, 不会使用容器注入redis连接配置 | |||||
wx.open.config-storage.type = redis # 配置类型: memory(默认), redis(jedis), jedis, redisson, redistemplate | |||||
wx.open.config-storage.key-prefix = wx # 相关redis前缀配置: wx(默认) | |||||
wx.open.config-storage.redis.host = 127.0.0.1 | |||||
wx.open.config-storage.redis.port = 6379 | |||||
# http客户端配置 | |||||
wx.open.config-storage.http-client-type=httpclient # http客户端类型: httpclient(默认) | |||||
wx.open.config-storage.http-proxy-host= | |||||
wx.open.config-storage.http-proxy-port= | |||||
wx.open.config-storage.http-proxy-username= | |||||
wx.open.config-storage.http-proxy-password= | |||||
``` | ``` | ||||
3. 支持自动注入的类型: `WxOpenService, WxOpenMessageRouter, WxOpenComponentService` | 3. 支持自动注入的类型: `WxOpenService, WxOpenMessageRouter, WxOpenComponentService` | ||||
4. 覆盖自动配置: 自定义注入的bean会覆盖自动注入的 | 4. 覆盖自动配置: 自定义注入的bean会覆盖自动注入的 | ||||
- WxOpenConfigStorage | - WxOpenConfigStorage | ||||
- WxOpenService | - WxOpenService | ||||
@@ -22,12 +22,18 @@ | |||||
<dependency> | <dependency> | ||||
<groupId>redis.clients</groupId> | <groupId>redis.clients</groupId> | ||||
<artifactId>jedis</artifactId> | <artifactId>jedis</artifactId> | ||||
<scope>compile</scope> | |||||
<scope>provided</scope> | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>org.redisson</groupId> | <groupId>org.redisson</groupId> | ||||
<artifactId>redisson</artifactId> | <artifactId>redisson</artifactId> | ||||
<scope>compile</scope> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.data</groupId> | |||||
<artifactId>spring-data-redis</artifactId> | |||||
<version>${spring.boot.version}</version> | |||||
<scope>provided</scope> | |||||
</dependency> | </dependency> | ||||
</dependencies> | </dependencies> | ||||
@@ -3,20 +3,23 @@ package com.binarywang.spring.starter.wxjava.open.config; | |||||
import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties; | import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties; | ||||
import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties; | import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import me.chanjar.weixin.common.redis.JedisWxRedisOps; | |||||
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; | |||||
import me.chanjar.weixin.common.redis.RedissonWxRedisOps; | |||||
import me.chanjar.weixin.common.redis.WxRedisOps; | |||||
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.Redisson; | ||||
import org.redisson.api.RedissonClient; | import org.redisson.api.RedissonClient; | ||||
import org.redisson.config.Config; | import org.redisson.config.Config; | ||||
import org.redisson.config.TransportMode; | 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; | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||
import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
import org.springframework.data.redis.core.StringRedisTemplate; | |||||
import redis.clients.jedis.JedisPool; | import redis.clients.jedis.JedisPool; | ||||
import redis.clients.jedis.JedisPoolConfig; | import redis.clients.jedis.JedisPoolConfig; | ||||
@@ -29,15 +32,7 @@ import redis.clients.jedis.JedisPoolConfig; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class WxOpenStorageAutoConfiguration { | public class WxOpenStorageAutoConfiguration { | ||||
private final WxOpenProperties properties; | private final WxOpenProperties properties; | ||||
@Autowired(required = false) | |||||
private JedisPool jedisPool; | |||||
@Autowired(required = false) | |||||
private RedissonClient redissonClient; | |||||
@Value("${wx.open.config-storage.redis.host:}") | |||||
private String redisHost; | |||||
private final ApplicationContext applicationContext; | |||||
@Bean | @Bean | ||||
@ConditionalOnMissingBean(WxOpenConfigStorage.class) | @ConditionalOnMissingBean(WxOpenConfigStorage.class) | ||||
@@ -45,43 +40,63 @@ public class WxOpenStorageAutoConfiguration { | |||||
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); | WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); | ||||
WxOpenProperties.StorageType type = storage.getType(); | WxOpenProperties.StorageType type = storage.getType(); | ||||
if (type == WxOpenProperties.StorageType.redis) { | |||||
return getWxOpenInRedisConfigStorage(); | |||||
WxOpenInMemoryConfigStorage config; | |||||
if (type == WxOpenProperties.StorageType.redis || type == WxOpenProperties.StorageType.jedis) { | |||||
config = getWxOpenInRedisConfigStorage(); | |||||
} else if (type == WxOpenProperties.StorageType.redisson) { | |||||
config = getWxOpenInRedissonConfigStorage(); | |||||
} else if (type == WxOpenProperties.StorageType.redistemplate) { | |||||
config = getWxOpenInRedisTemplateConfigStorage(); | |||||
} else { | |||||
config = getWxOpenInMemoryConfigStorage(); | |||||
} | } | ||||
if (type == WxOpenProperties.StorageType.jedis) { | |||||
return getWxOpenInRedisConfigStorage(); | |||||
} | |||||
if (type == WxOpenProperties.StorageType.redisson) { | |||||
return getWxOpenInRedissonConfigStorage(); | |||||
WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage(); | |||||
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost()); | |||||
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername()); | |||||
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword()); | |||||
if (configStorageProperties.getHttpProxyPort() != null) { | |||||
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort()); | |||||
} | } | ||||
return getWxOpenInMemoryConfigStorage(); | |||||
return config; | |||||
} | } | ||||
private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { | private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { | ||||
WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); | WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); | ||||
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
return config; | return config; | ||||
} | } | ||||
private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() { | private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() { | ||||
JedisPool poolToUse = jedisPool; | |||||
if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) { | |||||
poolToUse = getJedisPool(); | |||||
RedisProperties redisProperties = properties.getConfigStorage().getRedis(); | |||||
JedisPool jedisPool; | |||||
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) { | |||||
jedisPool = getJedisPool(); | |||||
} else { | |||||
jedisPool = applicationContext.getBean(JedisPool.class); | |||||
} | } | ||||
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse, properties.getConfigStorage().getKeyPrefix()); | |||||
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
WxRedisOps redisOps = new JedisWxRedisOps(jedisPool); | |||||
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); | |||||
return config; | return config; | ||||
} | } | ||||
private WxOpenInRedissonConfigStorage getWxOpenInRedissonConfigStorage() { | |||||
RedissonClient redissonClientToUse = this.redissonClient; | |||||
if (redissonClient == null) { | |||||
redissonClientToUse = getRedissonClient(); | |||||
private WxOpenInRedisConfigStorage getWxOpenInRedissonConfigStorage() { | |||||
RedisProperties redisProperties = properties.getConfigStorage().getRedis(); | |||||
RedissonClient redissonClient; | |||||
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) { | |||||
redissonClient = getRedissonClient(); | |||||
} else { | |||||
redissonClient = applicationContext.getBean(RedissonClient.class); | |||||
} | } | ||||
WxOpenInRedissonConfigStorage config = new WxOpenInRedissonConfigStorage(redissonClientToUse, properties.getConfigStorage().getKeyPrefix()); | |||||
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); | |||||
WxRedisOps redisOps = new RedissonWxRedisOps(redissonClient); | |||||
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); | |||||
return config; | |||||
} | |||||
private WxOpenInRedisConfigStorage getWxOpenInRedisTemplateConfigStorage() { | |||||
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class); | |||||
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate); | |||||
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); | |||||
return config; | return config; | ||||
} | } | ||||
@@ -16,7 +16,7 @@ public class RedisProperties implements Serializable { | |||||
/** | /** | ||||
* 主机地址. | * 主机地址. | ||||
*/ | */ | ||||
private String host = "127.0.0.1"; | |||||
private String host; | |||||
/** | /** | ||||
* 端口号. | * 端口号. | ||||
@@ -40,7 +40,7 @@ public class WxOpenProperties { | |||||
private String aesKey; | private String aesKey; | ||||
/** | /** | ||||
* 存储策略, memory, redis. | |||||
* 存储策略. | |||||
*/ | */ | ||||
private ConfigStorage configStorage = new ConfigStorage(); | private ConfigStorage configStorage = new ConfigStorage(); | ||||
@@ -49,11 +49,45 @@ public class WxOpenProperties { | |||||
public static class ConfigStorage implements Serializable { | public static class ConfigStorage implements Serializable { | ||||
private static final long serialVersionUID = 4815731027000065434L; | private static final long serialVersionUID = 4815731027000065434L; | ||||
/** | |||||
* 存储类型. | |||||
*/ | |||||
private StorageType type = memory; | private StorageType type = memory; | ||||
/** | |||||
* 指定key前缀. | |||||
*/ | |||||
private String keyPrefix = "wx"; | |||||
/** | |||||
* redis连接配置. | |||||
*/ | |||||
private RedisProperties redis = new RedisProperties(); | private RedisProperties redis = new RedisProperties(); | ||||
private String keyPrefix; | |||||
/** | |||||
* http客户端类型. | |||||
*/ | |||||
private HttpClientType httpClientType = HttpClientType.httpclient; | |||||
/** | |||||
* http代理主机. | |||||
*/ | |||||
private String httpProxyHost; | |||||
/** | |||||
* http代理端口. | |||||
*/ | |||||
private Integer httpProxyPort; | |||||
/** | |||||
* http代理用户名. | |||||
*/ | |||||
private String httpProxyUsername; | |||||
/** | |||||
* http代理密码. | |||||
*/ | |||||
private String httpProxyPassword; | |||||
} | } | ||||
@@ -73,6 +107,17 @@ public class WxOpenProperties { | |||||
/** | /** | ||||
* redisson. | * redisson. | ||||
*/ | */ | ||||
redisson | |||||
redisson, | |||||
/** | |||||
* redistemplate | |||||
*/ | |||||
redistemplate | |||||
} | |||||
public enum HttpClientType { | |||||
/** | |||||
* HttpClient. | |||||
*/ | |||||
httpclient | |||||
} | } | ||||
} | } |
@@ -3,7 +3,7 @@ package me.chanjar.weixin.common.redis; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import me.chanjar.weixin.common.util.locks.JedisDistributedLock; | import me.chanjar.weixin.common.util.locks.JedisDistributedLock; | ||||
import redis.clients.jedis.Jedis; | import redis.clients.jedis.Jedis; | ||||
import redis.clients.jedis.JedisPool; | |||||
import redis.clients.util.Pool; | |||||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
import java.util.concurrent.locks.Lock; | import java.util.concurrent.locks.Lock; | ||||
@@ -11,7 +11,7 @@ import java.util.concurrent.locks.Lock; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class JedisWxRedisOps implements WxRedisOps { | public class JedisWxRedisOps implements WxRedisOps { | ||||
private final JedisPool jedisPool; | |||||
private final Pool<Jedis> jedisPool; | |||||
@Override | @Override | ||||
public String getValue(String key) { | public String getValue(String key) { | ||||
@@ -1,10 +1,12 @@ | |||||
package me.chanjar.weixin.open.api.impl; | package me.chanjar.weixin.open.api.impl; | ||||
import me.chanjar.weixin.common.util.locks.JedisDistributedLock; | |||||
import lombok.NonNull; | |||||
import me.chanjar.weixin.common.redis.JedisWxRedisOps; | |||||
import me.chanjar.weixin.common.redis.WxRedisOps; | |||||
import redis.clients.jedis.Jedis; | import redis.clients.jedis.Jedis; | ||||
import redis.clients.jedis.JedisPool; | |||||
import redis.clients.util.Pool; | import redis.clients.util.Pool; | ||||
import java.util.concurrent.TimeUnit; | |||||
import java.util.concurrent.locks.Lock; | import java.util.concurrent.locks.Lock; | ||||
/** | /** | ||||
@@ -12,163 +14,127 @@ import java.util.concurrent.locks.Lock; | |||||
*/ | */ | ||||
public class WxOpenInRedisConfigStorage extends AbstractWxOpenInRedisConfigStorage { | public class WxOpenInRedisConfigStorage extends AbstractWxOpenInRedisConfigStorage { | ||||
protected final Pool<Jedis> jedisPool; | |||||
private final WxRedisOps redisOps; | |||||
public WxOpenInRedisConfigStorage(Pool<Jedis> jedisPool) { | public WxOpenInRedisConfigStorage(Pool<Jedis> jedisPool) { | ||||
this.jedisPool = jedisPool; | |||||
this(jedisPool, null); | |||||
} | } | ||||
public WxOpenInRedisConfigStorage(Pool<Jedis> jedisPool, String keyPrefix) { | |||||
this.jedisPool = jedisPool; | |||||
this.keyPrefix = keyPrefix; | |||||
public WxOpenInRedisConfigStorage(@NonNull Pool<Jedis> jedisPool, String keyPrefix) { | |||||
this(new JedisWxRedisOps(jedisPool), keyPrefix); | |||||
} | } | ||||
public WxOpenInRedisConfigStorage(JedisPool jedisPool) { | |||||
this.jedisPool = jedisPool; | |||||
public WxOpenInRedisConfigStorage(@NonNull WxRedisOps redisOps, String keyPrefix) { | |||||
this.redisOps = redisOps; | |||||
this.keyPrefix = keyPrefix; | |||||
} | } | ||||
@Override | @Override | ||||
public String getComponentVerifyTicket() { | public String getComponentVerifyTicket() { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.componentVerifyTicketKey); | |||||
} | |||||
return redisOps.getValue(this.componentVerifyTicketKey); | |||||
} | } | ||||
@Override | @Override | ||||
public void setComponentVerifyTicket(String componentVerifyTicket) { | public void setComponentVerifyTicket(String componentVerifyTicket) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.set(this.componentVerifyTicketKey, componentVerifyTicket); | |||||
} | |||||
redisOps.setValue(this.componentVerifyTicketKey, componentVerifyTicket, Integer.MAX_VALUE, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public String getComponentAccessToken() { | public String getComponentAccessToken() { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.componentAccessTokenKey); | |||||
} | |||||
return redisOps.getValue(this.componentAccessTokenKey); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean isComponentAccessTokenExpired() { | public boolean isComponentAccessTokenExpired() { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.ttl(this.componentAccessTokenKey) < 2; | |||||
} | |||||
Long expire = redisOps.getExpire(this.componentAccessTokenKey); | |||||
return expire == null || expire < 2; | |||||
} | } | ||||
@Override | @Override | ||||
public void expireComponentAccessToken() { | public void expireComponentAccessToken() { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.expire(this.componentAccessTokenKey, 0); | |||||
} | |||||
redisOps.expire(this.componentAccessTokenKey, 0, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { | public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.setex(this.componentAccessTokenKey, expiresInSeconds - 200, componentAccessToken); | |||||
} | |||||
redisOps.setValue(this.componentAccessTokenKey, componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public String getAuthorizerRefreshToken(String appId) { | public String getAuthorizerRefreshToken(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.getKey(this.authorizerRefreshTokenKey, appId)); | |||||
} | |||||
return redisOps.getValue(this.getKey(this.authorizerRefreshTokenKey, appId)); | |||||
} | } | ||||
@Override | @Override | ||||
public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { | public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.set(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken); | |||||
} | |||||
redisOps.setValue(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken, 0, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public String getAuthorizerAccessToken(String appId) { | public String getAuthorizerAccessToken(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.getKey(this.authorizerAccessTokenKey, appId)); | |||||
} | |||||
return redisOps.getValue(this.getKey(this.authorizerAccessTokenKey, appId)); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean isAuthorizerAccessTokenExpired(String appId) { | public boolean isAuthorizerAccessTokenExpired(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.ttl(this.getKey(this.authorizerAccessTokenKey, appId)) < 2; | |||||
} | |||||
Long expire = redisOps.getExpire(this.getKey(this.authorizerAccessTokenKey, appId)); | |||||
return expire == null || expire < 2; | |||||
} | } | ||||
@Override | @Override | ||||
public void expireAuthorizerAccessToken(String appId) { | public void expireAuthorizerAccessToken(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0); | |||||
} | |||||
redisOps.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { | public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.setex(this.getKey(this.authorizerAccessTokenKey, appId), expiresInSeconds - 200, authorizerAccessToken); | |||||
} | |||||
redisOps.setValue(this.getKey(this.authorizerAccessTokenKey, appId), authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public String getJsapiTicket(String appId) { | public String getJsapiTicket(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.getKey(this.jsapiTicketKey, appId)); | |||||
} | |||||
return redisOps.getValue(this.getKey(this.jsapiTicketKey, appId)); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean isJsapiTicketExpired(String appId) { | public boolean isJsapiTicketExpired(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.ttl(this.getKey(this.jsapiTicketKey, appId)) < 2; | |||||
} | |||||
Long expire = redisOps.getExpire(this.getKey(this.jsapiTicketKey, appId)); | |||||
return expire == null || expire < 2; | |||||
} | } | ||||
@Override | @Override | ||||
public void expireJsapiTicket(String appId) { | public void expireJsapiTicket(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.expire(this.getKey(this.jsapiTicketKey, appId), 0); | |||||
} | |||||
redisOps.expire(this.getKey(this.jsapiTicketKey, appId), 0, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { | public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.setex(this.getKey(this.jsapiTicketKey, appId), expiresInSeconds - 200, jsapiTicket); | |||||
} | |||||
redisOps.setValue(this.getKey(this.jsapiTicketKey, appId), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public String getCardApiTicket(String appId) { | public String getCardApiTicket(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.get(this.getKey(this.cardApiTicket, appId)); | |||||
} | |||||
return redisOps.getValue(this.getKey(this.cardApiTicket, appId)); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean isCardApiTicketExpired(String appId) { | public boolean isCardApiTicketExpired(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
return jedis.ttl(this.getKey(this.cardApiTicket, appId)) < 2; | |||||
} | |||||
Long expire = redisOps.getExpire(this.getKey(this.cardApiTicket, appId)); | |||||
return expire == null || expire < 2; | |||||
} | } | ||||
@Override | @Override | ||||
public void expireCardApiTicket(String appId) { | public void expireCardApiTicket(String appId) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.expire(this.getKey(this.cardApiTicket, appId), 0); | |||||
} | |||||
redisOps.expire(this.getKey(this.cardApiTicket, appId), 0, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { | public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { | ||||
try (Jedis jedis = this.jedisPool.getResource()) { | |||||
jedis.setex(this.getKey(this.cardApiTicket, appId), expiresInSeconds - 200, cardApiTicket); | |||||
} | |||||
redisOps.setValue(this.getKey(this.cardApiTicket, appId), cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | } | ||||
@Override | @Override | ||||
public Lock getLockByKey(String key) { | public Lock getLockByKey(String key) { | ||||
return new JedisDistributedLock(jedisPool, getKey(lockKey, key)); | |||||
return redisOps.getLock(key); | |||||
} | } | ||||
} | } |
@@ -1,128 +1,140 @@ | |||||
package me.chanjar.weixin.open.api.impl; | package me.chanjar.weixin.open.api.impl; | ||||
import java.util.concurrent.TimeUnit; | |||||
import lombok.NonNull; | |||||
import me.chanjar.weixin.common.redis.RedissonWxRedisOps; | |||||
import me.chanjar.weixin.common.redis.WxRedisOps; | |||||
import org.redisson.api.RedissonClient; | import org.redisson.api.RedissonClient; | ||||
import java.util.concurrent.TimeUnit; | |||||
import java.util.concurrent.locks.Lock; | |||||
/** | /** | ||||
* @author yangyidian | * @author yangyidian | ||||
* @date 2020/01/06 | * @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); | |||||
} | |||||
public class WxOpenInRedissonConfigStorage extends AbstractWxOpenInRedisConfigStorage { | |||||
private final WxRedisOps redisOps; | |||||
public WxOpenInRedissonConfigStorage(@NonNull RedissonClient redissonClient, String keyPrefix) { | |||||
this(new RedissonWxRedisOps(redissonClient), keyPrefix); | |||||
} | |||||
public WxOpenInRedissonConfigStorage(@NonNull RedissonClient redissonClient) { | |||||
this(redissonClient, null); | |||||
} | |||||
private WxOpenInRedissonConfigStorage(@NonNull WxRedisOps redisOps, String keyPrefix) { | |||||
this.redisOps = redisOps; | |||||
this.keyPrefix = keyPrefix; | |||||
} | |||||
@Override | |||||
public String getComponentVerifyTicket() { | |||||
return redisOps.getValue(this.componentVerifyTicketKey); | |||||
} | |||||
@Override | |||||
public void setComponentVerifyTicket(String componentVerifyTicket) { | |||||
redisOps.setValue(this.componentVerifyTicketKey, componentVerifyTicket, Integer.MAX_VALUE, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getComponentAccessToken() { | |||||
return redisOps.getValue(this.componentAccessTokenKey); | |||||
} | |||||
@Override | |||||
public boolean isComponentAccessTokenExpired() { | |||||
Long expire = redisOps.getExpire(this.componentAccessTokenKey); | |||||
return expire == null || expire < 2; | |||||
} | |||||
@Override | |||||
public void expireComponentAccessToken() { | |||||
redisOps.expire(this.componentAccessTokenKey, 0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { | |||||
redisOps.setValue(this.componentAccessTokenKey, componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getAuthorizerRefreshToken(String appId) { | |||||
return redisOps.getValue(this.getKey(this.authorizerRefreshTokenKey, appId)); | |||||
} | |||||
@Override | |||||
public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { | |||||
redisOps.setValue(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken, 0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getAuthorizerAccessToken(String appId) { | |||||
return redisOps.getValue(this.getKey(this.authorizerAccessTokenKey, appId)); | |||||
} | |||||
@Override | |||||
public boolean isAuthorizerAccessTokenExpired(String appId) { | |||||
Long expire = redisOps.getExpire(this.getKey(this.authorizerAccessTokenKey, appId)); | |||||
return expire == null || expire < 2; | |||||
} | |||||
@Override | |||||
public void expireAuthorizerAccessToken(String appId) { | |||||
redisOps.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { | |||||
redisOps.setValue(this.getKey(this.authorizerAccessTokenKey, appId), authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getJsapiTicket(String appId) { | |||||
return redisOps.getValue(this.getKey(this.jsapiTicketKey, appId)); | |||||
} | |||||
@Override | |||||
public boolean isJsapiTicketExpired(String appId) { | |||||
Long expire = redisOps.getExpire(this.getKey(this.jsapiTicketKey, appId)); | |||||
return expire == null || expire < 2; | |||||
} | |||||
@Override | |||||
public void expireJsapiTicket(String appId) { | |||||
redisOps.expire(this.getKey(this.jsapiTicketKey, appId), 0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { | |||||
redisOps.setValue(this.getKey(this.jsapiTicketKey, appId), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public String getCardApiTicket(String appId) { | |||||
return redisOps.getValue(this.getKey(this.cardApiTicket, appId)); | |||||
} | |||||
@Override | |||||
public boolean isCardApiTicketExpired(String appId) { | |||||
Long expire = redisOps.getExpire(this.getKey(this.cardApiTicket, appId)); | |||||
return expire == null || expire < 2; | |||||
} | |||||
@Override | |||||
public void expireCardApiTicket(String appId) { | |||||
redisOps.expire(this.getKey(this.cardApiTicket, appId), 0, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { | |||||
redisOps.setValue(this.getKey(this.cardApiTicket, appId), cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); | |||||
} | |||||
@Override | |||||
public Lock getLockByKey(String key) { | |||||
return redisOps.getLock(key); | |||||
} | |||||
} | } |