提交 1f4c63fc 编写于 作者: 如梦技术's avatar 如梦技术 🐛

支持多小程序和自定义 app 配置加载.

上级 3fd70296
package net.dreamlu.weixin.annotation;
public enum ApiType {
/**
* 微信
*/
WX,
/**
* 小程序
*/
WXA
}
...@@ -26,10 +26,4 @@ public @interface WxApi { ...@@ -26,10 +26,4 @@ public @interface WxApi {
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class)
String[] value() default {}; String[] value() default {};
/**
* 目前不支持多小程序
* @return {ApiType}
*/
ApiType type() default ApiType.WX;
} }
...@@ -4,6 +4,11 @@ import com.jfinal.weixin.sdk.cache.IAccessTokenCache; ...@@ -4,6 +4,11 @@ import com.jfinal.weixin.sdk.cache.IAccessTokenCache;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.cache.Cache; import org.springframework.cache.Cache;
/**
* 基于 spring cache 的 weixin token 缓存
*
* @author L.cm
*/
@AllArgsConstructor @AllArgsConstructor
public class SpringAccessTokenCache implements IAccessTokenCache { public class SpringAccessTokenCache implements IAccessTokenCache {
private final static String ACCESS_TOKEN_PREFIX = "dream-weixin:token:"; private final static String ACCESS_TOKEN_PREFIX = "dream-weixin:token:";
......
package net.dreamlu.weixin.config; package net.dreamlu.weixin.config;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
import net.dreamlu.weixin.cache.SpringAccessTokenCache; import net.dreamlu.weixin.cache.SpringAccessTokenCache;
import net.dreamlu.weixin.properties.DreamWeixinProperties; import net.dreamlu.weixin.properties.DreamWeixinProperties;
import net.dreamlu.weixin.spring.MsgInterceptor; import net.dreamlu.weixin.spring.MsgInterceptor;
...@@ -17,8 +17,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter ...@@ -17,8 +17,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
* *
* @author L.cm * @author L.cm
*/ */
@Configuration @RequiredArgsConstructor
@AllArgsConstructor @Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(DreamWeixinProperties.class) @EnableConfigurationProperties(DreamWeixinProperties.class)
public class DreamWeixinAutoConfiguration { public class DreamWeixinAutoConfiguration {
private final CacheManager cacheManager; private final CacheManager cacheManager;
...@@ -30,13 +30,10 @@ public class DreamWeixinAutoConfiguration { ...@@ -30,13 +30,10 @@ public class DreamWeixinAutoConfiguration {
} }
@Configuration @Configuration
@RequiredArgsConstructor
public static class MsgConfiguration extends WebMvcConfigurerAdapter { public static class MsgConfiguration extends WebMvcConfigurerAdapter {
private final DreamWeixinProperties properties; private final DreamWeixinProperties properties;
public MsgConfiguration(DreamWeixinProperties properties) {
this.properties = properties;
}
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
String urlPattern = properties.getUrlPatterns(); String urlPattern = properties.getUrlPatterns();
......
...@@ -7,12 +7,14 @@ import com.jfinal.weixin.sdk.api.ApiConfigKit; ...@@ -7,12 +7,14 @@ import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.utils.JsonUtils; import com.jfinal.weixin.sdk.utils.JsonUtils;
import com.jfinal.wxaapp.WxaConfig; import com.jfinal.wxaapp.WxaConfig;
import com.jfinal.wxaapp.WxaConfigKit; import com.jfinal.wxaapp.WxaConfigKit;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
import net.dreamlu.weixin.cache.SpringAccessTokenCache; import net.dreamlu.weixin.cache.SpringAccessTokenCache;
import net.dreamlu.weixin.properties.DreamWeixinProperties; import net.dreamlu.weixin.properties.DreamWeixinProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -20,52 +22,58 @@ import java.util.List; ...@@ -20,52 +22,58 @@ import java.util.List;
* *
* @author L.cm * @author L.cm
*/ */
@Configuration @RequiredArgsConstructor
@AllArgsConstructor @Configuration(proxyBeanMethods = false)
public class WeixinAppConfig implements SmartInitializingSingleton { public class WeixinAppConfig implements SmartInitializingSingleton {
private final DreamWeixinProperties weixinProperties; private final DreamWeixinProperties weixinProperties;
private final SpringAccessTokenCache accessTokenCache; private final SpringAccessTokenCache accessTokenCache;
private final ObjectProvider<WxConfigLoader> provider;
@Override @Override
public void afterSingletonsInstantiated() { public void afterSingletonsInstantiated() {
boolean isdev = weixinProperties.isDevMode(); boolean isdev = weixinProperties.isDevMode();
ApiConfigKit.setDevMode(isdev); ApiConfigKit.setDevMode(isdev);
ApiConfigKit.setAccessTokenCache(accessTokenCache); ApiConfigKit.setAccessTokenCache(accessTokenCache);
List<DreamWeixinProperties.ApiConfig> list = weixinProperties.getWxConfigs(); WxConfigLoader configLoader = provider.getIfAvailable(() -> WxConfigLoader.DEFAULT);
for (DreamWeixinProperties.ApiConfig apiConfig : list) { List<WxConf> wxConfList = new ArrayList<>(weixinProperties.getWxConfigs());
wxConfList.addAll(configLoader.loadWx());
for (WxConf conf : wxConfList) {
ApiConfig config = new ApiConfig(); ApiConfig config = new ApiConfig();
if (StrKit.notBlank(apiConfig.getAppId())) { if (StrKit.notBlank(conf.getAppId())) {
config.setAppId(apiConfig.getAppId()); config.setAppId(conf.getAppId());
} }
if (StrKit.notBlank(apiConfig.getAppSecret())) { if (StrKit.notBlank(conf.getAppSecret())) {
config.setAppSecret(apiConfig.getAppSecret()); config.setAppSecret(conf.getAppSecret());
} }
if (StrKit.notBlank(apiConfig.getToken())) { if (StrKit.notBlank(conf.getToken())) {
config.setToken(apiConfig.getToken()); config.setToken(conf.getToken());
} }
if (StrKit.notBlank(apiConfig.getEncodingAesKey())) { if (StrKit.notBlank(conf.getEncodingAesKey())) {
config.setEncodingAesKey(apiConfig.getEncodingAesKey()); config.setEncodingAesKey(conf.getEncodingAesKey());
} }
config.setEncryptMessage(apiConfig.isMessageEncrypt()); config.setEncryptMessage(conf.isMessageEncrypt());
ApiConfigKit.putApiConfig(config); ApiConfigKit.putApiConfig(config);
} }
DreamWeixinProperties.WxaConfig apiConfig = weixinProperties.getWxaConfig(); List<WxaConf> wxaConfList = new ArrayList<>(weixinProperties.getWxaConfigs());
WxaConfig config = new WxaConfig(); wxaConfList.addAll(configLoader.loadWxa());
if (StrKit.notBlank(apiConfig.getAppId())) { for (WxaConf conf : wxaConfList) {
config.setAppId(apiConfig.getAppId()); WxaConfig config = new WxaConfig();
} if (StrKit.notBlank(conf.getAppId())) {
if (StrKit.notBlank(apiConfig.getAppSecret())) { config.setAppId(conf.getAppId());
config.setAppSecret(apiConfig.getAppSecret()); }
} if (StrKit.notBlank(conf.getAppSecret())) {
if (StrKit.notBlank(apiConfig.getToken())) { config.setAppSecret(conf.getAppSecret());
config.setToken(apiConfig.getToken()); }
} if (StrKit.notBlank(conf.getToken())) {
if (StrKit.notBlank(apiConfig.getEncodingAesKey())) { config.setToken(conf.getToken());
config.setEncodingAesKey(apiConfig.getEncodingAesKey()); }
if (StrKit.notBlank(conf.getEncodingAesKey())) {
config.setEncodingAesKey(conf.getEncodingAesKey());
}
config.setMessageEncrypt(conf.isMessageEncrypt());
WxaConfigKit.setWxaConfig(config);
} }
config.setMessageEncrypt(apiConfig.isMessageEncrypt());
WxaConfigKit.setDevMode(isdev); WxaConfigKit.setDevMode(isdev);
WxaConfigKit.setWxaConfig(config);
if (WxaMsgParser.JSON == weixinProperties.getWxaMsgParser()) { if (WxaMsgParser.JSON == weixinProperties.getWxaMsgParser()) {
WxaConfigKit.useJsonMsgParser(); WxaConfigKit.useJsonMsgParser();
} }
......
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;
}
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<WxConf> loadWx() {
return Collections.emptyList();
}
/**
* 加载小程序配置
*
* @return 小程序配置列表
*/
default List<WxaConf> loadWxa() {
return Collections.emptyList();
}
}
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;
}
...@@ -6,5 +6,8 @@ package net.dreamlu.weixin.config; ...@@ -6,5 +6,8 @@ package net.dreamlu.weixin.config;
* @author L.cm * @author L.cm
*/ */
public enum WxaMsgParser { public enum WxaMsgParser {
/**
* json 、xml
*/
JSON, XML JSON, XML
} }
...@@ -2,12 +2,19 @@ package net.dreamlu.weixin.properties; ...@@ -2,12 +2,19 @@ package net.dreamlu.weixin.properties;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.dreamlu.weixin.config.WxConf;
import net.dreamlu.weixin.config.WxaConf;
import net.dreamlu.weixin.config.WxaMsgParser; import net.dreamlu.weixin.config.WxaMsgParser;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* 配置
*
* @author L.cm
*/
@Getter @Getter
@Setter @Setter
@ConfigurationProperties("dream.weixin") @ConfigurationProperties("dream.weixin")
...@@ -32,11 +39,11 @@ public class DreamWeixinProperties { ...@@ -32,11 +39,11 @@ public class DreamWeixinProperties {
/** /**
* 多公众号配置 * 多公众号配置
*/ */
private List<ApiConfig> wxConfigs = new ArrayList<>(); private List<WxConf> wxConfigs = new ArrayList<>();
/** /**
* 小程序配置 * 小程序配置
*/ */
private WxaConfig wxaConfig = new WxaConfig(); private List<WxaConf> wxaConfigs = new ArrayList<>();
/** /**
* 小程序消息解析,默认xml,支持json和xml * 小程序消息解析,默认xml,支持json和xml
*/ */
...@@ -46,25 +53,5 @@ public class DreamWeixinProperties { ...@@ -46,25 +53,5 @@ public class DreamWeixinProperties {
*/ */
private String jsonType = "jackson"; 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;
}
} }
...@@ -26,7 +26,6 @@ import java.util.Arrays; ...@@ -26,7 +26,6 @@ import java.util.Arrays;
@RequiredArgsConstructor @RequiredArgsConstructor
public class MsgInterceptor extends HandlerInterceptorAdapter { public class MsgInterceptor extends HandlerInterceptorAdapter {
private static final Log logger = LogFactory.getLog(MsgInterceptor.class); private static final Log logger = LogFactory.getLog(MsgInterceptor.class);
private final DreamWeixinProperties weixinProperties; private final DreamWeixinProperties weixinProperties;
@Override @Override
...@@ -59,7 +58,12 @@ public class MsgInterceptor extends HandlerInterceptorAdapter { ...@@ -59,7 +58,12 @@ public class MsgInterceptor extends HandlerInterceptorAdapter {
token = ApiConfigKit.getApiConfig().getToken(); token = ApiConfigKit.getApiConfig().getToken();
} }
} else { } 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)) { if (isConfigServerRequest(request)) {
...@@ -142,5 +146,6 @@ public class MsgInterceptor extends HandlerInterceptorAdapter { ...@@ -142,5 +146,6 @@ public class MsgInterceptor extends HandlerInterceptorAdapter {
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex); super.afterCompletion(request, response, handler, ex);
ApiConfigKit.removeThreadLocalAppId(); ApiConfigKit.removeThreadLocalAppId();
WxaConfigKit.removeThreadLocalAppId();
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册