Skip to content

Commit 79f0092

Browse files
committed
🆕 #1267 小程序模块增加多账号切换功能支持
1 parent 9145628 commit 79f0092

File tree

3 files changed

+151
-6
lines changed

3 files changed

+151
-6
lines changed

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import me.chanjar.weixin.common.util.http.RequestExecutor;
1111
import me.chanjar.weixin.common.util.http.RequestHttp;
1212

13+
import java.util.Map;
14+
1315
/**
1416
* @author <a href="https://github.com/binarywang">Binary Wang</a>
1517
*/
@@ -148,9 +150,56 @@ public interface WxMaService extends WxService {
148150
/**
149151
* 注入 {@link WxMaConfig} 的实现.
150152
*
151-
* @param wxConfigProvider config
153+
* @param maConfig config
154+
*/
155+
void setWxMaConfig(WxMaConfig maConfig);
156+
157+
/**
158+
* Map里 加入新的 {@link WxMaConfig},适用于动态添加新的微信公众号配置.
159+
*
160+
* @param miniappId 小程序标识
161+
* @param configStorage 新的微信配置
162+
*/
163+
void addConfig(String miniappId, WxMaConfig configStorage);
164+
165+
/**
166+
* 从 Map中 移除 {@link String miniappId} 所对应的 {@link WxMaConfig},适用于动态移除小程序配置.
167+
*
168+
* @param miniappId 对应小程序的标识
169+
*/
170+
void removeConfig(String miniappId);
171+
172+
/**
173+
* 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String mpId} 值
174+
* 随机采用一个{@link String mpId}进行Http初始化操作
175+
*
176+
* @param configs WxMaConfig map
177+
*/
178+
void setMultiConfigs(Map<String, WxMaConfig> configs);
179+
180+
/**
181+
* 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String label} 值
182+
*
183+
* @param configs WxMaConfig map
184+
* @param defaultMiniappId 设置一个{@link WxMaConfig} 所对应的{@link String defaultMiniappId}进行Http初始化
185+
*/
186+
void setMultiConfigs(Map<String, WxMaConfig> configs, String defaultMiniappId);
187+
188+
/**
189+
* 进行相应的公众号切换.
190+
*
191+
* @param mpId 公众号标识
192+
* @return 切换是否成功
193+
*/
194+
boolean switchover(String mpId);
195+
196+
/**
197+
* 进行相应的公众号切换.
198+
*
199+
* @param miniappId 小程序标识
200+
* @return 切换成功,则返回当前对象,方便链式调用,否则抛出异常
152201
*/
153-
void setWxMaConfig(WxMaConfig wxConfigProvider);
202+
WxMaService switchoverTo(String miniappId);
154203

155204
/**
156205
* 返回消息(客服消息和模版消息)发送接口方法实现类,以方便调用其各个接口.

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
import cn.binarywang.wx.miniapp.api.*;
44
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
55
import cn.binarywang.wx.miniapp.config.WxMaConfig;
6+
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
67
import com.google.common.base.Joiner;
78
import com.google.common.collect.ImmutableMap;
9+
import com.google.common.collect.Maps;
810
import com.google.gson.Gson;
911
import com.google.gson.JsonObject;
1012
import lombok.extern.slf4j.Slf4j;
1113
import me.chanjar.weixin.common.api.WxImgProcService;
12-
import me.chanjar.weixin.common.enums.WxType;
1314
import me.chanjar.weixin.common.api.WxOcrService;
1415
import me.chanjar.weixin.common.bean.WxAccessToken;
16+
import me.chanjar.weixin.common.enums.WxType;
1517
import me.chanjar.weixin.common.error.WxError;
1618
import me.chanjar.weixin.common.error.WxErrorException;
1719
import me.chanjar.weixin.common.util.DataUtils;
@@ -38,7 +40,7 @@
3840
*/
3941
@Slf4j
4042
public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestHttp<H, P> {
41-
43+
private Map<String, WxMaConfig> configMap;
4244
private WxMaConfig wxMaConfig;
4345

4446
private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this);
@@ -300,11 +302,74 @@ public WxMaConfig getWxMaConfig() {
300302
}
301303

302304
@Override
303-
public void setWxMaConfig(WxMaConfig wxConfigProvider) {
304-
this.wxMaConfig = wxConfigProvider;
305+
public void setWxMaConfig(WxMaConfig maConfig) {
306+
final String appid = maConfig.getAppid();
307+
this.setMultiConfigs(ImmutableMap.of(appid, maConfig), appid);
308+
}
309+
310+
@Override
311+
public void setMultiConfigs(Map<String, WxMaConfig> configs) {
312+
this.setMultiConfigs(configs, configs.keySet().iterator().next());
313+
}
314+
315+
@Override
316+
public void setMultiConfigs(Map<String, WxMaConfig> configs, String defaultMiniappId) {
317+
this.configMap = Maps.newHashMap(configs);
318+
WxMaConfigHolder.set(defaultMiniappId);
305319
this.initHttp();
306320
}
307321

322+
@Override
323+
public void addConfig(String mpId, WxMaConfig configStorages) {
324+
synchronized (this) {
325+
if (this.configMap == null) {
326+
this.setWxMaConfig(configStorages);
327+
} else {
328+
this.configMap.put(mpId, configStorages);
329+
}
330+
}
331+
}
332+
333+
@Override
334+
public void removeConfig(String miniappId) {
335+
synchronized (this) {
336+
if (this.configMap.size() == 1) {
337+
this.configMap.remove(miniappId);
338+
log.warn("已删除最后一个小程序配置:{},须立即使用setWxMaConfig或setMultiConfigs添加配置", miniappId);
339+
return;
340+
}
341+
if (WxMaConfigHolder.get().equals(miniappId)) {
342+
this.configMap.remove(miniappId);
343+
final String defaultMpId = this.configMap.keySet().iterator().next();
344+
WxMaConfigHolder.set(defaultMpId);
345+
log.warn("已删除默认小程序配置,小程序【{}】被设为默认配置", defaultMpId);
346+
return;
347+
}
348+
this.configMap.remove(miniappId);
349+
}
350+
}
351+
352+
@Override
353+
public WxMaService switchoverTo(String miniappId) {
354+
if (this.configMap.containsKey(miniappId)) {
355+
WxMaConfigHolder.set(miniappId);
356+
return this;
357+
}
358+
359+
throw new RuntimeException(String.format("无法找到对应【%s】的小程序配置信息,请核实!", miniappId));
360+
}
361+
362+
@Override
363+
public boolean switchover(String mpId) {
364+
if (this.configMap.containsKey(mpId)) {
365+
WxMaConfigHolder.set(mpId);
366+
return true;
367+
}
368+
369+
log.error("无法找到对应【{}】的小程序配置信息,请核实!", mpId);
370+
return false;
371+
}
372+
308373
@Override
309374
public void setRetrySleepMillis(int retrySleepMillis) {
310375
this.retrySleepMillis = retrySleepMillis;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cn.binarywang.wx.miniapp.util;
2+
3+
/**
4+
* 小程序存储值存放类.
5+
*
6+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
7+
* @date 2020-08-16
8+
*/
9+
public class WxMaConfigHolder {
10+
private final static ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<String>() {
11+
@Override
12+
protected String initialValue() {
13+
return "default";
14+
}
15+
};
16+
17+
public static String get() {
18+
return THREAD_LOCAL.get();
19+
}
20+
21+
public static void set(String label) {
22+
THREAD_LOCAL.set(label);
23+
}
24+
25+
/**
26+
* 此方法需要用户根据自己程序代码,在适当位置手动触发调用,本SDK里无法判断调用时机
27+
*/
28+
public static void remove() {
29+
THREAD_LOCAL.remove();
30+
}
31+
}

0 commit comments

Comments
 (0)