fix(gateway): DIRECT 模式支付项 needOpenId 用 capability 兜底判定

DIRECT 模式下支付项 method 被强制清空(见 GatewayCashierConfigService#normalizeAndValidate),
导致 toPublicResult 计算 needOpenId 时传入 null, PayMethodOpenIdSupport.needsOpenId 直接返回 false。
前端因此不触发 OAuth 跳转, openId 缺失, 后端通道层校验时报 channel.error.wechatOpenIdRequired。

capability 与 PayMethodEnum 同码(如 wechat_jsapi/alipay_jsapi/wechat_mini), 用 StrUtil.blankToDefault
以 capability 兜底, JSAPI/MINI 类支付项可正确触发前端 OAuth 闭环。
This commit is contained in:
DaxPay Dev
2026-07-21 09:16:39 +08:00
parent b7e2e680f9
commit 47c9962fdd

View File

@@ -188,6 +188,10 @@ public class CashierPayService {
}
private CashierItemPublicResult toPublicResult(GatewayCashierItem item, ClientEnvEnum clientEnv) {
// DIRECT 模式下 method 被强制清空(见 GatewayCashierConfigService#normalizeAndValidate),
// 此时用 capability 兜底判断 needOpenId; capability 与 PayMethodEnum 同码(如 wechat_jsapi),
// 可直接喂给 PayMethodOpenIdSupport.needsOpenId 判定 JSAPI/MINI 类需求
String methodOrCapability = StrUtil.blankToDefault(item.getMethod(), item.getCapability());
return new CashierItemPublicResult()
.setId(item.getId())
.setName(item.getName())
@@ -195,7 +199,7 @@ public class CashierPayService {
.setRecommend(item.getRecommend())
.setSortNo(item.getSortNo())
// openId 触发判定: JSAPI/MINI 业务必需, 或存在 openId 黑名单且环境可 OAuth
.setNeedOpenId(this.resolveItemNeedOpenId(item.getMethod(), clientEnv));
.setNeedOpenId(this.resolveItemNeedOpenId(methodOrCapability, clientEnv));
}
/// openId 触发判定(与聚合/码牌同源逻辑)