From 92e3ec97e5391c8238851ff5426746d19afa4960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 24 Aug 2026 12:20:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(order-pay):=20=E8=A7=A3=E5=86=B3=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E5=86=BB=E7=BB=93=E8=AE=A2=E5=8D=95=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=8F=91=E8=B5=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 已存在 SUCCESS 冻结记录时清空旧 orderStr,避免前端重复调起 - 查询支付宝实际冻结状态,避免同一订单重复发起冻结操作 - 同步本地冻结记录状态,提升本地和支付宝状态一致性 - 日志中增加冻结查询和发起的详细记录,便于排查问题 - 捕获查询和冻结调用异常,防止流程中断并给出友好提示 --- .../shop/controller/OrderPayController.java | 57 +++++++++++++++---- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java index 7ea5f0c..674c994 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java @@ -9,6 +9,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.alipay.api.AlipayApiException; +import com.alipay.api.response.AlipayFundAuthOperationDetailQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -216,19 +217,53 @@ public class OrderPayController extends BaseController { if (cnt > 0) { log.info("订单{}已支付支付押金!", orderId); one.setHasFreeze(1); + // 已存在 SUCCESS 冻结记录,清空旧 orderStr,避免前端用同一笔 orderStr 重复调起 + // 支付宝收银台报“订单冻结已成功,请勿重复操作。” + one.setOrderStr(null); } else { log.info("订单{}未支付押金!", orderId); -// fWrapper.clear(); -// fWrapper.eq(FreezeOrder::getOutOrderNo, freezeOrderNo) -// .eq(FreezeOrder::getStatus, "INIT"); -// boolean delRet = freezeOrderService.remove(fWrapper); - try { - String orderStr = freezeOrderService.freeze(order, eg); - one.setOrderStr(orderStr); - log.info("订单{}支付请求参数:{}", orderId, orderStr); - } catch (AlipayApiException e) { - log.error(e.getMessage(), e); - return fail("调用芝麻信用出错!"); + // 冻结已发起但本地未确认时,先查支付宝实际冻结状态,避免用同一 + // out_order_no/out_request_no 重复发起冻结,触发支付宝端“订单冻结已成功,请勿重复操作。”提示 + boolean frozenAtAlipay = false; + long initCnt = freezeOrderService.lambdaQuery() + .eq(FreezeOrder::getOutOrderNo, freezeOrderNo) + .eq(FreezeOrder::getStatus, "INIT") + .count(); + if (initCnt > 0) { + try { + AlipayFundAuthOperationDetailQueryResponse queryResp = freezeOrderService.query(order); + if (queryResp.isSuccess() && "SUCCESS".equals(queryResp.getStatus()) + && ("FINISH".equals(queryResp.getOrderStatus()) + || "AUTHORIZED".equals(queryResp.getOrderStatus()))) { + order.setIsFreeze(1); + order.setIsCreditAuth("CREDIT_AUTH".equals(queryResp.getPreAuthType()) ? 1 : 2); + orderService.updateById(order); + // 同步本地冻结记录状态,避免下次再远程查询 + freezeOrderService.lambdaUpdate() + .set(FreezeOrder::getStatus, "SUCCESS") + .eq(FreezeOrder::getOutOrderNo, freezeOrderNo) + .eq(FreezeOrder::getStatus, "INIT") + .update(); + one.setIsFreeze(order.getIsFreeze()); + one.setIsCreditAuth(order.getIsCreditAuth()); + frozenAtAlipay = true; + log.info("订单{}支付宝侧已冻结成功,跳过重复发起冻结!", orderId); + // 支付宝侧已冻结,同样清空旧 orderStr,避免前端重复调起收银台 + one.setOrderStr(null); + } + } catch (AlipayApiException e) { + log.error("查询支付宝冻结状态失败!orderId:{}", orderId, e); + } + } + if (!frozenAtAlipay) { + try { + String orderStr = freezeOrderService.freeze(order, eg); + one.setOrderStr(orderStr); + log.info("订单{}支付请求参数:{}", orderId, orderStr); + } catch (AlipayApiException e) { + log.error(e.getMessage(), e); + return fail("调用芝麻信用出错!"); + } } } one.setHasFreeze(0);