liujunchi 3 vuotta sitten
vanhempi
commit
f16bd31ec8

+ 52 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderCloseReq.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.sdk.req;
+
+import io.swagger.annotations.ApiModel;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-05
+ */
+@ApiModel("关闭订单请求")
+public class OrderCloseReq {
+
+    /**
+     * 支付id
+     */
+    private String paymentId;
+
+    /**
+     * 关单描述
+     */
+    private String reason;
+
+    /**
+     * 扩展域
+     */
+    private String expend;
+
+    public String getPaymentId() {
+        return paymentId;
+    }
+
+    public void setPaymentId(String paymentId) {
+        this.paymentId = paymentId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getExpend() {
+        return expend;
+    }
+
+    public void setExpend(String expend) {
+        this.expend = expend;
+    }
+}

+ 1 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderPayReq.java

@@ -42,7 +42,7 @@ public class OrderPayReq {
     @ApiModelProperty(value = "商品描述",hidden = true)
     private String goodDesc;
 
-    @ApiModelProperty("拉起支付信息")
+    @ApiModelProperty(value = "拉起支付信息",hidden = true)
     private String payInfo;
 
     public void orderStatus(Integer orderStatus) {

+ 39 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderCloseRes.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.sdk.res;
+
+import io.swagger.annotations.ApiModel;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-05
+ */
+@ApiModel("关闭订单信息")
+public class OrderCloseRes {
+
+    /**
+     * 执行状态
+     */
+    private boolean status = true;
+
+    /**
+     * 错误信息
+     */
+    private String failMsg;
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public String getFailMsg() {
+        return failMsg;
+    }
+
+    public void setFailMsg(String failMsg) {
+        this.failMsg = failMsg;
+    }
+}

+ 12 - 6
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderPayRes.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.sdk.res;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.yonge.cooleshow.enums.PayStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -15,23 +16,28 @@ public class OrderPayRes {
     @ApiModelProperty("pay_info")
     private String pay_info;
 
-    @ApiModelProperty("执行状态")
+    @ApiModelProperty(value = "执行状态",required = true)
+    @JsonIgnore
     private boolean status = true;
 
-    @ApiModelProperty("出错信息")
+    @ApiModelProperty(value = "出错信息",required = true)
+    @JsonIgnore
     private String message;
 
-    @ApiModelProperty("支付状态")
+    @ApiModelProperty(value = "支付状态",required = true)
+    @JsonIgnore
     private PayStatusEnum payStatus;
 
 
-    @ApiModelProperty("订单编号")
+    @ApiModelProperty(value = "订单编号",required = true)
+    @JsonIgnore
     private String orderNo;
 
-    @ApiModelProperty("支付方式")
+    @ApiModelProperty("支付渠道:  alipay 支付宝  wx_lite 微信")
     private String payChannel;
 
-    @ApiModelProperty("交易流水号")
+    @ApiModelProperty(value = "交易流水号",required = true)
+    @JsonIgnore
     private String transNo;
 
     public String getPay_amt() {

+ 10 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/PaymentService.java

@@ -1,7 +1,9 @@
 package com.yonge.cooleshow.service;
 
+import com.yonge.cooleshow.sdk.req.OrderCloseReq;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
 import com.yonge.cooleshow.sdk.req.OrderRefundReq;
+import com.yonge.cooleshow.sdk.res.OrderCloseRes;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
 import com.yonge.cooleshow.sdk.res.OrderRefundRes;
 
@@ -33,4 +35,12 @@ public interface PaymentService {
      * @return
      */
     OrderRefundRes orderRefund(OrderRefundReq refundReq);
+
+    /**
+     * 关闭订单
+     *
+     * @param closeReq 关闭订单
+     * @return
+     */
+    OrderCloseRes orderClose(OrderCloseReq closeReq);
 }

+ 15 - 0
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/impl/AdapayPaymentServiceImpl.java

@@ -9,9 +9,11 @@ import com.yonge.cooleshow.enums.PayStatusEnum;
 import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
 import com.yonge.cooleshow.sdk.adapay.dto.RefundReq;
 import com.yonge.cooleshow.sdk.req.DeviceInfo;
+import com.yonge.cooleshow.sdk.req.OrderCloseReq;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
 import com.yonge.cooleshow.sdk.adapay.dto.PaymentReq;
 import com.yonge.cooleshow.sdk.req.OrderRefundReq;
+import com.yonge.cooleshow.sdk.res.OrderCloseRes;
 import com.yonge.cooleshow.sdk.res.OrderRefundRes;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
 import com.yonge.cooleshow.service.PaymentService;
@@ -142,4 +144,17 @@ public class AdapayPaymentServiceImpl implements PaymentService {
         }
         return orderRefundRes;
     }
+
+    @Override
+    public OrderCloseRes orderClose(OrderCloseReq closeReq) {
+        HttpResponseResult<Map<String, Object>> mapHttpResponseResult = paymentSdk.closePayment(closeReq.getPaymentId(),
+                                                                                                closeReq.getReason(),
+                                                                                                closeReq.getExpend());
+        OrderCloseRes closeRes = new OrderCloseRes();
+        if (!mapHttpResponseResult.getStatus()) {
+            closeRes.setFailMsg(mapHttpResponseResult.getMsg());
+            closeRes.setStatus(false);
+        }
+        return closeRes;
+    }
 }

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java

@@ -20,7 +20,7 @@ public class CancelOrderReceiver {
     private OmsPortalOrderService portalOrderService;
     @RabbitHandler
     public void handle(Long orderId){
-        portalOrderService.cancelOrder(orderId);
+        portalOrderService.cancelOrder(orderId, "超时取消");
         LOGGER.info("process orderId:{}",orderId);
     }
 }

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -91,7 +91,7 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/cancelUserOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult cancelUserOrder(Long orderId) {
-        portalOrderService.cancelOrder(orderId);
+        portalOrderService.cancelOrder(orderId, "用户取消订单");
         return CommonResult.success(null);
     }
 

+ 5 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -13,6 +13,7 @@ import com.yonge.cooleshow.util.DistributedLock;
 import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.web.WebUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -94,9 +95,7 @@ public class PaymentController extends BaseController {
                 //验签成功逻辑
                 log.info("验签成功");
                 String type = request.getParameter("type");
-                if (type.contains("payment")) {
-                    portalOrderService.orderCallback(data);
-                }
+                portalOrderService.orderCallback(data,type);
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -124,7 +123,9 @@ public class PaymentController extends BaseController {
             }  else {
                 return failed(orderPayRes.getMessage());
             }
-        } catch (Exception e) {
+        }catch (BizException e) {
+            return failed(e.getMessage());
+        }catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");
         }

+ 9 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -10,7 +10,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Future;
 
 /**
  * 前台订单管理Service
@@ -45,7 +44,7 @@ public interface OmsPortalOrderService {
      * 取消单个超时订单
      */
     @Transactional
-    void cancelOrder(Long orderId);
+    void cancelOrder(Long orderId, String message);
 
     /**
      * 发送延迟消息取消订单
@@ -78,8 +77,15 @@ public interface OmsPortalOrderService {
     /**
      *
      * @param data
+     * @param type
+     */    /**
+     * 订单拉起支付
+     *
+     * @param payReq 支付信息
+     * @return
      */
-    void orderCallback(String data);
+    @Transactional
+    void orderCallback(String data, String type);
 
     /**
      * 订单拉起支付

+ 129 - 28
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -19,7 +19,9 @@ import com.yonge.cooleshow.portal.dao.SmsCouponHistoryDao;
 import com.yonge.cooleshow.portal.domain.*;
 import com.yonge.cooleshow.portal.service.*;
 import com.yonge.cooleshow.sdk.adapay.PaymentSdk;
+import com.yonge.cooleshow.sdk.req.OrderCloseReq;
 import com.yonge.cooleshow.sdk.req.OrderPayReq;
+import com.yonge.cooleshow.sdk.res.OrderCloseRes;
 import com.yonge.cooleshow.sdk.res.OrderPayRes;
 import com.yonge.cooleshow.service.PaymentService;
 import org.slf4j.Logger;
@@ -291,14 +293,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             if (timeOutOrder.getStatus() == 0) {
                 payingOrderHandle(timeOutOrder);
             } else if (timeOutOrder.getStatus() == 6) {
-                cancelOrder(timeOutOrder.getId());
+                cancelOrder(timeOutOrder.getId(), "超时取消");
             }
         }
         return timeOutOrders.size();
     }
 
     @Override
-    public void cancelOrder(Long orderId) {
+    public void cancelOrder(Long orderId, String message) {
         //查询未付款的取消订单
         OmsOrderExample example = new OmsOrderExample();
         example.createCriteria().andIdEqualTo(orderId).andDeleteStatusEqualTo(0);
@@ -327,9 +329,22 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             }
             UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNo(cancelOrder.getOrderSn());
             if (null != orderPayment) {
+                // 发起关单
+                OrderCloseReq orderCloseReq = new OrderCloseReq();
+                orderCloseReq.setPaymentId(orderPayment.getTransNo());
+                orderCloseReq.setReason(message);
+                OrderCloseRes closeRes = adapayPaymentService.orderClose(orderCloseReq);
+                if (closeRes.isStatus()) {
+                    orderPayment.setCloseStatus(PayStatusEnum.pending.getCode());
+                } else {
+                    orderPayment.setCloseStatus(PayStatusEnum.failed.getCode());
+                    orderPayment.setCloseFailMsg(closeRes.getFailMsg());
+                }
+
                 //更新付款单
                 orderPayment.setStatus(PayStatusEnum.failed.getCode());
-                orderPayment.setPayFailMsg("交易取消");
+                orderPayment.setPayFailMsg(message);
+                orderPayment.setUpdateTime(new Date());
                 userOrderPaymentService.saveOrUpdate(orderPayment);
             }
         }
@@ -459,6 +474,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderPayRes.setMessage("订单不存在");
             return orderPayRes;
         }
+        if (detail.getStatus() != 0 && detail.getStatus() != 6) {
+            orderPayRes.setStatus(false);
+            orderPayRes.setMessage("订单已付款或已关闭");
+            return orderPayRes;
+        }
         UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNo(detail.getOrderSn());
         payReq.orderStatus(detail.getStatus());
         payReq.setOrderNo(detail.getOrderSn());
@@ -471,13 +491,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         // 支付中的返回拉起信息
         orderPayRes = adapayPaymentService.orderPay(payReq);
         if (!orderPayRes.isStatus()) {
-            if (orderPayRes.getPayStatus() != null
-            && PayStatusEnum.failed.getCode().equals(orderPayRes.getPayStatus().getCode())) {
-                // 异常将取消订单
-                cancelOrder(detail.getId());
-            }
+            // 异常将取消订单
+            cancelOrder(detail.getId(),orderPayRes.getMessage());
             throw new BizException(orderPayRes.getMessage());
         }
+        if (!orderPayRes.getPay_amt().equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
+            cancelOrder(detail.getId(),"订单金额和实际支付金额不符");
+            throw new BizException("订单金额和实际支付金额不符");
+        }
         // 订单状态和付款状态都是付款中,直接返回付款拉起信息
         if (OrderStatusEnum.PAYING.getCode().equals(payReq.getOrderStatus().getCode())
                 && PayStatusEnum.pending.getCode().equals(orderPayRes.getPayStatus().getCode())) {
@@ -488,7 +509,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         OmsOrder omsOrder = new OmsOrder();
         omsOrder.setId(detail.getId());
         if (orderPayRes.getPayStatus().getCode().equals(OrderStatusEnum.PAYING.getCode())) {
-            omsOrder.setStatus(1);
+            omsOrder.setStatus(0);
             orderMapper.updateByPrimaryKeySelective(omsOrder);
             // 保存订单支付表
             if (userOrderPayment == null) {
@@ -506,29 +527,104 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             userOrderPaymentService.saveOrUpdate(userOrderPayment);
         }else {
             // 异常将取消订单
-            cancelOrder(detail.getId());
+            cancelOrder(detail.getId(), orderPayRes.getMessage());
         }
 
         return orderPayRes;
     }
 
     @Override
-    public void orderCallback(String data) {
+    public void orderCallback(String data, String type) {
         JSONObject hfRes = JSONObject.parseObject(data);
-        if (PayStatusEnum.succeeded.getCode().equals(hfRes.getString("status"))) {
-            //订单完成
-            OmsOrderDetail orderDetail = detail(hfRes.getString("order_no"));
-            if (null == orderDetail) {
-                log.error("汇付支付回调,订单未找到。 req is {}", data);
-                return;
-            }
-            if (orderDetail.getStatus() == 0) {
-                orderSuccess(orderDetail, hfRes);
-            } else {
-                log.error("汇付支付回调,订单状态异常。 req is {}", data);
-            }
+
+        if (type.equals("payment.succeeded")) {//支付成功
+            paymentSucceededHandle(hfRes);
+        } else if (type.equals("payment.failed")) {//支付失败
+            paymentFailedHandle(hfRes);
+        } else if (type.equals("payment.close.succeeded")) {//支付关单成功
+            paymentCloseSucceededHandle(hfRes);
+        } else if (type.equals("payment.close.failed")) {//支付关单失败
+            paymentCloseFailedHandle(hfRes);
+        }
+    }
+
+
+
+    /***
+     * 处理回调-支付成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentSucceededHandle(JSONObject hfRes) {
+        //订单完成
+        OmsOrder detail = detail(hfRes.getString("order_no"));
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        if (detail.getStatus() == 0) {
+            orderSuccess(detail, hfRes);
+        } else {
+            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
+        }
+    }
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentFailedHandle(JSONObject hfRes) {
+        //订单完成
+        OmsOrder detail = detail(hfRes.getString("order_no"));
+
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        if (detail.getStatus() == 0) {
+
+            cancelOrder(detail.getId(), "支付回调失败");
+        } else {
+            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
         }
     }
+
+    /***
+     * 支付关单成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseSucceededHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(PayStatusEnum.succeeded.getCode());
+        orderPayment.setUpdateTime(new Date());
+        userOrderPaymentService.saveOrUpdate(orderPayment);
+    }
+
+    /***
+     * 支付关单失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseFailedHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(PayStatusEnum.failed.getCode());
+        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
+        orderPayment.setUpdateTime(new Date());
+        userOrderPaymentService.saveOrUpdate(orderPayment);
+    }
+
     /***
      * 处理支付中订单
      * @author liweifan
@@ -546,11 +642,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             Map<String, Object> resMap = paymentSdk.queryPayment(orderPayment.getTransNo());
             //支付失败
             if (PayStatusEnum.failed.getCode().equals(resMap.get("status").toString())) {
-                cancelOrder(userOrder.getId());
-            }
-            //支付成功
-            if (PayStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
+                cancelOrder(userOrder.getId(), "支付失败");
+            }else if (PayStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
+                // 支付成功
                 orderSuccess(userOrder,null);
+            } else {
+                cancelOrder(userOrder.getId(), "支付超时");
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -574,11 +671,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         } else if (orderPayment.getPayChannel().equals("wx_lite")) {
             paySuccess(detail.getId(),2);
         }
+        String pay_amt = hfRes.getString("pay_amt");
+        if (!pay_amt.equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
+            orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
+        }
         orderPayment.setStatus(PayStatusEnum.succeeded.getCode());
         orderPayment.setArrivalTime(new Date());
         if (null != hfRes) {
             try {
-                orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
+                orderPayment.setPayAmt(new BigDecimal(pay_amt));
                 orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
             } catch (Exception e) {
                 e.printStackTrace();