diff --git a/pom.xml b/pom.xml index 7843d044..6432bd3e 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,7 @@ weixin-java-miniapp weixin-java-open starters/wx-java-pay-starter + starters/wx-java-mp-starter diff --git a/starters/wx-java-mp-starter/README.md b/starters/wx-java-mp-starter/README.md new file mode 100644 index 00000000..d8e10103 --- /dev/null +++ b/starters/wx-java-mp-starter/README.md @@ -0,0 +1,32 @@ +# wx-java-mp-starter +## 快速开始 +1. 引入依赖 + ```xml + + com.github.binarywang + wx-java-mp-starter + ${version} + + ``` +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 + ``` +3. 支持自动注入的类型 + +`WxMpService`以及相关的服务类, 比如: `wxMpService.getXxxService`。 + + + + + + + diff --git a/starters/wx-java-mp-starter/pom.xml b/starters/wx-java-mp-starter/pom.xml new file mode 100644 index 00000000..d5ce48ed --- /dev/null +++ b/starters/wx-java-mp-starter/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + com.github.binarywang + wx-java + 3.3.8.B + + + wx-java-mp-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-mp + ${project.version} + + + redis.clients + jedis + + + 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/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/RedisProperties.java b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/RedisProperties.java new file mode 100644 index 00000000..d609cc88 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/RedisProperties.java @@ -0,0 +1,42 @@ +package com.binarywang.spring.starter.wxjava.mp; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Redis配置 + */ +@Data +public class RedisProperties implements Serializable { + + /** + * 主机地址 + */ + 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; +} \ No newline at end of file diff --git a/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpAutoConfiguration.java b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpAutoConfiguration.java new file mode 100644 index 00000000..ba85d044 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpAutoConfiguration.java @@ -0,0 +1,11 @@ +package com.binarywang.spring.starter.wxjava.mp; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@EnableConfigurationProperties(WxMpProperties.class) +@Import({WxMpStorageAutoConfiguration.class, WxMpServiceAutoConfiguration.class}) +public class WxMpAutoConfiguration { +} diff --git a/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpProperties.java b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpProperties.java new file mode 100644 index 00000000..af74f430 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpProperties.java @@ -0,0 +1,58 @@ +package com.binarywang.spring.starter.wxjava.mp; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.io.Serializable; + +import static com.binarywang.spring.starter.wxjava.mp.WxMpProperties.PREFIX; +import static com.binarywang.spring.starter.wxjava.mp.WxMpProperties.StorageType.memory; + + +/** + * 微信接入相关配置属性 + */ +@Data +@ConfigurationProperties(PREFIX) +public class WxMpProperties { + public static final String PREFIX = "wx.mp"; + + /** + * 设置微信公众号的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 StorageType type = memory; + + private RedisProperties redis = new RedisProperties(); + + } + + public enum StorageType { + memory, redis + } +} diff --git a/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpServiceAutoConfiguration.java b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpServiceAutoConfiguration.java new file mode 100644 index 00000000..7a6cf920 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpServiceAutoConfiguration.java @@ -0,0 +1,53 @@ +package com.binarywang.spring.starter.wxjava.mp; + +import me.chanjar.weixin.mp.api.WxMpConfigStorage; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 微信公众号相关服务自动注册 + */ +@Configuration +public class WxMpServiceAutoConfiguration { + @Autowired + private ApplicationContext ctx; + + @Bean + @ConditionalOnMissingBean + public WxMpService wxMpService(WxMpConfigStorage configStorage) { + WxMpService wxMpService = new WxMpServiceImpl(); + wxMpService.setWxMpConfigStorage(configStorage); + registerWxMpSubService(wxMpService); + return wxMpService; + } + + @ConditionalOnBean(WxMpService.class) + public Object registerWxMpSubService(WxMpService wxMpService) { + ConfigurableListableBeanFactory factory = (ConfigurableListableBeanFactory) ctx.getAutowireCapableBeanFactory(); + factory.registerSingleton("wxMpKefuService", wxMpService.getKefuService()); + factory.registerSingleton("wxMpMaterialService", wxMpService.getMaterialService()); + factory.registerSingleton("wxMpMenuService", wxMpService.getMenuService()); + factory.registerSingleton("wxMpUserService", wxMpService.getUserService()); + factory.registerSingleton("wxMpUserTagService", wxMpService.getUserTagService()); + factory.registerSingleton("wxMpQrcodeService", wxMpService.getQrcodeService()); + factory.registerSingleton("wxMpCardService", wxMpService.getCardService()); + factory.registerSingleton("wxMpDataCubeService", wxMpService.getDataCubeService()); + factory.registerSingleton("wxMpUserBlacklistService", wxMpService.getBlackListService()); + factory.registerSingleton("wxMpStoreService", wxMpService.getStoreService()); + factory.registerSingleton("wxMpTemplateMsgService", wxMpService.getTemplateMsgService()); + factory.registerSingleton("wxMpSubscribeMsgService", wxMpService.getSubscribeMsgService()); + factory.registerSingleton("wxMpDeviceService", wxMpService.getDeviceService()); + factory.registerSingleton("wxMpShakeService", wxMpService.getShakeService()); + factory.registerSingleton("wxMpMemberCardService", wxMpService.getMemberCardService()); + factory.registerSingleton("wxMpMassMessageService", wxMpService.getMassMessageService()); + return Boolean.TRUE; + } + +} diff --git a/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpStorageAutoConfiguration.java b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpStorageAutoConfiguration.java new file mode 100644 index 00000000..a0fb7eb3 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/WxMpStorageAutoConfiguration.java @@ -0,0 +1,84 @@ +package com.binarywang.spring.starter.wxjava.mp; + +import me.chanjar.weixin.mp.api.WxMpConfigStorage; +import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.api.WxMpInRedisConfigStorage; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + * 微信公众号存储策略自动配置 + */ +@Configuration +public class WxMpStorageAutoConfiguration { + + @Autowired + private WxMpProperties properties; + + @Autowired(required = false) + private JedisPool jedisPool; + + @Bean + @ConditionalOnMissingBean(WxMpConfigStorage.class) + public WxMpConfigStorage wxMpInMemoryConfigStorage() { + WxMpProperties.ConfigStorage storage = properties.getConfigStorage(); + WxMpProperties.StorageType type = storage.getType(); + + if (type == WxMpProperties.StorageType.redis) { + return getWxMpInRedisConfigStorage(); + } + return getWxMpInMemoryConfigStorage(); + } + + private WxMpInMemoryConfigStorage getWxMpInMemoryConfigStorage() { + WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage(); + setWxMpInfo(config); + return config; + } + + private WxMpInRedisConfigStorage getWxMpInRedisConfigStorage() { + JedisPool poolToUse = jedisPool; + if (poolToUse == null) { + poolToUse = getJedisPool(); + } + WxMpInRedisConfigStorage config = new WxMpInRedisConfigStorage(poolToUse); + setWxMpInfo(config); + return config; + } + + private void setWxMpInfo(WxMpInMemoryConfigStorage config) { + config.setAppId(properties.getAppId()); + config.setSecret(properties.getSecret()); + config.setToken(properties.getToken()); + config.setAesKey(properties.getAesKey()); + } + + private JedisPool getJedisPool() { + WxMpProperties.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/starters/wx-java-mp-starter/src/main/resources/META-INF/spring.factories b/starters/wx-java-mp-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..aaa17f76 --- /dev/null +++ b/starters/wx-java-mp-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.binarywang.spring.starter.wxjava.mp.WxMpAutoConfiguration \ No newline at end of file