longz
2026-07-20 30dc79f013bfc92ffea833c45b46f7477e2b9633
fix: 修复支付订单退款假成功
1个文件已修改
54 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -5075,18 +5075,27 @@
        if (passwordValid.getCode() != 200) {
            return passwordValid;
        }
        if (payOrderQueryDto.getRefundAmount() == null || payOrderQueryDto.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
            return R.fail("退款金额必须大于0");
        }
        if (payOrderQueryDto.getType() == 1) {
            TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId());
            if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
                return R.fail("退款金额需小于支付金额");
            if (tChargingOrder == null) {
                return R.fail("充电订单不存在");
            }
            if ((tChargingOrder.getRechargeAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) {
            BigDecimal manualRefundAmount = money(payOrderQueryDto.getRefundAmount());
            BigDecimal remainingRefundAmount = money(tChargingOrder.getPaymentAmount())
                    .subtract(money(tChargingOrder.getRefundAmount())).max(BigDecimal.ZERO);
            if (manualRefundAmount.compareTo(remainingRefundAmount) > 0) {
                return R.fail("退款金额不能超过剩余可退金额" + remainingRefundAmount.toPlainString() + "元");
            }
            if (manualRefundAmount.compareTo(remainingRefundAmount) == 0) {
                tChargingOrder.setStatus(5);
            }
            
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
            chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
            chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
            chargingOrderRefund.setRefundAmount(manualRefundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType());
            chargingOrderRefund.setRefundTime(LocalDateTime.now());
@@ -5097,9 +5106,8 @@
            chargingOrderRefund.setRefundContent("后台退款");
            chargingOrderRefund.setRefundReason("后台退款");
            chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
            chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
            chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
            BigDecimal manualRefundAmount = money(payOrderQueryDto.getRefundAmount());
            chargingOrderRefund.setRefundTotalAmount(money(tChargingOrder.getRefundAmount()).add(manualRefundAmount));
            chargingOrderRefund.setPayAmount(money(tChargingOrder.getPaymentAmount()));
            BigDecimal refundedThirdAmount = money(tChargingOrder.getThirdRefundAmount());
            BigDecimal refundableThirdAmount = money(tChargingOrder.getThirdPayAmount()).subtract(refundedThirdAmount);
            if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
@@ -5136,9 +5144,12 @@
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                if (200 == orderR.getCode()) {
                    finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
                    //手续费
                if (orderR == null || orderR.getCode() != 200) {
                    return R.fail(orderR == null ? "微信退款服务无响应" : firstNotBlank(orderR.getMsg(), "微信退款失败"));
                }
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
                //手续费
                if (orderR.getData() != null && orderR.getData().get("amount") instanceof Map) {
                    Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
                    Object refund_fee1 = amount1.get("refund_fee");
                    BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
@@ -5153,11 +5164,13 @@
                dto.setOutRequestNo(tChargingOrder.getCode());
                dto.setRefundAmount(thirdRefundAmount.toString());
                dto.setRefundReason("取消订单");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if (null != resp) {
                    finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
                R<RefundResp> refundResult = aliPaymentClient.refund(dto);
                RefundResp resp = refundResult == null ? null : refundResult.getData();
                if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
                    return R.fail(refundResult == null ? "支付宝退款服务无响应"
                            : firstNotBlank(resp == null ? null : resp.getMsg(), refundResult.getMsg(), "支付宝退款失败"));
                }
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            }
            else if (3 == tChargingOrder.getRechargePaymentType()) {
                RefundReq dto = new RefundReq();
@@ -5165,11 +5178,15 @@
                dto.setOutRequestNo(tChargingOrder.getCode());
                dto.setRefundAmount(thirdRefundAmount.toString());
                dto.setRefundReason("取消订单");
                RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                if (null != resp && "10000".equals(resp.getCode())) {
                    finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
                R<RefundResp> refundResult = h5AliPaymentClient.refund(dto);
                RefundResp resp = refundResult == null ? null : refundResult.getData();
                if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
                    return R.fail(refundResult == null ? "支付宝H5退款服务无响应" : firstNotBlank(refundResult.getMsg(), "支付宝H5退款失败"));
                }
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            }
            else {
                return R.fail("不支持的退款支付方式");
            }
            if(5 == tChargingOrder.getStatus()){
@@ -5183,6 +5200,7 @@
                    chengDuJianGuanClient.notificationOrderInfo(statusVo);
                });
            }
            return R.ok();
        }
        if (payOrderQueryDto.getType() == 2) {
            TShoppingOrder shoppingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());