diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/ApiType.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/ApiType.java deleted file mode 100644 index ce7c568f3b1f0a8c2875fae273b27bb547dc0c80..0000000000000000000000000000000000000000 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/ApiType.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.dreamlu.weixin.annotation; - -public enum ApiType { - /** - * 微信 - */ - WX, - - /** - * 小程序 - */ - WXA -} diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/WxApi.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/WxApi.java index 96e8b73798120ce9bfd78f6a5e97633e79319c0f..eb019ee216d5bfe33f4b4cacd5a15803eb2789db 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/WxApi.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/annotation/WxApi.java @@ -26,10 +26,4 @@ public @interface WxApi { @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * 目前不支持多小程序 - * @return {ApiType} - */ - ApiType type() default ApiType.WX; - } diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/cache/SpringAccessTokenCache.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/cache/SpringAccessTokenCache.java index dc047334e3f1e7f4225f270599ba55aafde032cb..915d8e36c021e279878c0ad5cf1c130a02e437b4 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/cache/SpringAccessTokenCache.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/cache/SpringAccessTokenCache.java @@ -4,6 +4,11 @@ import com.jfinal.weixin.sdk.cache.IAccessTokenCache; import lombok.AllArgsConstructor; import org.springframework.cache.Cache; +/** + * 基于 spring cache 的 weixin token 缓存 + * + * @author L.cm + */ @AllArgsConstructor public class SpringAccessTokenCache implements IAccessTokenCache { private final static String ACCESS_TOKEN_PREFIX = "dream-weixin:token:"; diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/DreamWeixinAutoConfiguration.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/DreamWeixinAutoConfiguration.java index 5bd80fb5063979648e2c8cd947c3822ea6307b70..eceaf948a2b6c8d4a6cbf06fd91fcd4a5aa338be 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/DreamWeixinAutoConfiguration.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/DreamWeixinAutoConfiguration.java @@ -1,6 +1,6 @@ package net.dreamlu.weixin.config; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import net.dreamlu.weixin.cache.SpringAccessTokenCache; import net.dreamlu.weixin.properties.DreamWeixinProperties; import net.dreamlu.weixin.spring.MsgInterceptor; @@ -17,8 +17,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter * * @author L.cm */ -@Configuration -@AllArgsConstructor +@RequiredArgsConstructor +@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(DreamWeixinProperties.class) public class DreamWeixinAutoConfiguration { private final CacheManager cacheManager; @@ -30,13 +30,10 @@ public class DreamWeixinAutoConfiguration { } @Configuration + @RequiredArgsConstructor public static class MsgConfiguration extends WebMvcConfigurerAdapter { private final DreamWeixinProperties properties; - public MsgConfiguration(DreamWeixinProperties properties) { - this.properties = properties; - } - @Override public void addInterceptors(InterceptorRegistry registry) { String urlPattern = properties.getUrlPatterns(); diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WeixinAppConfig.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WeixinAppConfig.java index 99117078bd8a4c3911c5ae95712fe692972986b5..f15afc070f7ec449307fba4235828fea715485f8 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WeixinAppConfig.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WeixinAppConfig.java @@ -7,12 +7,14 @@ import com.jfinal.weixin.sdk.api.ApiConfigKit; import com.jfinal.weixin.sdk.utils.JsonUtils; import com.jfinal.wxaapp.WxaConfig; import com.jfinal.wxaapp.WxaConfigKit; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import net.dreamlu.weixin.cache.SpringAccessTokenCache; import net.dreamlu.weixin.properties.DreamWeixinProperties; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.context.annotation.Configuration; +import java.util.ArrayList; import java.util.List; /** @@ -20,52 +22,58 @@ import java.util.List; * * @author L.cm */ -@Configuration -@AllArgsConstructor +@RequiredArgsConstructor +@Configuration(proxyBeanMethods = false) public class WeixinAppConfig implements SmartInitializingSingleton { private final DreamWeixinProperties weixinProperties; private final SpringAccessTokenCache accessTokenCache; + private final ObjectProvider provider; @Override public void afterSingletonsInstantiated() { boolean isdev = weixinProperties.isDevMode(); ApiConfigKit.setDevMode(isdev); ApiConfigKit.setAccessTokenCache(accessTokenCache); - List list = weixinProperties.getWxConfigs(); - for (DreamWeixinProperties.ApiConfig apiConfig : list) { + WxConfigLoader configLoader = provider.getIfAvailable(() -> WxConfigLoader.DEFAULT); + List wxConfList = new ArrayList<>(weixinProperties.getWxConfigs()); + wxConfList.addAll(configLoader.loadWx()); + for (WxConf conf : wxConfList) { ApiConfig config = new ApiConfig(); - if (StrKit.notBlank(apiConfig.getAppId())) { - config.setAppId(apiConfig.getAppId()); + if (StrKit.notBlank(conf.getAppId())) { + config.setAppId(conf.getAppId()); } - if (StrKit.notBlank(apiConfig.getAppSecret())) { - config.setAppSecret(apiConfig.getAppSecret()); + if (StrKit.notBlank(conf.getAppSecret())) { + config.setAppSecret(conf.getAppSecret()); } - if (StrKit.notBlank(apiConfig.getToken())) { - config.setToken(apiConfig.getToken()); + if (StrKit.notBlank(conf.getToken())) { + config.setToken(conf.getToken()); } - if (StrKit.notBlank(apiConfig.getEncodingAesKey())) { - config.setEncodingAesKey(apiConfig.getEncodingAesKey()); + if (StrKit.notBlank(conf.getEncodingAesKey())) { + config.setEncodingAesKey(conf.getEncodingAesKey()); } - config.setEncryptMessage(apiConfig.isMessageEncrypt()); + config.setEncryptMessage(conf.isMessageEncrypt()); ApiConfigKit.putApiConfig(config); } - DreamWeixinProperties.WxaConfig apiConfig = weixinProperties.getWxaConfig(); - WxaConfig config = new WxaConfig(); - if (StrKit.notBlank(apiConfig.getAppId())) { - config.setAppId(apiConfig.getAppId()); - } - if (StrKit.notBlank(apiConfig.getAppSecret())) { - config.setAppSecret(apiConfig.getAppSecret()); - } - if (StrKit.notBlank(apiConfig.getToken())) { - config.setToken(apiConfig.getToken()); - } - if (StrKit.notBlank(apiConfig.getEncodingAesKey())) { - config.setEncodingAesKey(apiConfig.getEncodingAesKey()); + List wxaConfList = new ArrayList<>(weixinProperties.getWxaConfigs()); + wxaConfList.addAll(configLoader.loadWxa()); + for (WxaConf conf : wxaConfList) { + WxaConfig config = new WxaConfig(); + if (StrKit.notBlank(conf.getAppId())) { + config.setAppId(conf.getAppId()); + } + if (StrKit.notBlank(conf.getAppSecret())) { + config.setAppSecret(conf.getAppSecret()); + } + if (StrKit.notBlank(conf.getToken())) { + config.setToken(conf.getToken()); + } + if (StrKit.notBlank(conf.getEncodingAesKey())) { + config.setEncodingAesKey(conf.getEncodingAesKey()); + } + config.setMessageEncrypt(conf.isMessageEncrypt()); + WxaConfigKit.setWxaConfig(config); } - config.setMessageEncrypt(apiConfig.isMessageEncrypt()); WxaConfigKit.setDevMode(isdev); - WxaConfigKit.setWxaConfig(config); if (WxaMsgParser.JSON == weixinProperties.getWxaMsgParser()) { WxaConfigKit.useJsonMsgParser(); } diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConf.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConf.java new file mode 100644 index 0000000000000000000000000000000000000000..3f49729677155b75d4b238c53422bd7f3ffbb40c --- /dev/null +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConf.java @@ -0,0 +1,22 @@ +package net.dreamlu.weixin.config; + +import lombok.Getter; +import lombok.Setter; + +/** + * 微信配置 + * + * @author L.cm + */ +@Getter +@Setter +public class WxConf { + private String token; + private String appId; + private String appSecret; + private String encodingAesKey; + /** + * 消息加密与否 + */ + private boolean messageEncrypt = false; +} diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConfigLoader.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConfigLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..d7bb02216acc0e3e56c07c42a4dc88f8bc78b1ef --- /dev/null +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxConfigLoader.java @@ -0,0 +1,32 @@ +package net.dreamlu.weixin.config; + +import java.util.Collections; +import java.util.List; + +/** + * 微信配置加载器,用于实现数据库读取自定义配置等 + * + * @author L.cm + */ +public interface WxConfigLoader { + WxConfigLoader DEFAULT = new WxConfigLoader() {}; + + /** + * 加载微信配置 + * + * @return 微信配置列表 + */ + default List loadWx() { + return Collections.emptyList(); + } + + /** + * 加载小程序配置 + * + * @return 小程序配置列表 + */ + default List loadWxa() { + return Collections.emptyList(); + } + +} diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaConf.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaConf.java new file mode 100644 index 0000000000000000000000000000000000000000..61afdff1a8830c84218abe9941a263ad2531f383 --- /dev/null +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaConf.java @@ -0,0 +1,22 @@ +package net.dreamlu.weixin.config; + +import lombok.Getter; +import lombok.Setter; + +/** + * 小程序的配置 + * + * @author L.cm + */ +@Getter +@Setter +public class WxaConf { + private String appId; + private String appSecret; + private String token; + private String encodingAesKey; + /** + * 消息加密与否 + */ + private boolean messageEncrypt = false; +} diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaMsgParser.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaMsgParser.java index 12c75afde8692940cef4a148648c180f8ce7dad1..dd19f8ecce3e7742cecb2f3289dad4afee0c5725 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaMsgParser.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/config/WxaMsgParser.java @@ -6,5 +6,8 @@ package net.dreamlu.weixin.config; * @author L.cm */ public enum WxaMsgParser { + /** + * json 、xml + */ JSON, XML } diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/properties/DreamWeixinProperties.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/properties/DreamWeixinProperties.java index 83da8734e9088ddf6c81f36b88ca8501bdd176e3..2c288e444adc11d3b06f78440925bb1fe8f746ad 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/properties/DreamWeixinProperties.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/properties/DreamWeixinProperties.java @@ -2,12 +2,19 @@ package net.dreamlu.weixin.properties; import lombok.Getter; import lombok.Setter; +import net.dreamlu.weixin.config.WxConf; +import net.dreamlu.weixin.config.WxaConf; import net.dreamlu.weixin.config.WxaMsgParser; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.ArrayList; import java.util.List; +/** + * 配置 + * + * @author L.cm + */ @Getter @Setter @ConfigurationProperties("dream.weixin") @@ -32,11 +39,11 @@ public class DreamWeixinProperties { /** * 多公众号配置 */ - private List wxConfigs = new ArrayList<>(); + private List wxConfigs = new ArrayList<>(); /** * 小程序配置 */ - private WxaConfig wxaConfig = new WxaConfig(); + private List wxaConfigs = new ArrayList<>(); /** * 小程序消息解析,默认xml,支持json和xml */ @@ -46,25 +53,5 @@ public class DreamWeixinProperties { */ private String jsonType = "jackson"; - @Getter - @Setter - public static class ApiConfig { - private String token; - private String appId; - private String appSecret; - private String encodingAesKey; - // 消息加密与否 - private boolean messageEncrypt = false; - } - @Getter - @Setter - public static class WxaConfig { - private String appId; - private String appSecret; - private String token; - private String encodingAesKey; - // 消息加密与否 - private boolean messageEncrypt = false; - } } diff --git a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/spring/MsgInterceptor.java b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/spring/MsgInterceptor.java index 93a3bfae06ebf4acd9677c6b65fa8fc72d8c618c..5573909db599027f156e1051d34957ea40259241 100644 --- a/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/spring/MsgInterceptor.java +++ b/spring-boot-starter-weixin/src/main/java/net/dreamlu/weixin/spring/MsgInterceptor.java @@ -26,7 +26,6 @@ import java.util.Arrays; @RequiredArgsConstructor public class MsgInterceptor extends HandlerInterceptorAdapter { private static final Log logger = LogFactory.getLog(MsgInterceptor.class); - private final DreamWeixinProperties weixinProperties; @Override @@ -59,7 +58,12 @@ public class MsgInterceptor extends HandlerInterceptorAdapter { token = ApiConfigKit.getApiConfig().getToken(); } } else { - token = WxaConfigKit.getWxaConfig().getToken(); + if (StringUtils.hasText(appId)) { + ApiConfigKit.setThreadLocalAppId(appId); + token = WxaConfigKit.getWxaConfig(appId).getToken(); + } else { + token = WxaConfigKit.getWxaConfig().getToken(); + } } // 如果是服务器配置请求,则配置服务器并返回 if (isConfigServerRequest(request)) { @@ -142,5 +146,6 @@ public class MsgInterceptor extends HandlerInterceptorAdapter { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); ApiConfigKit.removeThreadLocalAppId(); + WxaConfigKit.removeThreadLocalAppId(); } }