From 47c9962fdd1e4309b164ee76ba03956c4526c8c0 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Tue, 21 Jul 2026 09:16:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20DIRECT=20=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=A1=B9=20needOpenId=20=E7=94=A8=20capabili?= =?UTF-8?q?ty=20=E5=85=9C=E5=BA=95=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 闭环。 --- .../runtime/service/pay/gateway/CashierPayService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/CashierPayService.java b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/CashierPayService.java index 221770233..d4cf3f7ab 100644 --- a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/CashierPayService.java +++ b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/CashierPayService.java @@ -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 触发判定(与聚合/码牌同源逻辑)