From 29dafb291aa833f136bc6b53a58fce01f5d1b194 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 15:28:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20=E8=81=9A=E5=90=88=E6=89=AB?= =?UTF-8?q?=E7=A0=81=E6=94=AF=E4=BB=98=E9=94=81=E5=AE=9A=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E8=A1=A5=E4=BD=8D=E4=B8=8E=E6=94=AF=E4=BB=98=E5=AE=9D=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=94=B9=20QR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支付宝 H5 聚合默认支付方式由 JSAPI 改为扫码(alipay_qr), 免 OAuth 预下单返回支付链接 - 聚合支付锁定判定对 product 空值补位(聚合传 null 由路由解析填充), 避免重复点击误判切换支付方式 --- .../open/payment/merchant/enums/ClientEnvEnum.java | 11 +++++++---- .../service/pay/gateway/GatewayPayHandleService.java | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/merchant/enums/ClientEnvEnum.java b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/merchant/enums/ClientEnvEnum.java index 56b33529c..6acffbf45 100644 --- a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/merchant/enums/ClientEnvEnum.java +++ b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/merchant/enums/ClientEnvEnum.java @@ -50,19 +50,21 @@ public enum ClientEnvEnum implements I18nSupport { .orElseThrow(() -> new DataNotExistException("error.common.clientEnvNotExist", code)); } - /// 聚合扫码 L1 AUTO:按客户端环境推导默认支付方式(H5 默认 JSAPI) + /// 聚合扫码 L1 AUTO:按客户端环境推导默认支付方式 public String defaultMethodCode() { return defaultMethodCode(ClientRuntimeEnum.H5); } - /// 按运行形态推导默认支付方式: H5→JSAPI, 小程序→MINI(支付宝无独立 mini, 统一 JSAPI) + /// 按运行形态推导默认支付方式 + /// H5: 微信→jsapi / 支付宝→扫码(alipay_qr, 免 OAuth) / 云闪付、抖音→jsapi + /// 小程序: 微信→mini / 支付宝、云闪付、抖音→jsapi(无独立 mini) public String defaultMethodCode(ClientRuntimeEnum runtime) { ClientRuntimeEnum rt = runtime == null ? ClientRuntimeEnum.H5 : runtime; PayMethodEnum method; if (rt == ClientRuntimeEnum.MINI) { method = switch (this) { case WECHAT -> PayMethodEnum.WECHAT_MINI; - // 支付宝官方 JSAPI 即小程序场景, 与 H5 同用 alipay_jsapi + // 支付宝官方 JSAPI 即小程序场景, 小程序仅走 jsapi case ALIPAY -> PayMethodEnum.ALIPAY_JSAPI; case UNION_PAY -> PayMethodEnum.UNION_JSAPI; case DOUYIN -> PayMethodEnum.DOUYIN_JSAPI; @@ -71,7 +73,8 @@ public enum ClientEnvEnum implements I18nSupport { } else { method = switch (this) { case WECHAT -> PayMethodEnum.WECHAT_JSAPI; - case ALIPAY -> PayMethodEnum.ALIPAY_JSAPI; + // 支付宝 H5 默认扫码(alipay_qr): 免 OAuth, 预下单返回支付链接 + case ALIPAY -> PayMethodEnum.ALIPAY_QR; case UNION_PAY -> PayMethodEnum.UNION_JSAPI; case DOUYIN -> PayMethodEnum.DOUYIN_JSAPI; // browser 等非聚合扫码环境不支持 diff --git a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/GatewayPayHandleService.java b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/GatewayPayHandleService.java index f34f8239d..27a18c840 100644 --- a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/GatewayPayHandleService.java +++ b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/runtime/service/pay/gateway/GatewayPayHandleService.java @@ -106,7 +106,9 @@ public class GatewayPayHandleService { if (Objects.equals(existing.getStatus(), PayFundStatusEnum.PROCESSING.getCode()) || Objects.equals(existing.getStatus(), PayFundStatusEnum.INIT.getCode())) { // 通道/方式不一致则拒绝换端(product/method 在容器上) - if (!Objects.equals(current.getProduct(), product) + // 聚合支付 product 传 null(由路由解析填充) 是合法设计, 用容器已持久化值补位避免误判切换支付方式 + String effectiveProduct = StrUtil.blankToDefault(product, current.getProduct()); + if (!Objects.equals(current.getProduct(), effectiveProduct) || !Objects.equals(current.getMethod(), method)) { throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "pay.error.gateway.channelLocked");