diff --git a/.gitignore b/.gitignore index d97b22b7..a231e6c6 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ Icon .Spotlight-V100 .TemporaryItems .Trashes +.vscode .VolumeIcon.icns .AppleDB .AppleDesktop diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c5f3f6b9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 991e1de1..307ab0dc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -12,6 +12,8 @@ import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.enums.TicketType; +import java.util.HashMap; + /** * 微信公众号API的Service. * @@ -306,6 +308,19 @@ public interface WxMpService { */ void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider); + /** + * 注入多个 {@link WxMpConfigStorage} 的实现. 并为每个 {@link WxMpConfigStorage} 赋予不同的 {@link String label} 值 + * @return + */ + void setMultiWxMpConfigStorage(HashMap configStorages); + + /** + * 进行相应的 WxApp 切换 + * @param label + * @return + */ + boolean switchover(String label); + /** * 返回客服接口方法实现类,以方便调用其各个接口. * diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java index 2db223c3..a5f163b4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -1,9 +1,11 @@ package me.chanjar.weixin.mp.api.impl; import java.io.IOException; +import java.util.HashMap; import java.util.concurrent.locks.Lock; import me.chanjar.weixin.mp.api.*; +import me.chanjar.weixin.mp.util.WxMpConfigStorageHolder; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,6 +66,9 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH private WxMpWifiService wifiService = new WxMpWifiServiceImpl(this); private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); + private HashMap wxMpConfigStoragePool; + private boolean isMultiWxApp = false; + private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @@ -334,6 +339,10 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH @Override public WxMpConfigStorage getWxMpConfigStorage() { + if (isMultiWxApp) { + String label = WxMpConfigStorageHolder.get(); + return wxMpConfigStoragePool.getOrDefault(label, null); + } return this.wxMpConfigStorage; } @@ -343,6 +352,22 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH this.initHttp(); } + @Override + public void setMultiWxMpConfigStorage(HashMap configStorages) { + wxMpConfigStoragePool = configStorages; + isMultiWxApp = true; + this.initHttp(); + } + + @Override + public boolean switchover(String label) { + if (wxMpConfigStoragePool.containsKey(label)) { + WxMpConfigStorageHolder.set(label); + return true; + } + return false; + } + @Override public void setRetrySleepMillis(int retrySleepMillis) { this.retrySleepMillis = retrySleepMillis; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java new file mode 100644 index 00000000..f73bc37c --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java @@ -0,0 +1,20 @@ +package me.chanjar.weixin.mp.util; + + +/** + * @Author: yd + * @Date: 2019-03-20 22:06 + */ +public class WxMpConfigStorageHolder { + + private final static ThreadLocal WX_MP_CONFIG_STORAGE_CHOSE = new ThreadLocal<>(); + + public static String get() { + return WX_MP_CONFIG_STORAGE_CHOSE.get(); + } + + public static void set(String label) { + WX_MP_CONFIG_STORAGE_CHOSE.set(label); + } + +}