Skip to content

Commit 59b728f

Browse files
Copilotbinarywang
andcommitted
优化 getConfig 方法性能并改进文档说明
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
1 parent 742e757 commit 59b728f

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

weixin-java-pay/MULTI_APPID_USAGE.md

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,15 @@ payService.setMultiConfig(configMap);
6464
WxPayConfig config1 = payService.getConfig("1234567890", "wx1111111111111111");
6565

6666
// 仅使用商户号获取配置(会返回该商户号的任意一个配置)
67+
// 注意:当存在多个 appId 时,返回结果基于内部存储顺序,不应依赖其稳定性
6768
WxPayConfig config = payService.getConfig("1234567890");
6869

69-
// 使用获取的配置进行支付操作
70+
// 使用获取的配置读取信息(仅用于读取配置,不用于执行支付操作)
7071
if (config != null) {
7172
String appId = config.getAppId();
7273
String mchKey = config.getMchKey();
73-
// ... 使用配置信息
74+
String apiV3Key = config.getApiV3Key();
75+
// ... 使用配置信息进行业务逻辑判断或记录
7476
}
7577
```
7678

@@ -80,9 +82,14 @@ if (config != null) {
8082
- 线程安全,不会因为线程切换导致配置丢失
8183
- 可以同时获取多个不同的配置
8284

85+
**使用场景**
86+
- 仅需读取配置信息(如获取 mchKey、appId 等)
87+
- 不需要执行 WxPayService 的支付相关方法
88+
- 如需执行支付操作,请使用方式二的 switchover 方法
89+
8390
#### 方式二:切换配置后使用(原有方式)
8491

85-
通过切换配置,然后调用 `getConfig()` 获取当前配置
92+
通过切换配置,然后调用 `getConfig()` 获取当前配置或直接执行支付操作
8693

8794
```java
8895
// 精确切换到指定的配置
@@ -92,10 +99,17 @@ WxPayConfig config = payService.getConfig(); // 获取当前切换的配置
9299
// 仅使用商户号切换
93100
payService.switchover("1234567890");
94101
config = payService.getConfig(); // 获取切换后的配置
102+
103+
// 切换后可直接执行支付操作
104+
WxPayUnifiedOrderResult result = payService.unifiedOrder(request);
95105
```
96106

97107
**注意**:此方式依赖 ThreadLocal,需要注意线程上下文的问题。
98108

109+
**使用场景**
110+
- 需要执行 WxPayService 的支付相关方法(如 unifiedOrder、refund 等)
111+
- 在同一线程中连续执行多个支付操作
112+
99113
### 3. 切换配置的方式
100114

101115
#### 方式一:精确切换(原有方式,向后兼容)
@@ -239,19 +253,19 @@ public void processMerchantOrder(String mchId, String appId, Order order) {
239253
// ... 处理订单逻辑
240254
}
241255

242-
// 或者在不确定 appId 的情况下
256+
// 或者在不确定 appId 的情况下,仅通过商户号发起退款
243257
public void processRefund(String mchId, String outTradeNo) {
244-
// 获取该商户号的任意一个配置
245-
WxPayConfig config = payService.getConfig(mchId);
246-
247-
if (config == null) {
248-
log.error("找不到商户配置:mchId={}", mchId);
258+
// 直接根据商户号切换(内部会选择该商户号下的一个配置)
259+
if (!payService.switchover(mchId)) {
260+
log.error("商户配置切换失败:mchId={}", mchId);
249261
return;
250262
}
251263

252-
// 先切换到该配置,然后进行退款
253-
payService.switchover(mchId, config.getAppId());
254-
// ... 执行退款操作
264+
// 在完成上下文切换后,执行退款操作
265+
WxPayRefundRequest request = new WxPayRefundRequest();
266+
request.setOutTradeNo(outTradeNo);
267+
// ... 设置其他退款参数
268+
WxPayRefundResult refundResult = payService.refund(request);
255269
}
256270
```
257271

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,17 @@ public WxPayConfig getConfig(String mchId) {
182182

183183
// 尝试前缀匹配(查找以 mchId_ 开头的配置)
184184
String prefix = mchId + "_";
185-
for (Map.Entry<String, WxPayConfig> entry : this.configMap.entrySet()) {
186-
if (entry.getKey().startsWith(prefix)) {
185+
return this.configMap.entrySet().stream()
186+
.filter(entry -> entry.getKey().startsWith(prefix))
187+
.findFirst()
188+
.map(entry -> {
187189
log.debug("根据mchId=【{}】找到配置key=【{}】", mchId, entry.getKey());
188190
return entry.getValue();
189-
}
190-
}
191-
192-
log.warn("无法找到对应mchId=【{}】的商户号配置信息", mchId);
193-
return null;
191+
})
192+
.orElseGet(() -> {
193+
log.warn("无法找到对应mchId=【{}】的商户号配置信息", mchId);
194+
return null;
195+
});
194196
}
195197

196198
@Override

0 commit comments

Comments
 (0)