浏览代码

支付回调接口幂等bugfix

zhijiezhao 1 月之前
父节点
当前提交
ded3512c7f

+ 70 - 3
src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java

@@ -17,17 +17,21 @@ import java.util.List;
 public interface OrderCommonMapper {
 public interface OrderCommonMapper {
     /**
     /**
      * 查询订单发货次数
      * 查询订单发货次数
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     int countLogisticsBatch(Integer orderId);
     int countLogisticsBatch(Integer orderId);
 
 
     /**
     /**
      * 查询订单发货次数
      * 查询订单发货次数
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      */
      */
     int countLogisticsBatchShop(Integer shopOrderId);
     int countLogisticsBatchShop(Integer shopOrderId);
+
     /**
     /**
      * 组织
      * 组织
+     *
      * @param orderId
      * @param orderId
      * @return
      * @return
      */
      */
@@ -35,18 +39,22 @@ public interface OrderCommonMapper {
 
 
     /**
     /**
      * 组织
      * 组织
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
     Integer getShopOrganizeId(@Param("shopOrderId") Integer shopOrderId);
     Integer getShopOrganizeId(@Param("shopOrderId") Integer shopOrderId);
+
     /**
     /**
      * 根据子订单Id查询子订单列表 -- 不包括已付款
      * 根据子订单Id查询子订单列表 -- 不包括已付款
+     *
      * @param shopOrderIds 子订单Ids
      * @param shopOrderIds 子订单Ids
      */
      */
     List<ShopOrderVo> getShopOrderList(@Param("shopOrderIds") List<String> shopOrderIds);
     List<ShopOrderVo> getShopOrderList(@Param("shopOrderIds") List<String> shopOrderIds);
 
 
     /**
     /**
      * 根据子订单Id查询子订单列表
      * 根据子订单Id查询子订单列表
+     *
      * @param shopOrderIds
      * @param shopOrderIds
      * @return
      * @return
      */
      */
@@ -54,55 +62,72 @@ public interface OrderCommonMapper {
 
 
     /**
     /**
      * 子订单是否支付
      * 子订单是否支付
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
     List<DiscernReceiptVo> getShopOrderReceipt(@Param("shopOrderId") Integer shopOrderId);
     List<DiscernReceiptVo> getShopOrderReceipt(@Param("shopOrderId") Integer shopOrderId);
+
     /**
     /**
      * 根据Id获取订单促销
      * 根据Id获取订单促销
+     *
      * @param orderPromotionsId 订单促销Id
      * @param orderPromotionsId 订单促销Id
      */
      */
     PromotionsVo getOrderPromotionsById(Integer orderPromotionsId);
     PromotionsVo getOrderPromotionsById(Integer orderPromotionsId);
+
     /**
     /**
      * 获取子订单订单商品
      * 获取子订单订单商品
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      */
      */
     List<OrderProductVo> getShopOrderProduct(Integer shopOrderId);
     List<OrderProductVo> getShopOrderProduct(Integer shopOrderId);
+
     /**
     /**
      * 更具订单Id获取订单商品列表
      * 更具订单Id获取订单商品列表
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     List<OrderProductVo> getOrderProductByOrderId(Integer orderId);
     List<OrderProductVo> getOrderProductByOrderId(Integer orderId);
 
 
     /**
     /**
      * 根据订单Id获取订单商品列表
      * 根据订单Id获取订单商品列表
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
     List<OrderProductVo> getshopOrderProductByOrderId(Integer shopOrderId);
     List<OrderProductVo> getshopOrderProductByOrderId(Integer shopOrderId);
+
     /**
     /**
      * 支付记录(收款记录)
      * 支付记录(收款记录)
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     List<DiscernReceiptVo> getDiscernReceipt(@Param("orderId") Integer orderId, @Param("shopOrderId") String shopOrderId);
     List<DiscernReceiptVo> getDiscernReceipt(@Param("orderId") Integer orderId, @Param("shopOrderId") String shopOrderId);
+
     /**
     /**
      * 超级会员支付记录
      * 超级会员支付记录
+     *
      * @param vipRecordId 购买记录Id
      * @param vipRecordId 购买记录Id
      */
      */
     DiscernReceiptVo getVipDiscernReceipt(Integer vipRecordId);
     DiscernReceiptVo getVipDiscernReceipt(Integer vipRecordId);
+
     /**
     /**
      * 获取返佣款
      * 获取返佣款
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      */
      */
     Double getRebateAmountByShopOrder(Integer shopOrderId);
     Double getRebateAmountByShopOrder(Integer shopOrderId);
+
     /**
     /**
      * 是否可以走线上支付
      * 是否可以走线上支付
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     int countOfflinePayment(Integer orderId);
     int countOfflinePayment(Integer orderId);
 
 
     /**
     /**
      * 是否线上
      * 是否线上
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
@@ -110,48 +135,65 @@ public interface OrderCommonMapper {
 
 
     /**
     /**
      * 线下支付凭证
      * 线下支付凭证
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
     Integer getOrderVoucher(Integer shopOrderId);
     Integer getOrderVoucher(Integer shopOrderId);
+
     /**
     /**
      * 付供应商费用列表
      * 付供应商费用列表
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     List<Double> getShouldPayShopAmountList(Integer orderId);
     List<Double> getShouldPayShopAmountList(Integer orderId);
+
     /**
     /**
      * 查询关键字历史记录是否存在
      * 查询关键字历史记录是否存在
+     *
      * @param searchWord 关键字
      * @param searchWord 关键字
      */
      */
     Integer getSearchHistoryIdByWord(String searchWord);
     Integer getSearchHistoryIdByWord(String searchWord);
+
     /**
     /**
      * 更新搜索关键词历史记录
      * 更新搜索关键词历史记录
+     *
      * @param historyRecord SearchHistoryVo
      * @param historyRecord SearchHistoryVo
      */
      */
     void updateSearchHistory(SearchHistoryVo historyRecord);
     void updateSearchHistory(SearchHistoryVo historyRecord);
+
     /**
     /**
      * 新增搜索关键词历史记录
      * 新增搜索关键词历史记录
+     *
      * @param historyRecord SearchHistoryVo
      * @param historyRecord SearchHistoryVo
      */
      */
     void insertSearchHistory(SearchHistoryVo historyRecord);
     void insertSearchHistory(SearchHistoryVo historyRecord);
+
     /**
     /**
      * 统计搜索关键词数量
      * 统计搜索关键词数量
+     *
      * @param userId 用户Id
      * @param userId 用户Id
      */
      */
     int countSearchHistory(Integer userId);
     int countSearchHistory(Integer userId);
+
     /**
     /**
      * 只保留10条的搜索关键词历史记录
      * 只保留10条的搜索关键词历史记录
+     *
      * @param userId 用户Id
      * @param userId 用户Id
      */
      */
     void deleteSearchHistoryLimit(Integer userId);
     void deleteSearchHistoryLimit(Integer userId);
+
     /**
     /**
      * 已退货数量
      * 已退货数量
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      * @param productId   商品Id
      * @param productId   商品Id
      */
      */
     Integer countReturnedNum(Integer shopOrderId, Integer productId);
     Integer countReturnedNum(Integer shopOrderId, Integer productId);
+
     /**
     /**
      * 已取消发货数量
      * 已取消发货数量
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      * @param productId   商品Id
      * @param productId   商品Id
      */
      */
@@ -159,71 +201,93 @@ public interface OrderCommonMapper {
 
 
     /**
     /**
      * 子订单退款状态
      * 子订单退款状态
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
-    Integer getRefundStatus(@Param("shopOrderId") Integer shopOrderId );
+    Integer getRefundStatus(@Param("shopOrderId") Integer shopOrderId);
+
     /**
     /**
      * 根据订单Id获取订单
      * 根据订单Id获取订单
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     OrderVo getOrderByOrderId(Integer orderId);
     OrderVo getOrderByOrderId(Integer orderId);
 
 
     /**
     /**
      * 根据子订单Id获取子订单数据
      * 根据子订单Id获取子订单数据
+     *
      * @param shopOrderId
      * @param shopOrderId
      * @return
      * @return
      */
      */
     ShopOrderVo getShopOrderById(Integer shopOrderId);
     ShopOrderVo getShopOrderById(Integer shopOrderId);
+
     /**
     /**
      * 根据子订单Id获取订单
      * 根据子订单Id获取订单
+     *
      * @param shopOrderId 订单Id
      * @param shopOrderId 订单Id
      */
      */
     OrderVo getOrderByShopOrderId(Integer shopOrderId);
     OrderVo getOrderByShopOrderId(Integer shopOrderId);
+
     /**
     /**
      * 根据订单Id获取子订单列表
      * 根据订单Id获取子订单列表
      */
      */
     List<ShopOrderVo> getShopOrderListByOrderId(Integer orderId);
     List<ShopOrderVo> getShopOrderListByOrderId(Integer orderId);
+
     /**
     /**
      * 获取物流批次列表
      * 获取物流批次列表
+     *
      * @param orderId 订单Id
      * @param orderId 订单Id
      */
      */
     List<LogisticsBatchVo> getLogisticsBatchList(Integer orderId);
     List<LogisticsBatchVo> getLogisticsBatchList(Integer orderId);
+
     /**
     /**
      * 获取物流批次列表
      * 获取物流批次列表
+     *
      * @param shopOrderId 子订单Id
      * @param shopOrderId 子订单Id
      */
      */
     List<LogisticsBatchVo> getShopLogisticsBatchList(Integer shopOrderId);
     List<LogisticsBatchVo> getShopLogisticsBatchList(Integer shopOrderId);
+
     /**
     /**
      * 获取发货物流记录
      * 获取发货物流记录
+     *
      * @param shopOrderId      子订单Id
      * @param shopOrderId      子订单Id
      * @param logisticsBatchId 物流批次Id
      * @param logisticsBatchId 物流批次Id
      */
      */
     List<LogisticsRecordVo> getLogisticsRecord(Integer shopOrderId, Integer logisticsBatchId);
     List<LogisticsRecordVo> getLogisticsRecord(Integer shopOrderId, Integer logisticsBatchId);
+
     /**
     /**
      * 获取物流信息
      * 获取物流信息
+     *
      * @param logisticsBatchId 物流批次Id
      * @param logisticsBatchId 物流批次Id
      */
      */
     List<LogisticsInformationVo> getLogisticsInfoList(Integer logisticsBatchId);
     List<LogisticsInformationVo> getLogisticsInfoList(Integer logisticsBatchId);
+
     /**
     /**
      * 获取用户可用优惠券列表
      * 获取用户可用优惠券列表
+     *
      * @param userId 用户Id
      * @param userId 用户Id
      */
      */
     List<CouponVo> getClubCouponList(Integer userId);
     List<CouponVo> getClubCouponList(Integer userId);
+
     /**
     /**
      * 未领取的优惠券
      * 未领取的优惠券
-     * @param userId 用户Id
+     *
+     * @param userId       用户Id
      * @param registerTime
      * @param registerTime
      */
      */
     List<CouponVo> getPrevCouponList(@Param("userId") Integer userId, @Param("registerTime") Date registerTime);
     List<CouponVo> getPrevCouponList(@Param("userId") Integer userId, @Param("registerTime") Date registerTime);
+
     /**
     /**
      * 活动券商品Ids
      * 活动券商品Ids
      */
      */
     List<Integer> getCouponProductIds(Integer couponId, Integer source);
     List<Integer> getCouponProductIds(Integer couponId, Integer source);
+
     /**
     /**
      * 获取订单发票信息
      * 获取订单发票信息
      */
      */
     InvoiceVo getOrderInvoice(Integer orderId);
     InvoiceVo getOrderInvoice(Integer orderId);
+
     /**
     /**
      * 根据用户id查询注册时间
      * 根据用户id查询注册时间
      */
      */
@@ -243,7 +307,7 @@ public interface OrderCommonMapper {
 
 
     Double findEachDiscount(Integer shopOrderId);
     Double findEachDiscount(Integer shopOrderId);
 
 
-    String findWeChatFlag(String splitCode,Integer shopId);
+    String findWeChatFlag(String splitCode, Integer shopId);
 
 
     Integer findPayB2BRecord(Integer shopOrderId);
     Integer findPayB2BRecord(Integer shopOrderId);
 
 
@@ -256,5 +320,8 @@ public interface OrderCommonMapper {
     void updateShopOrderBalance(ShopOrderVo s);
     void updateShopOrderBalance(ShopOrderVo s);
 
 
     String findAliPayFlag(String splitCode, Integer shopId);
     String findAliPayFlag(String splitCode, Integer shopId);
+
+
+    void insertPayException(Integer shopOrderId, Integer type, String toJSONString);
 }
 }
 
 

+ 2 - 2
src/main/java/com/caimei365/order/mapper/PayOrderMapper.java

@@ -68,10 +68,10 @@ public interface PayOrderMapper {
     void updateAbleMoney( Double ableUserMoney,Integer userId);
     void updateAbleMoney( Double ableUserMoney,Integer userId);
     /**
     /**
      * 订单支付链接
      * 订单支付链接
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      * @param amount  本次待付款金额
      * @param amount  本次待付款金额
      */
      */
-    OrderPayLinkVo getOrderPayLink(Integer orderId, Double amount);
+    OrderPayLinkVo getOrderPayLink(Integer shopOrderId, Double amount);
     /**
     /**
      * svip支付链接
      * svip支付链接
      * @param vipRecordId   会员购买记录Id
      * @param vipRecordId   会员购买记录Id

+ 29 - 9
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -219,12 +219,14 @@ public class HeliPayServiceImpl implements HeliPayService {
         String checkSign1 = Disguiser.disguiseMD5(oriMessage1.trim());
         String checkSign1 = Disguiser.disguiseMD5(oriMessage1.trim());
         boolean b = sign.equals(checkSign1);
         boolean b = sign.equals(checkSign1);
         if (!b) {
         if (!b) {
+            orderCommonMapper.insertPayException(null, 1, JSONObject.toJSONString(res));
             return "验签名失败!";
             return "验签名失败!";
         }
         }
         // 订单状态 INIT:已接收 DOING:处理中 SUCCESS:成功 FAIL:失败 CLOSE:关闭 CANCEL:撤销
         // 订单状态 INIT:已接收 DOING:处理中 SUCCESS:成功 FAIL:失败 CLOSE:关闭 CANCEL:撤销
         String orderStatus = res.getRt4_status();
         String orderStatus = res.getRt4_status();
         log.info("【支付异步回调】>>>>>>>>>>>>>>支付订单状态:" + orderStatus);
         log.info("【支付异步回调】>>>>>>>>>>>>>>支付订单状态:" + orderStatus);
         if (!"SUCCESS".equals(orderStatus)) {
         if (!"SUCCESS".equals(orderStatus)) {
+            orderCommonMapper.insertPayException(null, 2, JSONObject.toJSONString(res));
             return "支付失败";
             return "支付失败";
         }
         }
         String s = checkOrderStatus(res, 1);
         String s = checkOrderStatus(res, 1);
@@ -286,12 +288,10 @@ public class HeliPayServiceImpl implements HeliPayService {
         // 订单信息
         // 订单信息
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
         ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
         ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
-        if (null == order) {
+        if (null == order || null == shopOrder) {
+            orderCommonMapper.insertPayException(null, 3, JSONObject.toJSONString(o));
             return "订单不存在";
             return "订单不存在";
         }
         }
-        if (null == shopOrder) {
-            return "子订单不存在";
-        }
         // 支付记录
         // 支付记录
         List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(order.getOrderId(), order.getShopOrderIds());
         List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(order.getOrderId(), order.getShopOrderIds());
         double receiptAmount = 0d;
         double receiptAmount = 0d;
@@ -301,6 +301,13 @@ public class HeliPayServiceImpl implements HeliPayService {
             }
             }
         }
         }
         order.setReceiptAmount(MathUtil.add(receiptAmount, amount).doubleValue());
         order.setReceiptAmount(MathUtil.add(receiptAmount, amount).doubleValue());
+        if (3 == shopOrder.getReceiptStatus() || (shopOrder.getReceiptAmount() > shopOrder.getRealPay())) {
+            /** 子订单已收款 或者支付金额>应付
+             * 回调被拉起多次,重复支付,停止写入,记录异常
+             */
+            orderCommonMapper.insertPayException(shopOrderId, 4, JSONObject.toJSONString(o));
+            return "重复支付!";
+        }
         Date date = new Date();
         Date date = new Date();
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         if (MathUtil.compare(order.getPayableAmount(), order.getReceiptAmount()) == 0) {
         if (MathUtil.compare(order.getPayableAmount(), order.getReceiptAmount()) == 0) {
@@ -779,6 +786,7 @@ public class HeliPayServiceImpl implements HeliPayService {
             String status = data.getRt10_orderStatus();
             String status = data.getRt10_orderStatus();
             log.info("【延时分账回调】>>>>>>>>>>分账状态:" + status);
             log.info("【延时分账回调】>>>>>>>>>>分账状态:" + status);
             if (!"SUCCESS".equals(status)) {
             if (!"SUCCESS".equals(status)) {
+                orderCommonMapper.insertPayException(null, 6, JSONObject.toJSONString(data));
                 return "分账失败";
                 return "分账失败";
             }
             }
             // 修改收款分账状态为1
             // 修改收款分账状态为1
@@ -868,6 +876,10 @@ public class HeliPayServiceImpl implements HeliPayService {
         String checkSign2 = Disguiser.disguiseMD5(oriMessage.trim());
         String checkSign2 = Disguiser.disguiseMD5(oriMessage.trim());
         if (!sign.equals(checkSign2)) {
         if (!sign.equals(checkSign2)) {
             log.error("网银支付异步回调验签失败------------------------------------");
             log.error("网银支付异步回调验签失败------------------------------------");
+            /** 异常订单类型
+             * 1.签名验证失败 2,支付状态失败 3,订单不存在 4,超额支付
+             */
+            orderCommonMapper.insertPayException(null, 1, JSONObject.toJSONString(res));
             return "验签名失败!";
             return "验签名失败!";
         }
         }
         // INIT:未支付
         // INIT:未支付
@@ -882,6 +894,7 @@ public class HeliPayServiceImpl implements HeliPayService {
         Double amount = Double.valueOf(res.getRt6_orderAmount());
         Double amount = Double.valueOf(res.getRt6_orderAmount());
         log.info("【支付异步回调】>>>>>>>>>>>>>>支付订单状态:" + orderStatus);
         log.info("【支付异步回调】>>>>>>>>>>>>>>支付订单状态:" + orderStatus);
         if (!"SUCCESS".equals(orderStatus)) {
         if (!"SUCCESS".equals(orderStatus)) {
+            orderCommonMapper.insertPayException(null, 2, JSONObject.toJSONString(res));
             return "支付失败";
             return "支付失败";
         }
         }
         String[] split = res.getRt13_desc().split(",");
         String[] split = res.getRt13_desc().split(",");
@@ -894,12 +907,10 @@ public class HeliPayServiceImpl implements HeliPayService {
         // 订单信息
         // 订单信息
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
         ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
         ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
-        if (null == order) {
+        if (null == order || null == shopOrder) {
+            orderCommonMapper.insertPayException(shopOrderId, 3, JSONObject.toJSONString(res));
             return "订单不存在";
             return "订单不存在";
         }
         }
-        if (null == shopOrder) {
-            return "子订单不存在";
-        }
         // 支付记录
         // 支付记录
         List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(order.getOrderId(), order.getShopOrderIds());
         List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(order.getOrderId(), order.getShopOrderIds());
         double receiptAmount = 0d;
         double receiptAmount = 0d;
@@ -910,6 +921,13 @@ public class HeliPayServiceImpl implements HeliPayService {
         }
         }
         order.setReceiptAmount(MathUtil.add(receiptAmount, amount).doubleValue());
         order.setReceiptAmount(MathUtil.add(receiptAmount, amount).doubleValue());
         log.info("【支付异步回调】>>>>>>>>>>>>>>已付金额+本次支付金额:" + order.getReceiptAmount());
         log.info("【支付异步回调】>>>>>>>>>>>>>>已付金额+本次支付金额:" + order.getReceiptAmount());
+        if (3 == shopOrder.getReceiptStatus() || (shopOrder.getReceiptAmount() > shopOrder.getRealPay())) {
+            /** 子订单已收款 或者支付金额>应付
+             * 回调被拉起多次,重复支付,停止写入,记录异常
+             */
+            orderCommonMapper.insertPayException(shopOrderId, 4, JSONObject.toJSONString(res));
+            return "重复支付!";
+        }
         Date date = new Date();
         Date date = new Date();
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         if (MathUtil.compare(order.getPayableAmount(), order.getReceiptAmount()) == 0) {
         if (MathUtil.compare(order.getPayableAmount(), order.getReceiptAmount()) == 0) {
@@ -951,7 +969,7 @@ public class HeliPayServiceImpl implements HeliPayService {
         // 更新订单支付状态
         // 更新订单支付状态
         payOrderMapper.updateOrderStatus(order);
         payOrderMapper.updateOrderStatus(order);
         // 修改支付链接状态
         // 修改支付链接状态
-        OrderPayLinkVo orderPayLink = payOrderMapper.getOrderPayLink(orderId, amount);
+        OrderPayLinkVo orderPayLink = payOrderMapper.getOrderPayLink(shopOrderId, amount);
         if (null != orderPayLink && ("12".equals(payType) || "17".equals(payType))) {
         if (null != orderPayLink && ("12".equals(payType) || "17".equals(payType))) {
             orderPayLink.setPayStatus(1);
             orderPayLink.setPayStatus(1);
             payOrderMapper.updateOrderPayLinkStatus(orderPayLink);
             payOrderMapper.updateOrderPayLinkStatus(orderPayLink);
@@ -1368,11 +1386,13 @@ public class HeliPayServiceImpl implements HeliPayService {
                     }
                     }
                 } else {
                 } else {
                     // 支付验证码校验失败删除银行卡信息
                     // 支付验证码校验失败删除银行卡信息
+                    orderCommonMapper.insertPayException(null, 5, JSONObject.toJSONString(res));
                     log.info("快捷支付付款状态异常============================> res:" + res);
                     log.info("快捷支付付款状态异常============================> res:" + res);
                     delQuickInfo(res);
                     delQuickInfo(res);
                 }
                 }
             } else {
             } else {
                 // 支付验证码校验失败删除银行卡信息
                 // 支付验证码校验失败删除银行卡信息
+                orderCommonMapper.insertPayException(null, 1, JSONObject.toJSONString(res));
                 log.info("快捷支付回调验签失败=========================> res:" + res);
                 log.info("快捷支付回调验签失败=========================> res:" + res);
                 delQuickInfo(res);
                 delQuickInfo(res);
             }
             }

+ 105 - 93
src/main/resources/mapper/OrderCommonMapper.xml

@@ -212,7 +212,7 @@
                p.productType,
                p.productType,
                p.productCode,
                p.productCode,
                p.splitCode,
                p.splitCode,
-               p.mainImage as image,
+               p.mainImage        as image,
                p.returnGoodsStutas
                p.returnGoodsStutas
         FROM cm_order_product cop
         FROM cm_order_product cop
                  LEFT JOIN product p ON cop.productID = p.productID
                  LEFT JOIN product p ON cop.productID = p.productID
@@ -235,7 +235,8 @@
                cror.associateAmount
                cror.associateAmount
         FROM cm_receipt_order_relation cror
         FROM cm_receipt_order_relation cror
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
-        WHERE cror.shopOrderId = #{shopOrderId} AND cror.relationType = '2'
+        WHERE cror.shopOrderId = #{shopOrderId}
+          AND cror.relationType = '2'
           AND cror.delFlag = '0'
           AND cror.delFlag = '0'
           AND cdr.delFlag = '0'
           AND cdr.delFlag = '0'
           AND cdr.receiptStatus = '3'
           AND cdr.receiptStatus = '3'
@@ -288,7 +289,7 @@
         SELECT count(*)
         SELECT count(*)
         FROM cm_receipt_order_relation cror
         FROM cm_receipt_order_relation cror
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
-        WHERE (cror.orderId = #{shopOrderId} or cror.shopOrderId = #{shopOrderId} )
+        WHERE (cror.orderId = #{shopOrderId} or cror.shopOrderId = #{shopOrderId})
           AND cror.relationType = '2'
           AND cror.relationType = '2'
           AND cror.delFlag = '0'
           AND cror.delFlag = '0'
           AND cdr.delFlag = '0'
           AND cdr.delFlag = '0'
@@ -296,7 +297,9 @@
           AND cdr.payWay = '2'
           AND cdr.payWay = '2'
     </select>
     </select>
     <select id="getOrderVoucher" resultType="java.lang.Integer">
     <select id="getOrderVoucher" resultType="java.lang.Integer">
-        select count(id) from cm_order_payment_voucher where shopOrderId = #{shopOrderId}
+        select count(id)
+        from cm_order_payment_voucher
+        where shopOrderId = #{shopOrderId}
     </select>
     </select>
     <select id="getShouldPayShopAmountList" resultType="java.lang.Double">
     <select id="getShouldPayShopAmountList" resultType="java.lang.Double">
         SELECT shouldPayShopAmount
         SELECT shouldPayShopAmount
@@ -315,23 +318,30 @@
     <update id="updateShopOrderBalance">
     <update id="updateShopOrderBalance">
         update cm_shop_order
         update cm_shop_order
         set useBalanceFlag = #{useBalanceFlag},
         set useBalanceFlag = #{useBalanceFlag},
-            accountAmount = #{accountAmount},
-            receiptStatus = #{receiptStatus}
+            accountAmount  = #{accountAmount},
+            receiptStatus  = #{receiptStatus}
         where shopOrderId = #{shopOrderId}
         where shopOrderId = #{shopOrderId}
     </update>
     </update>
     <delete id="deleteSearchHistoryLimit">
     <delete id="deleteSearchHistoryLimit">
         DELETE
         DELETE
         FROM user_order_history
         FROM user_order_history
         WHERE userId = #{userId}
         WHERE userId = #{userId}
-          AND id NOT IN (
-            SELECT temp.id
-            FROM (SELECT id FROM user_order_history WHERE userId = #{userId} ORDER BY id DESC LIMIT 10) AS temp
-        )
+          AND id NOT IN (SELECT temp.id
+                         FROM (SELECT id
+                               FROM user_order_history
+                               WHERE userId = #{userId}
+                               ORDER BY id DESC
+                               LIMIT 10) AS temp)
     </delete>
     </delete>
     <insert id="insertSearchHistory">
     <insert id="insertSearchHistory">
         INSERT INTO user_order_history (userId, searchWord, searchDate, delFlag)
         INSERT INTO user_order_history (userId, searchWord, searchDate, delFlag)
         VALUES (#{userId}, #{searchWord}, #{searchDate}, #{delFlag})
         VALUES (#{userId}, #{searchWord}, #{searchDate}, #{delFlag})
     </insert>
     </insert>
+    <insert id="insertPayException">
+        insert into cm_order_pay_exception
+            (shopOrderId, exceptionText, addTime)
+            value (#{shopOrderId}, #{toJSONString}, now())
+    </insert>
     <select id="getSearchHistoryIdByWord" resultType="java.lang.Integer">
     <select id="getSearchHistoryIdByWord" resultType="java.lang.Integer">
         SELECT id
         SELECT id
         FROM user_order_history
         FROM user_order_history
@@ -401,17 +411,17 @@
     </select>
     </select>
     <select id="getshopOrderProductByOrderId" resultType="com.caimei365.order.model.vo.OrderProductVo">
     <select id="getshopOrderProductByOrderId" resultType="com.caimei365.order.model.vo.OrderProductVo">
         SELECT cop.skuId,
         SELECT cop.skuId,
-               cop.orderProductID                                                 AS orderProductId,
-               cop.orderID                                                        AS orderId,
+               cop.orderProductID                                                             AS orderProductId,
+               cop.orderID                                                                    AS orderId,
                cop.orderNo,
                cop.orderNo,
-               cop.shopOrderID                                                    AS shopOrderId,
+               cop.shopOrderID                                                                AS shopOrderId,
                cop.shopOrderNo,
                cop.shopOrderNo,
-               (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+               (select clubID from cm_order where orderId = cso.orderId)                      as clubId,
                cop.orderPromotionsId,
                cop.orderPromotionsId,
                cop.productId,
                cop.productId,
                cop.shopId,
                cop.shopId,
                cop.name,
                cop.name,
-               cop.productImage                                                   AS image,
+               cop.productImage                                                               AS image,
                cop.price,
                cop.price,
                cop.shopName,
                cop.shopName,
                IF(cop.shopid = 998 AND cso.shopPostFlag > 0, cso.shopPostFlag, cop.costPrice) AS costPrice,
                IF(cop.shopid = 998 AND cso.shopPostFlag > 0, cso.shopPostFlag, cop.costPrice) AS costPrice,
@@ -443,9 +453,9 @@
                cop.payStatus,
                cop.payStatus,
                cop.buyAgainFlag,
                cop.buyAgainFlag,
                cop.notOutStore,
                cop.notOutStore,
-               cop.isActProduct                                                   AS actProduct,
+               cop.isActProduct                                                               AS actProduct,
                cop.productType,
                cop.productType,
-               p.productCategory                                                  as productCategory,
+               p.productCategory                                                              as productCategory,
                p.splitCode,
                p.splitCode,
                p.productType
                p.productType
         FROM cm_order_product cop
         FROM cm_order_product cop
@@ -474,7 +484,9 @@
           AND rp.delFlag = '0'
           AND rp.delFlag = '0'
     </select>
     </select>
     <select id="getRefundStatus" resultType="java.lang.Integer">
     <select id="getRefundStatus" resultType="java.lang.Integer">
-        select refundStatus from cm_shop_order where shopOrderId = #{shopOrderId}
+        select refundStatus
+        from cm_shop_order
+        where shopOrderId = #{shopOrderId}
     </select>
     </select>
     <select id="getOrderByOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
     <select id="getOrderByOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT orderID      AS orderId,
         SELECT orderID      AS orderId,
@@ -529,58 +541,58 @@
         WHERE orderID = #{orderId}
         WHERE orderID = #{orderId}
     </select>
     </select>
     <select id="getShopOrderById" resultType="com.caimei365.order.model.vo.ShopOrderVo">
     <select id="getShopOrderById" resultType="com.caimei365.order.model.vo.ShopOrderVo">
-        SELECT
-        cso.shopOrderID AS shopOrderId,
-        cso.shopOrderNo,
-        cso.orderID AS orderId,
-        cso.orderType,
-        IFNULL(cso.organizeID, 0) AS organizeId,
-        IFNULL(cso.isColdChina, 0) AS isColdChina,
-        cso.orderNo,
-        cso.shopID AS shopId,
-        cso.note,
-        cso.userID AS userId,
-        (select clubID from cm_order where orderId = cso.orderId ) as clubId,
-        cso.spID AS spId,
-        ifnull(cso.presentNum, 0) as presentNum,
-        cso.orderPromotionsId,
-        cso.promotionFullReduction,
-        cso.svipShopReduction,
-        cso.brokerage,
-        cso.canRefundAmount,
-        cso.itemCount,
-        cso.totalAmount,
-        cso.productAmount,
-        cso.needPayAmount,
-        ifnull(cso.accountAmount,0) as accountAmount,
-        cso.shopProductAmount,
-        ifnull(cso.shopPostFee, 0) as shopPostFee,
-        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
-        cso.shopTaxFee,
-        cso.shouldPayShopAmount,
-        (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
-        cso.orderTime,
-        cso.payStatus,
-        cso.orderSubmitType,
-        cso.splitFlag,
-        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
-        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
-        (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
-        s.name AS shopName,
-        ifnull(s.payway, 0) AS payway,
-        s.logo AS shopLogo,
-        s.shopType AS shopType,
-        IFNULL(cso.receiptAmount,0) AS receiptAmount,
-        cso.eachDiscount,
-        IFNULL(cso.realPay, cso.needPayAmount) AS realPay,
-        ifnull(cso.receiptStatus, 1) as receiptStatus,
-        ifnull(cso.orderStatusFlag, 1) as orderStatusFlag,
-        ifnull(cso.refundStatus, 1) as refundStatus,
-        cso.shopStatus as status,
-        cso.couponAmount
+        SELECT cso.shopOrderID                                                        AS shopOrderId,
+               cso.shopOrderNo,
+               cso.orderID                                                            AS orderId,
+               cso.orderType,
+               IFNULL(cso.organizeID, 0)                                              AS organizeId,
+               IFNULL(cso.isColdChina, 0)                                             AS isColdChina,
+               cso.orderNo,
+               cso.shopID                                                             AS shopId,
+               cso.note,
+               cso.userID                                                             AS userId,
+               (select clubID from cm_order where orderId = cso.orderId)              as clubId,
+               cso.spID                                                               AS spId,
+               ifnull(cso.presentNum, 0)                                              as presentNum,
+               cso.orderPromotionsId,
+               cso.promotionFullReduction,
+               cso.svipShopReduction,
+               cso.brokerage,
+               cso.canRefundAmount,
+               cso.itemCount,
+               cso.totalAmount,
+               cso.productAmount,
+               cso.needPayAmount,
+               ifnull(cso.accountAmount, 0)                                           as accountAmount,
+               cso.shopProductAmount,
+               ifnull(cso.shopPostFee, 0)                                             as shopPostFee,
+               IFNULL(cso.shopPostFlag, 0)                                            AS shopPostFlag,
+               cso.shopTaxFee,
+               cso.shouldPayShopAmount,
+               (select userBeans from cm_order where orderId = cso.orderId)           as userBeans,
+               cso.orderTime,
+               cso.payStatus,
+               cso.orderSubmitType,
+               cso.splitFlag,
+               ifnull(cso.useBalanceFlag, 0)                                          as useBalanceFlag,
+               ifnull(cso.sendOutStatus, 1)                                           as sendOutStatus,
+               (select secondHandOrderFlag from cm_order where orderId = cso.orderId) as secondHandOrderFlag,
+               s.name                                                                 AS shopName,
+               ifnull(s.payway, 0)                                                    AS payway,
+               s.logo                                                                 AS shopLogo,
+               s.shopType                                                             AS shopType,
+               IFNULL(cso.receiptAmount, 0)                                           AS receiptAmount,
+               cso.eachDiscount,
+               IFNULL(cso.realPay, cso.needPayAmount)                                 AS realPay,
+               ifnull(cso.receiptStatus, 1)                                           as receiptStatus,
+               ifnull(cso.orderStatusFlag, 1)                                         as orderStatusFlag,
+               ifnull(cso.refundStatus, 1)                                            as refundStatus,
+               cso.shopStatus                                                         as status,
+               cso.couponAmount
         FROM cm_shop_order cso
         FROM cm_shop_order cso
-        LEFT JOIN shop s ON cso.shopID = s.shopID
-        where cso.delFlag = 0 AND cso.shopOrderId = #{shopOrderId}
+                 LEFT JOIN shop s ON cso.shopID = s.shopID
+        where cso.delFlag = 0
+          AND cso.shopOrderId = #{shopOrderId}
     </select>
     </select>
     <select id="getOrderByShopOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
     <select id="getOrderByShopOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT co.orderID      AS orderId,
         SELECT co.orderID      AS orderId,
@@ -634,15 +646,15 @@
         WHERE cso.shopOrderID = #{shopOrderId}
         WHERE cso.shopOrderID = #{shopOrderId}
     </select>
     </select>
     <select id="getShopOrderListByOrderId" resultType="com.caimei365.order.model.vo.ShopOrderVo">
     <select id="getShopOrderListByOrderId" resultType="com.caimei365.order.model.vo.ShopOrderVo">
-        SELECT shopOrderID AS shopOrderId,
+        SELECT shopOrderID              AS shopOrderId,
                shopOrderNo,
                shopOrderNo,
-               orderID     AS orderId,
+               orderID                  AS orderId,
                orderNo,
                orderNo,
-               shopID      AS shopId,
+               shopID                   AS shopId,
                note,
                note,
-               userID      AS userId,
-               clubID      AS clubId,
-               spID        AS spId,
+               userID                   AS userId,
+               clubID                   AS clubId,
+               spID                     AS spId,
                orderPromotionsId,
                orderPromotionsId,
                promotionFullReduction,
                promotionFullReduction,
                brokerage,
                brokerage,
@@ -652,7 +664,7 @@
                productAmount,
                productAmount,
                needPayAmount,
                needPayAmount,
                shopProductAmount,
                shopProductAmount,
-               ifnull(shopPostFee, 0) as shopPostFee,
+               ifnull(shopPostFee, 0)   as shopPostFee,
                shopTaxFee,
                shopTaxFee,
                shouldPayShopAmount,
                shouldPayShopAmount,
                orderTime,
                orderTime,
@@ -794,7 +806,7 @@
                cc.shopId,
                cc.shopId,
                cc.productType,
                cc.productType,
                cc.categoryType,
                cc.categoryType,
-               cc.name as "couponName",
+               cc.name                                               as "couponName",
                cc.couponPayWay,
                cc.couponPayWay,
                cc.couponText,
                cc.couponText,
                cc.couponTextFlag
                cc.couponTextFlag
@@ -879,16 +891,16 @@
         ORDER BY cdr.receiptDate DESC
         ORDER BY cdr.receiptDate DESC
     </select>
     </select>
     <select id="getShopOrderByOrderId" resultType="com.caimei365.order.model.vo.ShopOrderVo">
     <select id="getShopOrderByOrderId" resultType="com.caimei365.order.model.vo.ShopOrderVo">
-        SELECT cop.shopOrderID                  AS shopOrderId,
+        SELECT cop.shopOrderID                        AS shopOrderId,
                cop.shopOrderNo,
                cop.shopOrderNo,
-               cop.orderID                      AS orderId,
-               cop.organizeID                   as organizeId,
+               cop.orderID                            AS orderId,
+               cop.organizeID                         as organizeId,
                cop.orderNo,
                cop.orderNo,
-               cop.shopID                       AS shopId,
+               cop.shopID                             AS shopId,
                cop.note,
                cop.note,
-               cop.userID                       AS userId,
-               cop.clubID                       AS clubId,
-               cop.spID                         AS spId,
+               cop.userID                             AS userId,
+               cop.clubID                             AS clubId,
+               cop.spID                               AS spId,
                cop.orderPromotionsId,
                cop.orderPromotionsId,
                cop.promotionFullReduction,
                cop.promotionFullReduction,
                cop.brokerage,
                cop.brokerage,
@@ -898,24 +910,24 @@
                cop.productAmount,
                cop.productAmount,
                cop.needPayAmount,
                cop.needPayAmount,
                cop.shopProductAmount,
                cop.shopProductAmount,
-               ifnull(cop.shopPostFee, 0) as shopPostFee,
+               ifnull(cop.shopPostFee, 0)             as shopPostFee,
                cop.shopTaxFee,
                cop.shopTaxFee,
                cop.shouldPayShopAmount,
                cop.shouldPayShopAmount,
                cop.orderTime,
                cop.orderTime,
                cop.orderSubmitType,
                cop.orderSubmitType,
                cop.payStatus,
                cop.payStatus,
                cop.splitFlag,
                cop.splitFlag,
-               ifnull(cop.accountAmount, 0) as accountAmount,
-               ifnull(cop.useBalanceFlag, 0) as useBalanceFlag,
+               ifnull(cop.accountAmount, 0)           as accountAmount,
+               ifnull(cop.useBalanceFlag, 0)          as useBalanceFlag,
                ifnull(cop.realPay, cop.needPayAmount) as realPay,
                ifnull(cop.realPay, cop.needPayAmount) as realPay,
                cop.receiptAmount,
                cop.receiptAmount,
-               ifnull(cop.sendOutStatus, 1) as sendOutStatus,
-               ifnull(cop.receiptStatus, 1) as receiptStatus,
+               ifnull(cop.sendOutStatus, 1)           as sendOutStatus,
+               ifnull(cop.receiptStatus, 1)           as receiptStatus,
                cop.splitCode,
                cop.splitCode,
-               ifnull(cop.paySuccessCounter, 0) as paySuccessCounter,
-               p.name                           as shopName,
-               ifnull(p.payway, 0) AS payway,
-               cop.shopStatus as status
+               ifnull(cop.paySuccessCounter, 0)       as paySuccessCounter,
+               p.name                                 as shopName,
+               ifnull(p.payway, 0)                    AS payway,
+               cop.shopStatus                         as status
         FROM cm_shop_order cop
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID
                  left join shop p on cop.shopID = p.shopID
         WHERE delFlag = 0
         WHERE delFlag = 0

+ 1 - 1
src/main/resources/mapper/PayOrderMapper.xml

@@ -305,7 +305,7 @@
         delFlag
         delFlag
         FROM
         FROM
         cm_order_pay_link
         cm_order_pay_link
-        WHERE shopOrderId = #{orderId}
+        WHERE shopOrderId = #{shopOrderId}
         <if test="amount != null">
         <if test="amount != null">
             AND unpaidAmount = #{amount}
             AND unpaidAmount = #{amount}
         </if>
         </if>