|  | @@ -378,6 +378,24 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          OmsOrder cancelOrder = cancelOrderList.get(0);
 | 
	
		
			
				|  |  |          if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 查询订单是否为支付
 | 
	
		
			
				|  |  | +            UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(cancelOrder.getOrderSn());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (orderPayment != null) {
 | 
	
		
			
				|  |  | +                // 查询订单信息
 | 
	
		
			
				|  |  | +                BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
 | 
	
		
			
				|  |  | +                //支付成功
 | 
	
		
			
				|  |  | +                if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
 | 
	
		
			
				|  |  | +                        && cancelOrder.getStatus() == 0) {
 | 
	
		
			
				|  |  | +                    orderSuccess(cancelOrder,null, res.getData());
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //查询订单下支付中的付款单,取消支付
 | 
	
		
			
				|  |  | +                userOrderPaymentService.closePayment(orderPayment.getOrderNo(),  "用户发起了新的付款请求", null);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              //修改订单状态为取消
 | 
	
		
			
				|  |  |              cancelOrder.setStatus(4);
 | 
	
		
			
				|  |  |              orderMapper.updateByPrimaryKeySelective(cancelOrder);
 | 
	
	
		
			
				|  | @@ -539,17 +557,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 +647,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 +679,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
	
		
			
				|  |  |          userOrderPayment.setCreateTime(new Date());
 | 
	
		
			
				|  |  |          userOrderPayment.setUpdateTime(new Date());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //查询订单下支付中的付款单,取消支付
 | 
	
		
			
				|  |  | -        userOrderPaymentService.closePayment(payment.getOrderNo(),  "用户发起了新的付款请求", null);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          userOrderPaymentService.save(userOrderPayment);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -695,19 +725,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 +747,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 +846,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 +868,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    void orderSuccess(OmsOrder detail, String tranId) {
 | 
	
		
			
				|  |  | -        orderSuccess(detail, null, tranId);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 订单完成
 | 
	
		
			
				|  |  |       *
 | 
	
	
		
			
				|  | @@ -854,7 +875,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 +883,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();
 |