diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 34c6d1f53..96699ab26 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -21,6 +21,7 @@ wx-java-miniapp-spring-boot-starter wx-java-mp-spring-boot-starter wx-java-pay-spring-boot-starter + wx-java-open-spring-boot-starter diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/README.md b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md new file mode 100644 index 000000000..fd00f0353 --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md @@ -0,0 +1,34 @@ +# wx-java-open-spring-boot-starter +## 快速开始 +1. 引入依赖 + ```xml + + com.github.binarywang + wx-java-open-spring-boot-starter + ${version} + + ``` +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 + ``` +3. 支持自动注入的类型: `WxOpenService, WxOpenMessageRouter, WxOpenComponentService` + +4. 覆盖自动配置: 自定义注入的bean会覆盖自动注入的 + - WxOpenConfigStorage + - WxOpenService + + + + + + + diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml new file mode 100644 index 000000000..d88d66d43 --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.github.binarywang + wx-java + 3.5.2.B + ../../ + + + wx-java-open-spring-boot-starter + WxJava - Spring Boot Starter for OEPN + 微信开放平台开发的 Spring Boot Starter + + + 2.1.4.RELEASE + + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + true + + + com.github.binarywang + weixin-java-open + ${project.version} + + + redis.clients + jedis + compile + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java new file mode 100644 index 000000000..0f7ecf3e8 --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java @@ -0,0 +1,17 @@ +package com.binarywang.spring.starter.wxjava.open.config; + +import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * . + * + * @author someone + */ +@Configuration +@EnableConfigurationProperties(WxOpenProperties.class) +@Import({WxOpenStorageAutoConfiguration.class, WxOpenServiceAutoConfiguration.class}) +public class WxOpenAutoConfiguration { +} diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java new file mode 100644 index 000000000..b58bbccda --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java @@ -0,0 +1,39 @@ +package com.binarywang.spring.starter.wxjava.open.config; + +import me.chanjar.weixin.open.api.WxOpenComponentService; +import me.chanjar.weixin.open.api.WxOpenConfigStorage; +import me.chanjar.weixin.open.api.WxOpenService; +import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter; +import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 微信开放平台相关服务自动注册. + * + * @author someone + */ +@Configuration +public class WxOpenServiceAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public WxOpenService wxOpenService(WxOpenConfigStorage configStorage) { + WxOpenService wxOpenService = new WxOpenServiceImpl(); + wxOpenService.setWxOpenConfigStorage(configStorage); + return wxOpenService; + } + + @Bean + public WxOpenMessageRouter wxOpenMessageRouter(WxOpenService wxOpenService) { + return new WxOpenMessageRouter(wxOpenService); + } + + @Bean + public WxOpenComponentService wxOpenComponentService(WxOpenService wxOpenService) { + return wxOpenService.getWxOpenComponentService(); + } + + +} diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java new file mode 100644 index 000000000..d34de5e62 --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java @@ -0,0 +1,93 @@ +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.WxOpenProperties; +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.open.api.WxOpenConfigStorage; +import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; +import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +/** + * 微信公众号存储策略自动配置. + * + * @author someone + */ +@Configuration +@RequiredArgsConstructor +public class WxOpenStorageAutoConfiguration { + private final WxOpenProperties properties; + + @Autowired(required = false) + private JedisPool jedisPool; + + @Value("${wx.open.config-storage.redis.host:}") + private String redisHost; + + @Bean + @ConditionalOnMissingBean(WxOpenConfigStorage.class) + public WxOpenConfigStorage wxOpenConfigStorage() { + WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); + WxOpenProperties.StorageType type = storage.getType(); + + if (type == WxOpenProperties.StorageType.redis) { + return getWxOpenInRedisConfigStorage(); + } + return getWxOpenInMemoryConfigStorage(); + } + + private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { + WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); + setWxOpenInfo(config); + return config; + } + + private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() { + JedisPool poolToUse = jedisPool; + if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) { + poolToUse = getJedisPool(); + } + WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse); + setWxOpenInfo(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 JedisPool getJedisPool() { + WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); + RedisProperties redis = storage.getRedis(); + + JedisPoolConfig config = new JedisPoolConfig(); + if (redis.getMaxActive() != null) { + config.setMaxTotal(redis.getMaxActive()); + } + if (redis.getMaxIdle() != null) { + config.setMaxIdle(redis.getMaxIdle()); + } + if (redis.getMaxWaitMillis() != null) { + config.setMaxWaitMillis(redis.getMaxWaitMillis()); + } + if (redis.getMinIdle() != null) { + config.setMinIdle(redis.getMinIdle()); + } + config.setTestOnBorrow(true); + config.setTestWhileIdle(true); + + JedisPool pool = new JedisPool(config, redis.getHost(), redis.getPort(), + redis.getTimeout(), redis.getPassword(), redis.getDatabase()); + return pool; + } +} diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java new file mode 100644 index 000000000..c72c9edbe --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java @@ -0,0 +1,45 @@ +package com.binarywang.spring.starter.wxjava.open.properties; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Redis配置. + * + * @author someone + */ +@Data +public 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/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java new file mode 100644 index 000000000..d2fe088f5 --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java @@ -0,0 +1,68 @@ +package com.binarywang.spring.starter.wxjava.open.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.io.Serializable; + +import static com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties.PREFIX; +import static com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties.StorageType.memory; + + +/** + * 微信接入相关配置属性. + * + * @author someone + */ +@Data +@ConfigurationProperties(PREFIX) +public class WxOpenProperties { + public static final String PREFIX = "wx.open"; + + /** + * 设置微信开放平台的appid. + */ + private String appId; + + /** + * 设置微信开放平台的app secret. + */ + private String secret; + + /** + * 设置微信开放平台的token. + */ + private String token; + + /** + * 设置微信开放平台的EncodingAESKey. + */ + private String aesKey; + + /** + * 存储策略, memory, redis. + */ + private ConfigStorage configStorage = new ConfigStorage(); + + + @Data + public static class ConfigStorage implements Serializable { + private static final long serialVersionUID = 4815731027000065434L; + + private StorageType type = memory; + + private RedisProperties redis = new RedisProperties(); + + } + + public enum StorageType { + /** + * 内存. + */ + memory, + /** + * redis. + */ + redis + } +} diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..d46458f9d --- /dev/null +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.binarywang.spring.starter.wxjava.open.config.WxOpenAutoConfiguration