diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md b/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md
index ec7f343c6..58c8efbde 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md
@@ -11,18 +11,25 @@
2. 添加配置(application.properties)
```properties
# 公众号配置(必填)
- wx.mp.appId = @appId
- wx.mp.secret = @secret
- wx.mp.token = @token
- wx.mp.aesKey = @aesKey
- # 存储配置redis(可选)
- wx.mp.config-storage.type = redis
- wx.mp.config-storage.redis.host = 127.0.0.1
- wx.mp.config-storage.redis.port = 6379
+ wx.mp.appId = appId
+ wx.mp.secret = @secret
+ wx.mp.token = @token
+ wx.mp.aesKey = @aesKey
+ # 存储配置redis(可选)
+ wx.mp.config-storage.type = redis # 配置类型: memory(默认), redis, jedis, redistemplate
+ wx.mp.config-storage.key-prefix = wx # 相关redis前缀配置: wx(默认)
+ wx.mp.config-storage.redis.host = 127.0.0.1
+ wx.mp.config-storage.redis.port = 6379
+ # http客户端配置
+ wx.mp.config-storage.http-client-type=httpclient # http客户端类型: httpclient(默认), okhttp, joddhttp
+ wx.mp.config-storage.http-proxy-host=
+ wx.mp.config-storage.http-proxy-port=
+ wx.mp.config-storage.http-proxy-username=
+ wx.mp.config-storage.http-proxy-password=
```
3. 支持自动注入的类型
-`WxMpService`以及相关的服务类, 比如: `wxMpService.getXxxService`。
+`WxMpService`以及~~相关的服务类, 比如: `wxMpService.getXxxService`。~~
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 95b477f3b..bb6687340 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
@@ -25,10 +25,10 @@
compile
- org.redisson
- redisson
- compile
- true
+ org.springframework.data
+ spring-data-redis
+ ${spring.boot.version}
+ provided
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
index 7d9622673..17d1083ed 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
@@ -1,7 +1,11 @@
package com.binarywang.spring.starter.wxjava.mp.config;
+import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
import me.chanjar.weixin.mp.api.*;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceJoddHttpImpl;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceOkHttpImpl;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
@@ -17,113 +21,161 @@ public class WxMpServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public WxMpService wxMpService(WxMpConfigStorage configStorage) {
- WxMpService wxMpService = new WxMpServiceImpl();
+ public WxMpService wxMpService(WxMpConfigStorage configStorage, WxMpProperties wxMpProperties) {
+ WxMpProperties.HttpClientType httpClientType = wxMpProperties.getConfigStorage().getHttpClientType();
+ WxMpService wxMpService;
+ if (httpClientType == WxMpProperties.HttpClientType.okhttp) {
+ wxMpService = newWxMpServiceJoddHttpImpl();
+ } else if (httpClientType == WxMpProperties.HttpClientType.joddhttp) {
+ wxMpService = newWxMpServiceOkHttpImpl();
+ } else if (httpClientType == WxMpProperties.HttpClientType.httpclient) {
+ wxMpService = newWxMpServiceHttpClientImpl();
+ } else {
+ wxMpService = newWxMpServiceImpl();
+ }
+
wxMpService.setWxMpConfigStorage(configStorage);
return wxMpService;
}
+ private WxMpService newWxMpServiceImpl() {
+ return new WxMpServiceImpl();
+ }
+
+ private WxMpService newWxMpServiceHttpClientImpl() {
+ return new WxMpServiceHttpClientImpl();
+ }
+
+ private WxMpService newWxMpServiceOkHttpImpl() {
+ return new WxMpServiceOkHttpImpl();
+ }
+
+ private WxMpService newWxMpServiceJoddHttpImpl() {
+ return new WxMpServiceJoddHttpImpl();
+ }
+
@Bean
+ @Deprecated
public WxMpKefuService wxMpKefuService(WxMpService wxMpService) {
return wxMpService.getKefuService();
}
@Bean
+ @Deprecated
public WxMpMaterialService wxMpMaterialService(WxMpService wxMpService) {
return wxMpService.getMaterialService();
}
@Bean
+ @Deprecated
public WxMpMenuService wxMpMenuService(WxMpService wxMpService) {
return wxMpService.getMenuService();
}
@Bean
+ @Deprecated
public WxMpUserService wxMpUserService(WxMpService wxMpService) {
return wxMpService.getUserService();
}
@Bean
+ @Deprecated
public WxMpUserTagService wxMpUserTagService(WxMpService wxMpService) {
return wxMpService.getUserTagService();
}
@Bean
+ @Deprecated
public WxMpQrcodeService wxMpQrcodeService(WxMpService wxMpService) {
return wxMpService.getQrcodeService();
}
@Bean
+ @Deprecated
public WxMpCardService wxMpCardService(WxMpService wxMpService) {
return wxMpService.getCardService();
}
@Bean
+ @Deprecated
public WxMpDataCubeService wxMpDataCubeService(WxMpService wxMpService) {
return wxMpService.getDataCubeService();
}
@Bean
+ @Deprecated
public WxMpUserBlacklistService wxMpUserBlacklistService(WxMpService wxMpService) {
return wxMpService.getBlackListService();
}
@Bean
+ @Deprecated
public WxMpStoreService wxMpStoreService(WxMpService wxMpService) {
return wxMpService.getStoreService();
}
@Bean
+ @Deprecated
public WxMpTemplateMsgService wxMpTemplateMsgService(WxMpService wxMpService) {
return wxMpService.getTemplateMsgService();
}
@Bean
+ @Deprecated
public WxMpSubscribeMsgService wxMpSubscribeMsgService(WxMpService wxMpService) {
return wxMpService.getSubscribeMsgService();
}
@Bean
+ @Deprecated
public WxMpDeviceService wxMpDeviceService(WxMpService wxMpService) {
return wxMpService.getDeviceService();
}
@Bean
+ @Deprecated
public WxMpShakeService wxMpShakeService(WxMpService wxMpService) {
return wxMpService.getShakeService();
}
@Bean
+ @Deprecated
public WxMpMemberCardService wxMpMemberCardService(WxMpService wxMpService) {
return wxMpService.getMemberCardService();
}
@Bean
+ @Deprecated
public WxMpMassMessageService wxMpMassMessageService(WxMpService wxMpService) {
return wxMpService.getMassMessageService();
}
@Bean
+ @Deprecated
public WxMpAiOpenService wxMpAiOpenService(WxMpService wxMpService) {
return wxMpService.getAiOpenService();
}
@Bean
+ @Deprecated
public WxMpWifiService wxMpWifiService(WxMpService wxMpService) {
return wxMpService.getWifiService();
}
@Bean
+ @Deprecated
public WxMpMarketingService wxMpMarketingService(WxMpService wxMpService) {
return wxMpService.getMarketingService();
}
@Bean
+ @Deprecated
public WxMpCommentService wxMpCommentService(WxMpService wxMpService) {
return wxMpService.getCommentService();
}
@Bean
+ @Deprecated
public WxMpOcrService wxMpOcrService(WxMpService wxMpService) {
return wxMpService.getOcrService();
}
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 f25caf90b..5eb0ef5cd 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
@@ -1,15 +1,20 @@
package com.binarywang.spring.starter.wxjava.mp.config;
-import com.binarywang.spring.starter.wxjava.mp.properties.RedisProperties;
+import com.binarywang.spring.starter.wxjava.mp.extend.RedisTemplateWxMpRedisOps;
import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
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 me.chanjar.weixin.mp.config.redis.JedisWxMpRedisOps;
+import me.chanjar.weixin.mp.config.redis.WxMpRedisOps;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@@ -22,55 +27,77 @@ import redis.clients.jedis.JedisPoolConfig;
@RequiredArgsConstructor
public class WxMpStorageAutoConfiguration {
- private final WxMpProperties properties;
private final ApplicationContext applicationContext;
+ private final WxMpProperties wxMpProperties;
+
+ @Value("${wx.mp.config-storage.redis.host:")
+ private String redisHost;
+
+ @Value("${wx.mp.configStorage.redis.host:")
+ private String redisHost2;
+
@Bean
@ConditionalOnMissingBean(WxMpConfigStorage.class)
- public WxMpConfigStorage wxMpInMemoryConfigStorage() {
- WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
- WxMpProperties.StorageType type = storage.getType();
-
- if (type == WxMpProperties.StorageType.redis) {
- return getWxMpInRedisConfigStorage();
+ public WxMpConfigStorage wxMpConfigStorage() {
+ WxMpProperties.StorageType type = wxMpProperties.getConfigStorage().getType();
+ WxMpConfigStorage config;
+ if (type == WxMpProperties.StorageType.redis || type == WxMpProperties.StorageType.jedis) {
+ config = wxMpInJedisConfigStorage();
+ } else if (type == WxMpProperties.StorageType.redistemplate) {
+ config = wxMpInRedisTemplateConfigStorage();
+ } else {
+ config = wxMpInMemoryConfigStorage();
}
- return getWxMpInMemoryConfigStorage();
+ return config;
}
- private WxMpDefaultConfigImpl getWxMpInMemoryConfigStorage() {
+ private WxMpConfigStorage wxMpInMemoryConfigStorage() {
WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
setWxMpInfo(config);
return config;
}
- private WxMpRedisConfigImpl getWxMpInRedisConfigStorage() {
- RedisProperties.ImplType implType = properties.getConfigStorage().getRedis().getImpl();
- boolean reuseBean = properties.getConfigStorage().getRedis().isReuseBean();
- if (implType == RedisProperties.ImplType.jedis) {
- JedisPool pool = null;
- if (reuseBean) {
- pool = getBean(JedisPool.class);
- }
- if (pool == null) {
- pool = getJedisPool();
- }
- WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(pool);
- setWxMpInfo(config);
- return config;
+ private WxMpConfigStorage wxMpInJedisConfigStorage() {
+ JedisPool jedisPool;
+ if (StringUtils.isNotEmpty(redisHost) || StringUtils.isNotEmpty(redisHost2)) {
+ jedisPool = getJedisPool();
+ } else {
+ jedisPool = applicationContext.getBean(JedisPool.class);
}
- throw new UnsupportedOperationException();
+ WxMpRedisOps redisOps = new JedisWxMpRedisOps(jedisPool);
+ WxMpRedisConfigImpl wxMpRedisConfig = new WxMpRedisConfigImpl(redisOps, wxMpProperties.getConfigStorage().getKeyPrefix());
+ setWxMpInfo(wxMpRedisConfig);
+ return wxMpRedisConfig;
+ }
+
+ private WxMpConfigStorage wxMpInRedisTemplateConfigStorage() {
+ StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
+ WxMpRedisOps redisOps = new RedisTemplateWxMpRedisOps(redisTemplate);
+ WxMpRedisConfigImpl wxMpRedisConfig = new WxMpRedisConfigImpl(redisOps, wxMpProperties.getConfigStorage().getKeyPrefix());
+ setWxMpInfo(wxMpRedisConfig);
+ return wxMpRedisConfig;
}
private void setWxMpInfo(WxMpDefaultConfigImpl config) {
+ WxMpProperties properties = wxMpProperties;
+ WxMpProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
config.setAppId(properties.getAppId());
config.setSecret(properties.getSecret());
config.setToken(properties.getToken());
config.setAesKey(properties.getAesKey());
+
+ config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
+ config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
+ config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
+ if (configStorageProperties.getHttpProxyPort() != null) {
+ config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
+ }
}
private JedisPool getJedisPool() {
- WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
- RedisProperties redis = storage.getRedis();
+ WxMpProperties.ConfigStorage storage = wxMpProperties.getConfigStorage();
+ WxMpProperties.RedisProperties redis = storage.getRedis();
JedisPoolConfig config = new JedisPoolConfig();
if (redis.getMaxActive() != null) {
@@ -91,11 +118,4 @@ public class WxMpStorageAutoConfiguration {
return new JedisPool(config, redis.getHost(), redis.getPort(), redis.getTimeout(), redis.getPassword(),
redis.getDatabase());
}
-
- private T getBean(Class clazz) {
- if (this.applicationContext.getBeanNamesForType(clazz, false, false).length > 0) {
- return this.applicationContext.getBean(clazz);
- }
- return null;
- }
}
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/extend/RedisTemplateWxMpRedisOps.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/extend/RedisTemplateWxMpRedisOps.java
new file mode 100644
index 000000000..4939aba89
--- /dev/null
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/extend/RedisTemplateWxMpRedisOps.java
@@ -0,0 +1,40 @@
+package com.binarywang.spring.starter.wxjava.mp.extend;
+
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.mp.config.redis.BaseWxMpRedisOps;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+@RequiredArgsConstructor
+public class RedisTemplateWxMpRedisOps extends BaseWxMpRedisOps {
+
+ private final StringRedisTemplate redisTemplate;
+
+ @Override
+ public String getValue(String key) {
+ return redisTemplate.opsForValue().get(key);
+ }
+
+ @Override
+ public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
+ redisTemplate.opsForValue().set(key, value, expire, timeUnit);
+ }
+
+ @Override
+ public Long getExpire(String key) {
+ return redisTemplate.getExpire(key);
+ }
+
+ @Override
+ public void expire(String key, int expire, TimeUnit timeUnit) {
+ redisTemplate.expire(key, expire, timeUnit);
+ }
+
+ @Override
+ public Lock getLock(String key) {
+ return new ReentrantLock();
+ }
+}
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/RedisProperties.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/RedisProperties.java
deleted file mode 100644
index 840cf6e35..000000000
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/RedisProperties.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.binarywang.spring.starter.wxjava.mp.properties;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * Redis配置.
- *
- * @author someone
- */
-@Data
-public class RedisProperties implements Serializable {
- private static final long serialVersionUID = -5924815351660074401L;
-
- /**
- * 操作Redis的实现
- */
- private ImplType impl = ImplType.jedis;
-
- /**
- * 操作Redis的实现如果在spring容器里是否直接使用
- */
- private boolean reuseBean = true;
-
- /**
- * 主机地址.
- */
- private String host = "127.0.0.1";
-
- /**
- * 端口号.
- */
- private int port = 6379;
-
- /**
- * 密码.
- */
- private String password;
-
- /**
- * 超时.
- */
- private int timeout = 2000;
-
- /**
- * 数据库.
- */
- private int database = 0;
-
- private Integer maxActive;
- private Integer maxIdle;
- private Integer maxWaitMillis;
- private Integer minIdle;
-
- public enum ImplType {
- /**
- * jedis.
- */
- jedis,
- /**
- * redisson.
- */
-// redisson
- }
-}
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/WxMpProperties.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/WxMpProperties.java
index 4a9bfbbfe..60b39d9cd 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/WxMpProperties.java
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/properties/WxMpProperties.java
@@ -2,7 +2,6 @@ package com.binarywang.spring.starter.wxjava.mp.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.context.properties.NestedConfigurationProperty;
import java.io.Serializable;
@@ -41,19 +40,54 @@ public class WxMpProperties {
private String aesKey;
/**
- * 存储策略, memory, redis.
+ * 存储策略
*/
- private final ConfigStorage configStorage = new ConfigStorage();
-
+ private ConfigStorage configStorage = new ConfigStorage();
@Data
public static class ConfigStorage implements Serializable {
private static final long serialVersionUID = 4815731027000065434L;
+ /**
+ * 存储类型.
+ */
private StorageType type = memory;
- @NestedConfigurationProperty
- private final RedisProperties redis = new RedisProperties();
+ /**
+ * 指定key前缀.
+ */
+ private String keyPrefix = "wx";
+
+ /**
+ * redis连接配置.
+ */
+ private RedisProperties redis = new RedisProperties();
+
+ /**
+ * http客户端类型.
+ */
+ private HttpClientType httpClientType = HttpClientType.httpclient;
+
+ /**
+ * http代理主机.
+ */
+ private String httpProxyHost;
+
+ /**
+ * http代理端口.
+ */
+ private Integer httpProxyPort;
+
+ /**
+ * http代理用户名.
+ */
+ private String httpProxyUsername;
+
+ /**
+ * http代理密码.
+ */
+ private String httpProxyPassword;
+
}
public enum StorageType {
@@ -62,8 +96,67 @@ public class WxMpProperties {
*/
memory,
/**
- * redis.
+ * jedis.
*/
- redis
+ redis,
+ /**
+ * redis(JedisClient).
+ */
+ jedis,
+ /**
+ * redis(RedisTemplate).
+ */
+ redistemplate
}
+
+ public enum HttpClientType {
+ /**
+ * HttpClient.
+ */
+ httpclient,
+ /**
+ * OkHttp.
+ */
+ okhttp,
+ /**
+ * JoddHttp.
+ */
+ joddhttp
+ }
+
+ @Data
+ public static class RedisProperties implements Serializable {
+ private static final long serialVersionUID = -5924815351660074401L;
+
+ /**
+ * 主机地址.
+ */
+ private String host = "127.0.0.1";
+
+ /**
+ * 端口号.
+ */
+ private int port = 6379;
+
+ /**
+ * 密码.
+ */
+ private String password;
+
+ /**
+ * 超时.
+ */
+ private int timeout = 2000;
+
+ /**
+ * 数据库.
+ */
+ private int database = 0;
+
+ private Integer maxActive;
+ private Integer maxIdle;
+ private Integer maxWaitMillis;
+ private Integer minIdle;
+ }
+
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
index b6574cfe5..86710ccce 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
@@ -14,8 +14,6 @@ import okio.BufferedSink;
import okio.Okio;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;