Ver código fonte

fix:支付优化

liujunchi 3 anos atrás
pai
commit
f6866744eb

+ 58 - 45
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -539,17 +539,23 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderPayRes.setMessage("订单已付款或已关闭");
             return orderPayRes;
         }
-        // UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNo(detail.getOrderSn(),
-        //                                              payReq.getPayChannel(),TradeStatusEnum.pending);
-        //
-        // if (userOrderPayment != null) {
-        //     // 拉起原有的支付
-        //     orderPayRes = new OrderPayRes();
-        //     orderPayRes.setPay_info(userOrderPayment.getPayInfo());
-        //     orderPayRes.setPayChannel(userOrderPayment.getPayChannel());
-        //     orderPayRes.setPay_amt(userOrderPayment.getPayAmt().setScale(2, RoundingMode.HALF_UP).toString());
-        //     return orderPayRes;
-        // }
+        UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
+
+        if (orderPayment != null) {
+            // 查询订单信息
+            BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
+            //支付成功
+            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
+                    && detail.getStatus() == 0) {
+                orderSuccess(detail,null, res.getData());
+                orderPayRes.setStatus(false);
+                orderPayRes.setMessage("订单已付款或已关闭");
+                return orderPayRes;
+            }
+
+            //查询订单下支付中的付款单,取消支付
+            userOrderPaymentService.closePayment(orderPayment.getOrderNo(),  "用户发起了新的付款请求", null);
+        }
 
         //构建汇付统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
@@ -623,6 +629,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         return orderPayRes;
     }
 
+    private BaseResult<Payment> getPaymentBaseResult(UserOrderPayment orderPayment) {
+        Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
+                                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
+                                    PayChannelEnum.valueOf(orderPayment.getPayChannel()));
+        param.setId(orderPayment.getTransNo());
+        param.setPaymentNo(orderPayment.getAdapayNo());
+        return paymentClient.queryPayment(param);
+    }
+
 
     private void saveOrderPayment(Payment payment, OmsOrderDetail detail, String paymentClient) {
         UserOrderPayment userOrderPayment;
@@ -646,9 +661,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         userOrderPayment.setCreateTime(new Date());
         userOrderPayment.setUpdateTime(new Date());
 
-        //查询订单下支付中的付款单,取消支付
-        userOrderPaymentService.closePayment(payment.getOrderNo(),  "用户发起了新的付款请求", null);
-
         userOrderPaymentService.save(userOrderPayment);
     }
 
@@ -695,19 +707,19 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
         if (detail.getStatus() == 0) {
-            orderSuccess(detail, data, data.getId());
+            orderSuccess(detail, data, null);
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
             LOG.warn("支付金额原路退回 {}", detail.getOrderSn());
-            orderRefund(userOrderPayment,data,detail);
+            orderRefund(userOrderPayment,data.getExecutePaymentCallBack().getPayAmt(),data.getId(),detail);
         }
     }
 
     /**
      * 支付成功,业务退款
      */
-    private void orderRefund(UserOrderPayment userOrderPayment,PaymentCallBack data,OmsOrder order) {
-        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getOrderNo());
+    private void orderRefund(UserOrderPayment userOrderPayment,String refundAmount,String payTransNo,OmsOrder order) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getAdapayNo());
         if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
             LOG.warn("支付金额已退回");
             return;
@@ -717,17 +729,17 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
         refundReq.setRefundNo(orderSn);
-        refundReq.setRefundAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+        refundReq.setRefundAmt(new BigDecimal(refundAmount));
 
         refundReq.setReason("支付超时,全额退回");
         refundReq.setPaymentNo(userOrderPayment.getAdapayNo());
-        refundReq.setTradeNo(data.getId());
+        refundReq.setTradeNo(payTransNo);
         refundReq.setOrderAmt(userOrderPayment.getPayAmt());
         BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundReq);
         userOrderRefund = new UserOrderRefund();
         userOrderRefund.setOrderNo(orderSn);
