From 5ef233429dc5e9349a55eba6f4bdc4369ea18f96 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 23:06:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20=E6=94=B6=E9=93=B6=E5=8F=B0?= =?UTF-8?q?=E8=B7=A8=E7=8E=AF=E5=A2=83(=E6=A1=B6)=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E5=89=8D=E7=BD=AE=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 订单已锁定但当前 cashierType/clientEnv 桶无匹配支付项时(如 web 锁定后 h5 打开)抛 channelLocked, 复用 loadPage catch 进入错误卡, 避免跨环境打开时前端无 locked 标记导致用户进入后才在点支付被拦截 --- .../service/pay/gateway/CashierPayService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 b76e64332..221770233 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 @@ -66,8 +66,15 @@ public class CashierPayService { // 订单已发起支付(支付中)且 method 有值时, 支付方式已锁定, 需标记匹配的支付项供前端禁用切换 boolean orderLocked = Objects.equals(order.getStatus(), GatewayOrderStatusEnum.PAYING.getCode()) && StrUtil.isNotBlank(order.getMethod()); - return gatewayCashierItemManager.listByAppAndBucket(order.getAppId(), typeEnum.getCode(), bucketClientEnv) - .stream() + List items = gatewayCashierItemManager.listByAppAndBucket( + order.getAppId(), typeEnum.getCode(), bucketClientEnv); + // 订单已锁定但当前收银台桶(cashierType + clientEnv)无匹配项: 跨环境打开(如 web 锁定后 h5 打开), + // 当前环境无法继续该锁定的支付, 提前拒绝, 避免用户进入后才在点支付时被拦截 + if (orderLocked && items.stream().noneMatch(item -> this.isLockedItem(item, order))) { + throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, + "pay.error.gateway.channelLocked"); + } + return items.stream() .map(item -> this.toPublicResult(item, envEnum) // 命中锁定的支付项置 locked=true, 前端据此自动选中并禁用其他项 .setLocked(orderLocked && this.isLockedItem(item, order)))