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