-        userOrderRefund.setPayTransNo(data.getId());
-        userOrderRefund.setRefundAmt(userOrderPayment.getPayAmt());
+        userOrderRefund.setPayTransNo(payTransNo);
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
         userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
         if (refundBillBaseResult.getStatus()) {
             RefundBill refundBill = refundBillBaseResult.getData();
@@ -816,18 +828,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         try {
-            Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
-                                        PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
-                                        PayChannelEnum.valueOf(orderPayment.getPayChannel()));
-            param.setId(orderPayment.getTransNo());
-            param.setPaymentNo(orderPayment.getAdapayNo());
-            BaseResult<Payment> res = paymentClient.queryPayment(param);
+            BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
             //支付成功
             if (res.getStatus() && TradeStatusEnum.succeeded.getCode()
                                                             .equals(res.getData()
                                                                        .getStatus()
-                                                                       .getCode()) && (detail.getStatus() == 0 || detail.getStatus() == 1)) {
-                orderSuccess(detail, res.getData().getId());
+                                                                       .getCode()) && detail.getStatus() == 0) {
+                orderSuccess(detail,null, res.getData());
                 return;
             }
             //支付失败
@@ -843,10 +850,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
 
-    void orderSuccess(OmsOrder detail, String tranId) {
-        orderSuccess(detail, null, tranId);
-    }
-
     /**
      * 订单完成
      *
@@ -854,7 +857,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      * @updateTime 2022/4/13 17:17
      */
     @Transactional(rollbackFor = Exception.class)
-    public void orderSuccess(OmsOrder detail, PaymentCallBack data, String tranId) {
+    public void orderSuccess(OmsOrder detail, PaymentCallBack data,Payment payment) {
         //更新订单
         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
 
@@ -862,26 +865,36 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             LOG.error("支付回调,支付中订单未找到。 orderNo is {}", detail.getOrderSn());
             return;
         }
+
+        // 判断支付金额 是否正确
+        BigDecimal pay_amt;
         if (data != null) {
-            String pay_amt = data.getExecutePaymentCallBack().getPayAmt();
-            if (!pay_amt.equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
-                orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
-            }
+            pay_amt = new BigDecimal(data.getExecutePaymentCallBack().getPayAmt());
+
+            orderPayment.setTransNo(data.getId());
+        } else {
+            pay_amt = new BigDecimal(payment.getPayAmt());
+            orderPayment.setTransNo(payment.getId());
         }
-        if (orderPayment.getPayChannel().equals("alipay") || orderPayment.getPayChannel().equals("ali_app")) {
-            paySuccess(detail.getId(), 1);
-        } else if (orderPayment.getPayChannel().equals("wx_lite") || orderPayment.getPayChannel().equals("wx_app")) {
-            paySuccess(detail.getId(), 2);
+        if (pay_amt.compareTo(detail.getPayAmount()) != 0) {
+            orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
+            orderRefund(orderPayment,pay_amt.setScale(2, RoundingMode.HALF_UP).toString(),orderPayment.getTransNo(),detail);
+        } else {
+
+            if (orderPayment.getPayChannel().equals("alipay") || orderPayment.getPayChannel().equals("ali_app")) {
+                paySuccess(detail.getId(), 1);
+            } else if (orderPayment.getPayChannel().equals("wx_lite") || orderPayment.getPayChannel().equals("wx_app")) {
+                paySuccess(detail.getId(), 2);
+            }
         }
 
         orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
         orderPayment.setArrivalTime(new Date());
-        orderPayment.setTransNo(tranId);
+        orderPayment.setPayAmt(pay_amt);
         if (null != data) {
             try {
                 orderPayment.setArrivalTime(data.getExecutePaymentCallBack().getTradeTime());
                 orderPayment.setTransNo(data.getId());
-                orderPayment.setPayAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
                 orderPayment.setFeeAmt(new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
             } catch (Exception e) {
                 e.printStackTrace();