Browse Source

支付修改

liweifan 2 years ago
parent
commit
1418b1ff49
24 changed files with 314 additions and 131 deletions
  1. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  2. 33 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  3. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  4. 19 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  5. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  6. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  7. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  8. 2 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  9. 63 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  10. 4 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  11. 27 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  12. 10 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderPayRes.java
  13. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  14. 19 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  15. 5 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml
  16. 57 36
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  17. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  18. 4 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  19. 2 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PayChannelEnum.java
  20. 2 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  21. 5 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java
  22. 1 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/util/PaywayUtil.java
  23. 8 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  24. 13 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java

@@ -80,4 +80,13 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrder>
 	 */
     List<UserOrder> selectUnRecordTimeOrder(@Param("param") OrderSearch param);
+
+	/**
+	 * 通过付款单号或三方交易号查询对应订单
+	 * @param paymentNo
+	 * @param transNo
+	 * @return
+	 */
+    UserOrderVo getUserOrderByPaymentNoOrTransNo(@Param("paymentNo") String paymentNo,
+												 @Param("transNo") String transNo);
 }

+ 33 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -2,8 +2,10 @@ package com.yonge.cooleshow.biz.dal.dto.req;
 
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -18,8 +20,10 @@ import java.util.List;
  */
 @ApiModel(value = "OrderReq对象", description = "下单请求")
 public class OrderReq {
-    @ApiModelProperty(value = "用户id ")
+    @ApiModelProperty(value = "用户id ",hidden = true)
     private Long userId;
+    @ApiModelProperty(value = "订单号", hidden = true)
+    private String orderNo;
     @NotBlank(message = "订单名称不能为空")
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
@@ -41,8 +45,12 @@ public class OrderReq {
 
     @ApiModel(value = "OrderReqInfo对象", description = "下单请求业务详情对象")
     public class OrderReqInfo {
+        @ApiModelProperty(value = "y用户id", hidden = true)
         private Long userId;
+        @ApiModelProperty(value = "订单号", hidden = true)
         private String orderNo;
+        @ApiModelProperty(value = "订单详情号", hidden = true)
+        private String subOrderNo;
         @NotNull(message = "商品类型不能为空")
         @ApiModelProperty(value = "商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ", required = true)
         private GoodTypeEnum goodType;
@@ -52,6 +60,8 @@ public class OrderReq {
         private Long couponId;
         @ApiModelProperty(value = "业务内容")
         private Object bizContent;
+        @ApiModelProperty(value = "调用业务创建方法返回", hidden = true)
+        private OrderCreateRes createRes;
 
         public Long getUserId() {
             return userId;
@@ -100,6 +110,22 @@ public class OrderReq {
         public void setCouponId(Long couponId) {
             this.couponId = couponId;
         }
+
+        public String getSubOrderNo() {
+            return subOrderNo;
+        }
+
+        public void setSubOrderNo(String subOrderNo) {
+            this.subOrderNo = subOrderNo;
+        }
+
+        public OrderCreateRes getCreateRes() {
+            return createRes;
+        }
+
+        public void setCreateRes(OrderCreateRes createRes) {
+            this.createRes = createRes;
+        }
     }
 
     public Long getUserId() {
@@ -166,5 +192,11 @@ public class OrderReq {
         this.actualPrice = actualPrice;
     }
 
+    public String getOrderNo() {
+        return orderNo;
+    }
 
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -26,6 +26,9 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("订单号 ")
 	@TableField(value = "order_no_")
     private String orderNo;
+    @ApiModelProperty("订单详情号 ")
+    @TableField(value = "sub_order_no_")
+    private String subOrderNo;
     @ApiModelProperty("卖家id ")
     @TableField(value = "merch_id_")
     private Long merchId;
@@ -94,6 +97,14 @@ public class UserOrderDetail implements Serializable {
         this.orderNo = orderNo;
     }
 
+    public String getSubOrderNo() {
+        return subOrderNo;
+    }
+
+    public void setSubOrderNo(String subOrderNo) {
+        this.subOrderNo = subOrderNo;
+    }
+
     public Long getMerchId() {
         return merchId;
     }

+ 19 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java

@@ -25,9 +25,12 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("用户id ")
 	@TableField(value = "user_id_")
     private Long userId;
-    @ApiModelProperty("订单id ")
-	@TableField(value = "order_id_")
-    private Long orderId;
+    @ApiModelProperty("订单号 ")
+	@TableField(value = "order_no_")
+    private String orderNo;
+    @ApiModelProperty("订单详情号 ")
+    @TableField(value = "sub_order_no_")
+    private String subOrderNo;
     @ApiModelProperty("会员卡id ")
 	@TableField(value = "vip_card_id_")
     private Long vipCardId;
@@ -74,13 +77,21 @@ public class VipCardRecord implements Serializable {
     public void setUserId(Long userId) {
         this.userId = userId;
     }
-    
-	public Long getOrderId() {
-        return orderId;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getSubOrderNo() {
+        return subOrderNo;
     }
 
-    public void setOrderId(Long orderId) {
-        this.orderId = orderId;
+    public void setSubOrderNo(String subOrderNo) {
+        this.subOrderNo = subOrderNo;
     }
 
     public Long getVipCardId() {

+ 10 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -36,7 +36,6 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment detailByTransNoOrPaymentNo(String transNo, String paymentNo);
-
     /***
      * 关闭付款单
      * @author liweifan
@@ -45,7 +44,16 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @updateTime 2022/5/6 14:49
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
-    UserOrderPayment closePayment(String orderNo, String reason);
+    UserOrderPayment onlyClosePayment(String orderNo, String reason);
+    /***
+     * 关闭付款单
+     * @author liweifan
+     * @param: orderNo
+     * @param: reason
+     * @updateTime 2022/5/6 14:49
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment closePaymentAndReqOpen(String orderNo, String reason);
 
 
     /***

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -57,7 +57,6 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 */
 	HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason);
 
-
 	/**
 	 * 退款回调
 	 * @param data

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -101,6 +101,14 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     UserOrderVo detailApp(UserOrder param);
 
+    /**
+     * 通过付款单号或三方交易号查询对应订单
+     * @param paymentNo
+     * @param transNo
+     * @return
+     */
+    UserOrderVo getUserOrderByPaymentNoOrTransNo(String paymentNo,String transNo);
+
     /***
      * 取消订单
      * @author liweifan

+ 2 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -85,7 +85,8 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         VipCardRecord vipCardRecord = new VipCardRecord();
         vipCardRecord.setUserId(orderDetailVo.getUserId());
-        vipCardRecord.setOrderId(orderDetailVo.getOrderId());
+        vipCardRecord.setOrderNo(orderDetailVo.getOrderNo());
+        vipCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
         vipCardRecord.setVipCardId(detail.getId());
         vipCardRecord.setMsgStatus(0);
 
@@ -122,8 +123,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     }
 
 
-
-
     // 发送会员购买消息推送
     private void authSend(Long userId, String phone, String param1) {
         Map<Long, String> receivers = new HashMap<>();

+ 63 - 40
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
@@ -65,37 +66,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         }
     }
 
-
-    /***
-     * 入订单付款表
-     * @author liweifan
-     * @param: paymentRes
-     * @param: payReq
-     * @updateTime 2022/5/11 18:47
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    private UserOrderPayment insertOrderPayment(Payment payment) {
-        UserOrderPayment orderPayment = new UserOrderPayment();
-        orderPayment.setOpenType(payment.getOpenType());
-        orderPayment.setPayChannel(payment.getPayChannel());
-        orderPayment.setOrderNo(payment.getOrderNo());
-        orderPayment.setPaymentNo(payment.getPaymentNo());
-        orderPayment.setTransNo(payment.getId());
-        orderPayment.setPayAmt(
-                new BigDecimal(payment.getPayAmt()).setScale(2, RoundingMode.HALF_UP)
-        );
-        orderPayment.setPayInfo(payment.getPayInfo());
-        orderPayment.setStatus(TradeStatusEnum.pending);
-
-        //查询订单下支付中的付款单,取消支付
-        closePayment(payment.getOrderNo(), "用户发起了新的付款请求");
-        //保存新的付款单
-        save(orderPayment);
-        return orderPayment;
-    }
-
     @Override
-    public UserOrderPayment closePayment(String orderNo, String reason) {
+    public UserOrderPayment onlyClosePayment(String orderNo, String reason) {
         UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderNo)
                 .eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));
@@ -108,10 +80,23 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
         orderPayment.setUpdateTime(new Date());
 
+        updateById(orderPayment);
+        return orderPayment;
+    }
+
+
+    @Override
+    public UserOrderPayment closePaymentAndReqOpen(String orderNo, String reason) {
+        UserOrderPayment orderPayment = onlyClosePayment(orderNo, reason);
+        if (null == orderPayment) {
+            return orderPayment;
+        }
         //发送支付关单请求
-        if (!StringUtil.isEmpty(orderPayment.getTransNo())) {
+        if (!StringUtil.isEmpty(orderPayment.getTransNo())
+                || !StringUtil.isEmpty(orderPayment.getPaymentNo())) {
             ClosePayment param = new ClosePayment(orderPayment.getOpenType(), orderPayment.getPayChannel());
             param.setId(orderPayment.getTransNo());
+            param.setPaymentNo(orderPayment.getPaymentNo());
             param.setReason(reason);
 
             try {
@@ -130,7 +115,6 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
                 e.printStackTrace();
             }
         }
-        updateById(orderPayment);
         return orderPayment;
     }
 
@@ -186,6 +170,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             String pay_info = paymentResBaseResult.getData().getPayInfo();
             orderPayRes.setPay_info(pay_info);
             orderPayRes.setPayChannel(payReq.getPayChannel());
+            orderPayRes.setPaymentNo(payment.getPaymentNo());
 
             //入订单付款表
             insertOrderPayment(paymentResBaseResult.getData());
@@ -202,24 +187,60 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
 
     @Override
     public void executePaymentCallBack(PaymentCallBack data) {
-        if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
-            paymentSucceededHandle(data);
-        } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
-            paymentFailedHandle(data, data.getErrMsg());
+        UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
+        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus())
+                || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
+            if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
+                paymentSucceededHandle(data);
+            } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
+                paymentFailedHandle(data, data.getErrMsg());
+            }
         }
     }
 
     @Override
     public void closePaymentCallBack(PaymentCallBack data) {
-        if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
-            paymentCloseSucceededHandle(data);
-        } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
-            paymentCloseFailedHandle(data);
+        UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
+        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus())
+                || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
+            if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
+                paymentCloseSucceededHandle(data);
+            } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
+                paymentCloseFailedHandle(data);
+            }
         }
     }
 
 
     /***
+     * 入订单付款表
+     * @author liweifan
+     * @param: paymentRes
+     * @param: payReq
+     * @updateTime 2022/5/11 18:47
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    private UserOrderPayment insertOrderPayment(Payment payment) {
+        UserOrderPayment orderPayment = new UserOrderPayment();
+        orderPayment.setOpenType(payment.getOpenType());
+        orderPayment.setPayChannel(payment.getPayChannel());
+        orderPayment.setOrderNo(payment.getOrderNo());
+        orderPayment.setPaymentNo(payment.getPaymentNo());
+        orderPayment.setTransNo(payment.getId());
+        orderPayment.setPayAmt(
+                new BigDecimal(payment.getPayAmt()).setScale(2, RoundingMode.HALF_UP)
+        );
+        orderPayment.setPayInfo(payment.getPayInfo());
+        orderPayment.setStatus(TradeStatusEnum.pending);
+
+        //查询订单下支付中的付款单,取消支付
+        closePaymentAndReqOpen(payment.getOrderNo(), "用户发起了新的付款请求");
+        //保存新的付款单
+        save(orderPayment);
+        return orderPayment;
+    }
+
+    /***
      * 处理回调-支付成功
      * @author liweifan
      * @param: data
@@ -263,6 +284,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
                 || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败:" + errMsg);
+            //关闭付款单
+            onlyClosePayment(detail.getOrderNo(), "支付回调失败:" + errMsg);
         }
     }
 

+ 4 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -209,9 +209,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (!OrderStatusEnum.PAID.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单状态异常");
         }
-        if (StringUtil.isEmpty(detail.getTransNo())) {
-            return HttpResponseResult.failed("未找到订单付款信息");
-        }
 
         UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
@@ -314,7 +311,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         return HttpResponseResult.status(refundBillBaseResult);
     }
 
-
     /***
      * 处理回调-退款成功
      * @author liweifan
@@ -328,8 +324,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 wrapper -> wrapper.eq(UserOrderRefundBill::getTransNo, refundPaymentCallBack.getTransNo())
                         .or().eq(UserOrderRefundBill::getBillNo, refundPaymentCallBack.getBillNo())
         ));
-
-        if (null == one) {
+        //未找到退款单的和已经退款的不能再进行退款
+        if (null == one || !TradeStatusEnum.pending.equals(one.getStatus())) {
             return;
         }
         one.setTransNo(refundPaymentCallBack.getTransNo());
@@ -374,7 +370,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                         .or().eq(UserOrderRefundBill::getBillNo, refundPaymentCallBack.getBillNo())
         ));
 
-        if (null == one) {
+        //未找到退款单的和已经退款的不能再进行退款
+        if (null == one || !TradeStatusEnum.pending.equals(one.getStatus())) {
             return;
         }
         one.setTransNo(refundPaymentCallBack.getTransNo());

+ 27 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -167,6 +167,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public UserOrderVo getUserOrderByPaymentNoOrTransNo(String paymentNo, String transNo) {
+        return baseMapper.getUserOrderByPaymentNoOrTransNo(paymentNo,transNo);
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
         UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
@@ -189,7 +194,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 return HttpResponseResult.failed("订单已经交易完成");
             }
             //关闭订单付款单
-            orderPaymentService.closePayment(payReq.getOrderNo(), StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
+            orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         }
         //关闭订单
         doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
@@ -252,17 +257,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         long start = System.currentTimeMillis();
         log.info("订单[创建订单] Req:{}", JSONObject.toJSONString(orderReq));
         //订单号生成
-        Long orderNo = idGeneratorService.generatorId("userOrder");
+        Long orderNo = idGeneratorService.generatorId("orderNo");
+        orderReq.setOrderNo(Long.toString(orderNo));
         //验证参数,必须验证参数
-        List<OrderCreateRes> resList = new ArrayList<>();
         for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
             Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>> createFunction = orderCreate.get(info.getGoodType());
             if (Objects.isNull(createFunction)) {
                 return HttpResponseResult.failed("订单商品信息获取失败");
             }
+            info.setOrderNo(orderReq.getOrderNo());
+            Long subOrderNo = idGeneratorService.generatorId("subOrderNo");
+            info.setSubOrderNo(Long.toString(subOrderNo));
 
-
-            info.setOrderNo(Long.toString(orderNo));
             info.setUserId(orderReq.getUserId());
             HttpResponseResult<OrderCreateRes> createResult = createFunction.apply(info);
             OrderCreateRes createRes = createResult.getData();
@@ -275,11 +281,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             BigDecimal couponAmount = BigDecimal.ZERO;
             createRes.setActualPrice(createRes.getExpectPrice().subtract(couponAmount).setScale(2, RoundingMode.HALF_UP));
             createRes.setCouponAmount(couponAmount);
-            resList.add(createRes);
+
+            info.setCreateRes(createRes);
         }
 
         //验证成功后,订单入库
-        UserOrderVo orderVo = insertOrder(orderNo, orderReq, resList);
+        UserOrderVo orderVo = insertOrder(orderReq);
 
         List<UserOrderDetailVo> orderDetailList = orderVo.getOrderDetailList();
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
@@ -373,7 +380,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //关闭订单
         doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
         //关闭订单付款单
-        orderPaymentService.closePayment(orderNo, "订单超时");
+        orderPaymentService.closePaymentAndReqOpen(orderNo, "订单超时");
     }
 
     private HttpResponseResult<OrderPayRes> doOrderPay(OrderPayReq payReq, UserOrderVo detail) throws Exception {
@@ -384,6 +391,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
             orderPayRes.setPay_info(orderPayment.getPayInfo());
             orderPayRes.setPayChannel(orderPayment.getPayChannel());
+            orderPayRes.setPaymentNo(orderPayment.getPaymentNo());
             return HttpResponseResult.succeed(orderPayRes);
         }
         return orderPaymentService.createOrderPayment(payReq, detail);
@@ -396,10 +404,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:15
      * @return: com.yonge.cooleshow.biz.dal.entity.Order
      */
-    private UserOrderVo insertOrder(Long orderNo, OrderReq orderReq, List<OrderCreateRes> resList) throws Exception {
+    private UserOrderVo insertOrder(OrderReq orderReq) throws Exception {
         UserOrder userOrder = new UserOrder();
 
-        userOrder.setOrderNo(Long.toString(orderNo));
+        userOrder.setOrderNo(orderReq.getOrderNo());
         userOrder.setUserId(orderReq.getUserId());
         userOrder.setOrderName(orderReq.getOrderName());
         userOrder.setOrderType(orderReq.getOrderType());
@@ -421,10 +429,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setCouponAmount(BigDecimal.ZERO);
         userOrder.setPlantformFee(BigDecimal.ZERO);
         List<UserOrderDetailVo> orderDetailList = new ArrayList<>();
-        for (OrderCreateRes res : resList) {
+        for (OrderReq.OrderReqInfo data : orderReq.getOrderInfos()) {
+            OrderCreateRes res = data.getCreateRes();
 
             UserOrderDetailVo orderDetail = new UserOrderDetailVo();
-            orderDetail.setOrderNo(userOrder.getOrderNo());
+            orderDetail.setOrderNo(data.getOrderNo());
+            orderDetail.setSubOrderNo(data.getSubOrderNo());
             orderDetail.setMerchId(res.getMerchId());
             orderDetail.setGoodType(res.getGoodType());
             orderDetail.setBizId(res.getBizId());
@@ -633,10 +643,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (!Objects.isNull(userOrderVoConsumer)) {
                 userOrderVoConsumer.accept(orderDetailVo);
             }
+            Long merchId = orderDetailVo.getMerchId();
+            if (null != merchId) {
+                redissonClient.getBucket(CacheNameEnum.TEACHER_SUBJECT_ITEM.getRedisKey(merchId)).delete();
+            }
         }
 
         //清除老师声部缓存
         redissonClient.getBucket(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(detail.getUserId())).delete();
+
     }
 
 }

+ 10 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderPayRes.java

@@ -10,14 +10,22 @@ import io.swagger.annotations.ApiModelProperty;
  */
 @ApiModel(value = "OrderPayRes", description = "订单支付请求返回对象")
 public class OrderPayRes {
+    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ")
+    private PayChannelEnum payChannel;
+    @ApiModelProperty("支付单号")
+    private String paymentNo;
     @ApiModelProperty("支付金额")
     private String pay_amt;
     @ApiModelProperty("pay_info")
     private String pay_info;
 
+    public String getPaymentNo() {
+        return paymentNo;
+    }
 
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ")
-    private PayChannelEnum payChannel;
+    public void setPaymentNo(String paymentNo) {
+        this.paymentNo = paymentNo;
+    }
 
     public String getPay_amt() {
         return pay_amt;

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -4,6 +4,7 @@
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrderDetail">
             <result column="id_" property="id" />
 	        <result column="order_no_" property="orderNo" />
+            <result column="sub_order_no_" property="subOrderNo" />
             <result column="merch_id_" property="merchId" />
             <result column="good_type_" property="goodType" />
             <result column="biz_id_" property="bizId" />
@@ -26,6 +27,7 @@
     <sql id="baseColumns">
          t.id_ as id
         , t.order_no_ as orderNo
+        , t.sub_order_no_ as subOrderNo
         , t.merch_id_ as merchId
         , t.good_type_ as goodType
         , t.biz_id_ as bizId

+ 19 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -162,7 +162,9 @@
     </select>
 
     <select id="selectPendingList" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
-        SELECT t.* FROM user_order t
+        SELECT
+            <include refid="baseColumns"/>
+        FROM user_order t
         <where>
             <if test="null != param.status and '' != param.status">
                 AND t.status_ = #{param.status}
@@ -216,6 +218,22 @@
             <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
         </if>
     </select>
+    <select id="getUserOrderByPaymentNoOrTransNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM user_order t
+        left join user_order_payment p on t.order_no_ = p.order_no_
+        <where>
+            <choose>
+                <when test="paymentNo != null and paymentNo != ''">
+                    and p.payment_no_ = #{paymentNo}
+                </when>
+                <otherwise>
+                    and p.trans_no_ = #{transNo}
+                </otherwise>
+            </choose>
+        </where>
+    </select>
 
     <update id="updateStatusByOrderNo">
         update user_order set status_ = #{orderStatus},update_time_ = now() where order_no_ = #{orderNo}

+ 5 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

@@ -4,8 +4,9 @@
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.VipCardRecord">
             <result column="id_" property="id" />
 	        <result column="user_id_" property="userId" />
-	        <result column="order_id_" property="orderId" />
-	        <result column="vip_card_id_" property="vipCardId" />
+	        <result column="order_no_" property="orderNo" />
+            <result column="sub_order_no_" property="subOrderNo" />
+            <result column="vip_card_id_" property="vipCardId" />
 	        <result column="start_time_" property="startTime" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
@@ -17,7 +18,8 @@
     <sql id="baseColumns">
          t.id_ as id
         , t.user_id_ as userId
-        , t.order_id_ as orderId
+        , t.order_no_ as orderNo
+        , t.sub_order_no_ as subOrderNo
         , t.vip_card_id_ as vipCardId
         , t.start_time_ as startTime
         , t.create_time_ as createTime

+ 57 - 36
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -9,12 +9,17 @@ import com.huifu.adapay.core.util.AdapaySign;
 import com.huifu.adapay.core.util.StringUtil;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
@@ -29,14 +34,17 @@ import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
 import com.yonge.toolset.utils.web.WebUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liweifan
@@ -54,17 +62,17 @@ public class PaymentController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
-    private PaymentClient paymentClient;
+    private UserOrderService userOrderService;
     @Autowired
-    private PaymentProperties paymentProperties;
+    private PaymentClient paymentClient;
     @Autowired
-    private SysConfigPaymentService configPaymentService;
+    private RedissonClient redissonClient;
     @Autowired
-    private WxPayService wxPayService;
+    private PaymentProperties paymentProperties;
 
     @ApiOperation(value = "查询付款单")
     @GetMapping("/queryPayment")
-    public HttpResponseResult<Payment> queryPayment(String paymentNo) throws Exception {
+    public HttpResponseResult<Payment> queryPayment(String paymentNo) {
         UserOrderPayment userOrderPayment = paymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getPaymentNo, paymentNo)
         );
@@ -103,46 +111,59 @@ public class PaymentController extends BaseController {
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
-    ) throws Exception {
+    ) {
+        log.info("支付回调:openType is {} ,payChannel is {},payMethod is {}", openType, payChannel, payMethod);
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
                 OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
-        if(res.getStatus()){
+        if (res.getStatus()) {
             PaymentCallBack data = res.getData();
-
-            if(MethodNameEnum.executePayment.equals(data.getMethodName())){
-                //支付交易
-                paymentService.executePaymentCallBack(data);
-            }else if(MethodNameEnum.closePayment.equals(data.getMethodName())){
-                //关闭订单
-                paymentService.closePaymentCallBack(data);
-            }else if(MethodNameEnum.refundPayment.equals(data.getMethodName())){
-                //退款
-                userOrderRefundService.refundPaymentCallBack(data);
+            //查询到订单
+            UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
+            if(null == userOrderVo){
+                return res.getData().getResMsg();
+            }
+            try {
+                DistributedLock.of(redissonClient)
+                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(userOrderVo.getUserId())
+                                , () -> {
+                                    if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
+                                        //支付交易
+                                        paymentService.executePaymentCallBack(data);
+                                    } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
+                                        //关闭订单
+                                        paymentService.closePaymentCallBack(data);
+                                    } else if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
+                                        //退款
+                                        userOrderRefundService.refundPaymentCallBack(data);
+                                    }
+                                }, 60L, TimeUnit.SECONDS);
+            } catch (BizException e) {
+                log.error("回调业务异常,msg is {}", e.getMessage());
+            } catch (Exception e) {
+                e.printStackTrace();
             }
         }
         return res.getData().getResMsg();
     }
 
 
-
-    private Object wxAppCallbackHandle(String payMethod, HttpServletRequest request) throws Exception {
-        String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
-
-        //支付回调
-        if ("executePayment".equals(payMethod)) {
-            SignatureHeader header = new SignatureHeader();
-            header.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
-            header.setNonce(request.getHeader("Wechatpay-Nonce"));
-            header.setSerial(request.getHeader("Wechatpay-Serial"));
-            header.setSignature(request.getHeader("Wechatpay-Signature"));
-
-            String params = WebUtil.getBodyData(request);
-
-            WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, header);
-
+    /***
+     * 支付回调
+     * @author liweifan
+     * @param: request
+     * @updateTime 2022/3/11 18:35
+     */
+    @PostMapping("/testCallback")
+    public void testCallback(@RequestBody PaymentCallBack data) {
+        if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
+            //支付交易
+            paymentService.executePaymentCallBack(data);
+        } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
+            //关闭订单
+            paymentService.closePaymentCallBack(data);
+        } else if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
+            //退款
+            userOrderRefundService.refundPaymentCallBack(data);
         }
-        return null;
     }
-
 }

+ 0 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -49,7 +49,6 @@ import java.util.concurrent.TimeUnit;
 @Api(value = "订单接口", tags = "订单接口")
 public class UserOrderController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(UserOrderController.class);
-
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired

+ 4 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java

@@ -116,6 +116,9 @@ public class AdapayTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
+        if(StringUtil.isEmpty(closePayment.getId())){
+            return BaseResult.failed("缺失渠道关单必要参数");
+        }
 
         Map<String, Object> paymentParams = new HashMap<>(10);
         paymentParams.put("payment_id", closePayment.getId());
@@ -141,7 +144,7 @@ public class AdapayTemplate implements PaymentTemplate {
             String errorMsg = (String) res.get("error_msg");
             return BaseResult.failed(errorMsg);
         }
-        closePayment.setStatus(TradeStatusEnum.getByName(res.get("status").toString()));
+        closePayment.setStatus(TradeStatusEnum.succeeded);
         return BaseResult.succeed(closePayment);
     }
 

+ 2 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PayChannelEnum.java

@@ -6,13 +6,13 @@ import com.yonge.toolset.base.enums.BaseEnum;
 /**
  * 支付渠道
  * 汇付支持 alipay、wx_lite
- * 原生支持 alipay_app、wx_app
+ * 原生支持 ali_app、wx_app
  * @author liweifan
  * @updateTime 2022/3/31 11:30
  */
 public enum PayChannelEnum implements BaseEnum<String, PayChannelEnum> {
     alipay("支付宝扫码"),
-    alipay_app("支付宝app"),
+    ali_app("支付宝app"),
 
     wx_app("微信app"),
     wx_lite("微信小程序支付"),

+ 2 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java

@@ -10,13 +10,13 @@ import com.yonge.toolset.payment.base.enums.PayChannelEnum;
  */
 public class ClosePayment extends Base {
     /***
-     * 三方支付流水号
+     * 三方支付流水号(原生渠道在支付时不会返回 三方支付流水号,只有在用户进行交易后,才会有流水号)
      * @author liweifan
      * @updateTime 2022/5/10 15:30
      */
     String id;
     /***
-     * 付款订单号
+     * 付款订单号 (汇付渠道,不支持使用 付款订单号 进行退款)
      * @author liweifan
      * @updateTime 2022/5/10 15:30
      */

+ 5 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java

@@ -1,5 +1,8 @@
 package com.yonge.toolset.payment.base.model.callback;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -25,6 +28,8 @@ public class ExecutePaymentCallBack implements Serializable {
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date tradeTime;
 
     public String getPayAmt() {

+ 1 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/util/PaywayUtil.java

@@ -22,7 +22,7 @@ public class PaywayUtil {
         //原生
         if (OpenEnum.ORIGINAL.equals(openType)) {
             //支付宝
-            if (PayChannelEnum.alipay_app.equals(payChannel)) {
+            if (PayChannelEnum.ali_app.equals(payChannel)) {
                 return (PaymentTemplate) SpringBeansUtil.getBean("originalAliAppTemplate");
             }
             //微信

+ 8 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -149,15 +149,19 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
+        if(StringUtil.isEmpty(closePayment.getPaymentNo())){
+            return BaseResult.failed("缺失渠道关单必要参数");
+        }
+
         AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
 
         JSONObject bizContent = new JSONObject();
-        bizContent.put("trade_no", closePayment.getId());
         bizContent.put("out_trade_no", closePayment.getPaymentNo());
 
         request.setBizContent(bizContent.toString());
         try {
             AlipayTradeCloseResponse response = alipayClient.execute(request);
+            closePayment.setStatus(TradeStatusEnum.succeeded);
             if (response.isSuccess()) {
                 return BaseResult.succeed(closePayment);
             } else {
@@ -208,9 +212,8 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
     public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         PaymentCallBack paymentCallBack = new PaymentCallBack();
         try {
-            JSONObject params = requestKitBean.getReqParamJSON();
-
-            JSONObject jsonParams = (JSONObject) params;
+            JSONObject jsonParams = requestKitBean.getReqParamJSON();
+            log.info("支付宝回调,data is {}", jsonParams.toJSONString());
 
             //获取验签方式 是否使用证书 YES NO
             String USE_CERT = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_USE_CERT).getParamValue();
@@ -231,7 +234,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
             }
 
             paymentCallBack.setId(jsonParams.getString("trade_no"));
-            paymentCallBack.setPaymentNo(params.getString("out_trade_no"));
+            paymentCallBack.setPaymentNo(jsonParams.getString("out_trade_no"));
 
             //获取订单所处交易状态
             String trade_status = jsonParams.getString("trade_status");

+ 13 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -1,5 +1,6 @@
 package com.yonge.toolset.payment.original.wx;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
@@ -100,8 +101,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
         try {
             Object orderV3 = wxPayService.createOrderV3(TradeTypeEnum.APP, request);
-            String prepayid = ObjectUtil.getFieldValueByFieldName("prepayid", orderV3);
-            payment.setPayInfo(StringUtil.get(prepayid));
+            payment.setPayInfo(JSONObject.toJSONString(orderV3));
 
             BaseResult<Payment> paymentBaseResult = queryPayment(payment);
             if (paymentBaseResult.getStatus()) {
@@ -154,6 +154,10 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
+        if(StringUtil.isEmpty(closePayment.getPaymentNo())){
+            return BaseResult.failed("缺失渠道关单必要参数");
+        }
+
         String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
 
         WxPayOrderCloseV3Request param = new WxPayOrderCloseV3Request();
@@ -162,6 +166,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
         try {
             wxPayService.closeOrderV3(param);
+            closePayment.setStatus(TradeStatusEnum.succeeded);
             return BaseResult.succeed(closePayment);
         } catch (WxPayException e) {
             log.error("微信APP支付关单请求失败:{}", e.toString());
@@ -220,6 +225,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         header.setSignature(request.getHeader("Wechatpay-Signature"));
 
         String params = WebUtil.getBodyData(request);
+        log.info("微信APP回调:{}", params);
+
 
         PaymentCallBack paymentCallBack = new PaymentCallBack();
         paymentCallBack.setMethodName(methodName);
@@ -228,6 +235,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         try {
             if (MethodNameEnum.executePayment.equals(methodName)) {
                 WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, header);
+                log.info("微信APP回调-支付请求:{}", JSONObject.toJSONString(wxPayOrderNotifyV3Result));
+
                 //封装支付回调对象
                 WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult();
                 paymentCallBack.setId(result.getTransactionId());
@@ -255,6 +264,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 paymentCallBack.setExecutePaymentCallBack(executePayment);
             } else if (MethodNameEnum.refundPayment.equals(methodName)) {
                 WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = wxPayService.parseRefundNotifyV3Result(params, header);
+                log.info("微信APP回调-退款请求:{}", JSONObject.toJSONString(wxPayRefundNotifyV3Result));
                 //封装退款回调对象
                 WxPayRefundNotifyV3Result.DecryptNotifyResult result = wxPayRefundNotifyV3Result.getResult();
                 paymentCallBack.setId(result.getTransactionId());
@@ -264,7 +274,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 if ("SUCCESS".equals(refundStatus)) {
                     paymentCallBack.setStatus(TradeStatusEnum.succeeded);
                 } else if ("CLOSED".equals(refundStatus)) {
-                    paymentCallBack.setStatus(TradeStatusEnum.close);
+                    paymentCallBack.setStatus(TradeStatusEnum.failed);
                     paymentCallBack.setErrMsg("退款关闭");
                 } else if ("ABNORMAL".equals(refundStatus)) {
                     paymentCallBack.setStatus(TradeStatusEnum.failed);