From 79f00925a741f135b6e60e4c57a449749fe57a15 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 16 Aug 2020 15:06:09 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20#1267=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E5=A4=9A=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaService.java | 53 +++++++++++++- .../miniapp/api/impl/BaseWxMaServiceImpl.java | 73 ++++++++++++++++++- .../wx/miniapp/util/WxMaConfigHolder.java | 31 ++++++++ 3 files changed, 151 insertions(+), 6 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index f73d91899..b6fb72efe 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -10,6 +10,8 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; +import java.util.Map; + /** * @author Binary Wang */ @@ -148,9 +150,56 @@ public interface WxMaService extends WxService { /** * 注入 {@link WxMaConfig} 的实现. * - * @param wxConfigProvider config + * @param maConfig config */ - void setWxMaConfig(WxMaConfig wxConfigProvider); + void setWxMaConfig(WxMaConfig maConfig); + + /** + * Map里 加入新的 {@link WxMaConfig},适用于动态添加新的微信公众号配置. + * + * @param miniappId 小程序标识 + * @param configStorage 新的微信配置 + */ + void addConfig(String miniappId, WxMaConfig configStorage); + + /** + * 从 Map中 移除 {@link String miniappId} 所对应的 {@link WxMaConfig},适用于动态移除小程序配置. + * + * @param miniappId 对应小程序的标识 + */ + void removeConfig(String miniappId); + + /** + * 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String mpId} 值 + * 随机采用一个{@link String mpId}进行Http初始化操作 + * + * @param configs WxMaConfig map + */ + void setMultiConfigs(Map configs); + + /** + * 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String label} 值 + * + * @param configs WxMaConfig map + * @param defaultMiniappId 设置一个{@link WxMaConfig} 所对应的{@link String defaultMiniappId}进行Http初始化 + */ + void setMultiConfigs(Map configs, String defaultMiniappId); + + /** + * 进行相应的公众号切换. + * + * @param mpId 公众号标识 + * @return 切换是否成功 + */ + boolean switchover(String mpId); + + /** + * 进行相应的公众号切换. + * + * @param miniappId 小程序标识 + * @return 切换成功,则返回当前对象,方便链式调用,否则抛出异常 + */ + WxMaService switchoverTo(String miniappId); /** * 返回消息(客服消息和模版消息)发送接口方法实现类,以方便调用其各个接口. diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java index 6e7b04da1..fc04b5b6f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -3,15 +3,17 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.*; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.binarywang.wx.miniapp.util.WxMaConfigHolder; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxImgProcService; -import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.DataUtils; @@ -38,7 +40,7 @@ import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*; */ @Slf4j public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp { - + private Map configMap; private WxMaConfig wxMaConfig; private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this); @@ -300,11 +302,74 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH } @Override - public void setWxMaConfig(WxMaConfig wxConfigProvider) { - this.wxMaConfig = wxConfigProvider; + public void setWxMaConfig(WxMaConfig maConfig) { + final String appid = maConfig.getAppid(); + this.setMultiConfigs(ImmutableMap.of(appid, maConfig), appid); + } + + @Override + public void setMultiConfigs(Map configs) { + this.setMultiConfigs(configs, configs.keySet().iterator().next()); + } + + @Override + public void setMultiConfigs(Map configs, String defaultMiniappId) { + this.configMap = Maps.newHashMap(configs); + WxMaConfigHolder.set(defaultMiniappId); this.initHttp(); } + @Override + public void addConfig(String mpId, WxMaConfig configStorages) { + synchronized (this) { + if (this.configMap == null) { + this.setWxMaConfig(configStorages); + } else { + this.configMap.put(mpId, configStorages); + } + } + } + + @Override + public void removeConfig(String miniappId) { + synchronized (this) { + if (this.configMap.size() == 1) { + this.configMap.remove(miniappId); + log.warn("已删除最后一个小程序配置:{},须立即使用setWxMaConfig或setMultiConfigs添加配置", miniappId); + return; + } + if (WxMaConfigHolder.get().equals(miniappId)) { + this.configMap.remove(miniappId); + final String defaultMpId = this.configMap.keySet().iterator().next(); + WxMaConfigHolder.set(defaultMpId); + log.warn("已删除默认小程序配置,小程序【{}】被设为默认配置", defaultMpId); + return; + } + this.configMap.remove(miniappId); + } + } + + @Override + public WxMaService switchoverTo(String miniappId) { + if (this.configMap.containsKey(miniappId)) { + WxMaConfigHolder.set(miniappId); + return this; + } + + throw new RuntimeException(String.format("无法找到对应【%s】的小程序配置信息,请核实!", miniappId)); + } + + @Override + public boolean switchover(String mpId) { + if (this.configMap.containsKey(mpId)) { + WxMaConfigHolder.set(mpId); + return true; + } + + log.error("无法找到对应【{}】的小程序配置信息,请核实!", mpId); + return false; + } + @Override public void setRetrySleepMillis(int retrySleepMillis) { this.retrySleepMillis = retrySleepMillis; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java new file mode 100644 index 000000000..e73cb2282 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java @@ -0,0 +1,31 @@ +package cn.binarywang.wx.miniapp.util; + +/** + * 小程序存储值存放类. + * + * @author Binary Wang + * @date 2020-08-16 + */ +public class WxMaConfigHolder { + private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() { + @Override + protected String initialValue() { + return "default"; + } + }; + + public static String get() { + return THREAD_LOCAL.get(); + } + + public static void set(String label) { + THREAD_LOCAL.set(label); + } + + /** + * 此方法需要用户根据自己程序代码,在适当位置手动触发调用,本SDK里无法判断调用时机 + */ + public static void remove() { + THREAD_LOCAL.remove(); + } +}