Browse Source

退款功能,支付回调

liweifan 2 years ago
parent
commit
2b4c315cd6
37 changed files with 1032 additions and 481 deletions
  1. 0 1
      cooleshow-user/pom.xml
  2. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOpenContractRecordDao.java
  3. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java
  4. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderDetailSearch.java
  5. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  6. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOpenContractRecord.java
  7. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  8. 7 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderRefundBill.java
  9. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  10. 0 43
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java
  11. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderDetailService.java
  12. 21 26
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  13. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java
  14. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  15. 8 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  16. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderDetailServiceImpl.java
  17. 122 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  18. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundBillServiceImpl.java
  19. 124 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  20. 18 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  21. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  22. 23 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  23. 35 55
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  24. 4 4
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/result/BaseResult.java
  25. 102 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  26. 17 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java
  27. 41 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/MethodNameEnum.java
  28. 12 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  29. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ClosePaymentCallBack.java
  30. 37 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java
  31. 128 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/PaymentCallBack.java
  32. 57 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/RefundPaymentCallBack.java
  33. 14 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java
  34. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java
  35. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  36. 51 213
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  37. 17 0
      toolset/utils/src/main/java/com/yonge/toolset/utils/web/WebUtil.java

+ 0 - 1
cooleshow-user/pom.xml

@@ -15,7 +15,6 @@
 	<packaging>pom</packaging>
 
 	<name>cooleshow-user</name>
-	<url>http://maven.apache.org</url>
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

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

@@ -0,0 +1,9 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.UserOpenContractRecord;
+
+
+public interface UserOpenContractRecordDao extends BaseMapper<UserOpenContractRecord>{
+
+}

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java

@@ -32,6 +32,8 @@ public interface UserOrderDetailDao extends BaseMapper<UserOrderDetail>{
      * @return: com.yonge.cooleshow.biz.dal.vo.OrderDetailVo
 	 */
 	List<UserOrderDetailVo> selectPage(@Param("page") IPage page, @Param("param") OrderDetailSearch orderDetail);
+
+	List<UserOrderDetailVo> selectList(@Param("param") OrderDetailSearch orderDetail);
 	/***
 	 * 通过订单号查询订单详情
 	 * @author liweifan

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderDetailSearch.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 
+import java.util.List;
+
 /**
  * @Author: liweifan
  * @Data: 2022-03-30 13:53:51
@@ -11,4 +13,24 @@ import io.swagger.annotations.ApiModel;
 public class OrderDetailSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+	private String orderNo;
+
+	private List<Long> ids;
+
+
+	public String getOrderNo() {
+		return orderNo;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public List<Long> getIds() {
+		return ids;
+	}
+
+	public void setIds(List<Long> ids) {
+		this.ids = ids;
+	}
 }

+ 1 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java

@@ -1,10 +1,8 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 

+ 102 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOpenContractRecord.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 用户签署三方协议记录表
+ */
+@TableName("user_open_contract_record")
+@ApiModel(value = "UserOpenContractRecord对象", description = "用户签署三方协议记录表")
+public class UserOpenContractRecord implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("用户id ")
+	@TableField(value = "user_id_")
+    private Long userId;
+    @ApiModelProperty("业务类型 lingxinpay 灵薪付 ")
+	@TableField(value = "biz_type_")
+    private String bizType;
+    @ApiModelProperty("协议地址 ")
+	@TableField(value = "url_")
+    private String url;
+    @ApiModelProperty("合同编号 ")
+	@TableField(value = "contract_no_")
+    private String contractNo;
+    @ApiModelProperty("备注 ")
+	@TableField(value = "remark_")
+    private String remark;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "created_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createdTime;
+
+	public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    
+	public String getBizType() {
+        return bizType;
+    }
+
+    public void setBizType(String bizType) {
+        this.bizType = bizType;
+    }
+    
+	public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+    
+	public String getContractNo() {
+        return contractNo;
+    }
+
+    public void setContractNo(String contractNo) {
+        this.contractNo = contractNo;
+    }
+    
+	public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+    
+	public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+    
+}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 

+ 7 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderRefundBill.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -24,7 +25,7 @@ public class UserOrderRefundBill implements Serializable {
     private Long id;
     @ApiModelProperty("退款申请单号 ")
 	@TableField(value = "refund_id_")
-    private String refundId;
+    private Long refundId;
     @ApiModelProperty("退款订单号 ")
 	@TableField(value = "bill_no_")
     private String billNo;
@@ -42,7 +43,7 @@ public class UserOrderRefundBill implements Serializable {
     private BigDecimal feeAmt;
     @ApiModelProperty("交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败 close 交易关闭 ")
 	@TableField(value = "status_")
-    private String status;
+    private TradeStatusEnum status;
     @ApiModelProperty("失败信息 ")
 	@TableField(value = "pay_fail_msg_")
     private String payFailMsg;
@@ -63,11 +64,11 @@ public class UserOrderRefundBill implements Serializable {
         this.id = id;
     }
     
-	public String getRefundId() {
+	public Long getRefundId() {
         return refundId;
     }
 
-    public void setRefundId(String refundId) {
+    public void setRefundId(Long refundId) {
         this.refundId = refundId;
     }
 
@@ -111,11 +112,11 @@ public class UserOrderRefundBill implements Serializable {
         this.feeAmt = feeAmt;
     }
     
-	public String getStatus() {
+	public TradeStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(TradeStatusEnum status) {
         this.status = status;
     }
     

+ 1 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java

@@ -4,8 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 

+ 0 - 43
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java

@@ -1,43 +0,0 @@
-package com.yonge.cooleshow.biz.dal.enums;
-
-import com.baomidou.mybatisplus.annotation.EnumValue;
-import com.yonge.toolset.base.enums.BaseEnum;
-
-/**
- * 交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败
- * @Author: liweifan
- * @Data: 2022/3/31 14:59
- */
-public enum TradeStatusEnum implements BaseEnum<String, TradeStatusEnum> {
-    pending("pending","交易处理中"),
-    succeeded("succeeded","交易成功"),
-    failed("failed","交易失败"),
-    //当用户更换支付渠道时,该订单其他支付渠道会交易关闭
-    close("close","交易关闭")
-    ;
-    @EnumValue
-    private String code;
-    private String msg;
-
-    TradeStatusEnum(String code, String msg) {
-        this.code = code;
-        this.msg = msg;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-
-    @Override
-    public String getCode() {
-        return this.code;
-    }
-}

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderDetailService.java

@@ -41,4 +41,11 @@ public interface UserOrderDetailService extends IService<UserOrderDetail>  {
  	 * @date 2022-03-30
      */
     IPage<UserOrderDetailVo> selectPage(IPage<UserOrderDetailVo> page, OrderDetailSearch query);
+
+	/**
+	 * 查询集合
+	 * @author liweifan
+	 * @date 2022-03-30
+	 */
+	List<UserOrderDetailVo> selectList(OrderDetailSearch query);
 }

+ 21 - 26
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -1,14 +1,14 @@
 package com.yonge.cooleshow.biz.dal.service;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 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.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 
 /**
  * 平台订单支付表 服务类
@@ -29,21 +29,14 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
     UserOrderPayment detailByOrderNo(String orderNo, PayChannelEnum payChannel, TradeStatusEnum status);
 
     /***
-     * 通过交易流水号查询付款单
+     * 通过交易流水号或付款订单号查询付款单
      * @author liweifan
      * @param: orderNo
      * @updateTime 2022/4/13 16:09
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
-    UserOrderPayment detailByTransNo(String transNo);
-    /***
-     * 通过汇付支付订单号查询付款单
-     * @author liweifan
-     * @param: orderNo
-     * @updateTime 2022/4/13 16:09
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    UserOrderPayment detailByPaymentNo(String paymentNo);
+    UserOrderPayment detailByTransNoOrPaymentNo(String transNo, String paymentNo);
+
     /***
      * 关闭付款单
      * @author liweifan
@@ -53,20 +46,8 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment closePayment(String orderNo, String reason);
-    /***
-     * 支付关单成功
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    void paymentCloseSucceededHandle(JSONObject hfRes);
-    /***
-     * 支付关单失败
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    void paymentCloseFailedHandle(JSONObject hfRes);
+
+
     /***
      * 创建付款单
      * @author liweifan
@@ -76,4 +57,18 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      */
     HttpResponseResult<OrderPayRes> createOrderPayment(OrderPayReq payReq, UserOrderVo detail) throws Exception;
 
+    /**
+     * 支付请求回调
+     * @param data
+     */
+    void executePaymentCallBack(PaymentCallBack data);
+
+    /**
+     * 关闭订单回调
+     * @param data
+     */
+    void closePaymentCallBack(PaymentCallBack data);
+
+
+
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundPaymentService.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java

@@ -11,7 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
  * @author liweifan
  * @date 2022-05-09
  */
-public interface UserOrderRefundPaymentService extends IService<UserOrderRefundBill>  {
+public interface UserOrderRefundBillService extends IService<UserOrderRefundBill>  {
 
 	/**
      * 查询详情

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 
 /**
  * 用户退款表 服务类
@@ -55,4 +56,11 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @return
 	 */
 	HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason);
+
+
+	/**
+	 * 退款回调
+	 * @param data
+	 */
+	void refundPaymentCallBack(PaymentCallBack data);
 }

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

@@ -11,7 +11,9 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -84,14 +86,6 @@ public interface UserOrderService extends IService<UserOrder> {
     HttpResponseResult<UserOrderVo> getPendingOrder(OrderSearch query);
 
     /***
-     * 用户付款回调
-     * @author liweifan
-     * @param: data
-     * @updateTime 2022/4/8 18:24
-     */
-    void adapayCallback(String data, String type);
-
-    /***
      * 轮询用户订单
      * @author liweifan
      * @updateTime 2022/4/13 16:27
@@ -157,4 +151,10 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     void setOrderStatus(String orderNo, OrderStatusEnum orderStatus);
 
+    /**
+     * 订单完成
+     * @param detail
+     */
+    @Transactional(rollbackFor = Exception.class)
+    void orderSuccess(UserOrderVo detail, PaymentCallBack data);
 }

+ 6 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderDetailServiceImpl.java

@@ -36,5 +36,10 @@ public class UserOrderDetailServiceImpl extends ServiceImpl<UserOrderDetailDao,
     public IPage<UserOrderDetailVo> selectPage(IPage<UserOrderDetailVo> page, OrderDetailSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
+    @Override
+    public List<UserOrderDetailVo> selectList(OrderDetailSearch query) {
+        return baseMapper.selectList(query);
+    }
+
 }

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

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -15,10 +14,14 @@ import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.*;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.utils.string.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
@@ -32,13 +35,15 @@ import java.util.*;
 
 @Service
 public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao, UserOrderPayment> implements UserOrderPaymentService {
+    private final static Logger log = LoggerFactory.getLogger(UserOrderPaymentServiceImpl.class);
+
     @Autowired
     private UserOrderService userOrderService;
     @Autowired
     private IdGeneratorService idGeneratorService;
     @Autowired
     private PaymentProperties paymentProperties;
-    @Autowired(required=true)
+    @Autowired(required = true)
     private PaymentClient paymentClient;
 
     @Override
@@ -50,16 +55,16 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     }
 
     @Override
-    public UserOrderPayment detailByTransNo(String transNo) {
-        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getTransNo, transNo));
+    public UserOrderPayment detailByTransNoOrPaymentNo(String transNo, String paymentNo) {
+        if (!StringUtil.isEmpty(transNo)) {
+            return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
+                    .eq(UserOrderPayment::getTransNo, transNo));
+        } else {
+            return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
+                    .eq(UserOrderPayment::getPaymentNo, paymentNo));
+        }
     }
 
-    @Override
-    public UserOrderPayment detailByPaymentNo(String paymentNo) {
-        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getPaymentNo, paymentNo));
-    }
 
     /***
      * 入订单付款表
@@ -115,7 +120,11 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
                     orderPayment.setCloseStatus(TradeStatusEnum.failed);
                     orderPayment.setCloseFailMsg(responseResult.getMsg());
                 } else {
-                    orderPayment.setCloseStatus(TradeStatusEnum.pending);
+                    if (responseResult.getData().getHasNotify()) {
+                        orderPayment.setCloseStatus(TradeStatusEnum.pending);
+                    } else {
+                        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
+                    }
                 }
             } catch (Exception e) {
                 e.printStackTrace();
@@ -125,29 +134,6 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         return orderPayment;
     }
 
-    @Override
-    public void paymentCloseSucceededHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
-        orderPayment.setUpdateTime(new Date());
-        updateById(orderPayment);
-    }
-
-
-    @Override
-    public void paymentCloseFailedHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setStatus(TradeStatusEnum.failed);
-        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
-        orderPayment.setUpdateTime(new Date());
-        updateById(orderPayment);
-    }
 
     @Override
     public HttpResponseResult<OrderPayRes> createOrderPayment(OrderPayReq payReq, UserOrderVo detail) throws Exception {
@@ -212,4 +198,106 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             return HttpResponseResult.failed(paymentResBaseResult.getMsg());
         }
     }
+
+
+    @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());
+        }
+    }
+
+    @Override
+    public void closePaymentCallBack(PaymentCallBack data) {
+        if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
+            paymentCloseSucceededHandle(data);
+        } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
+            paymentCloseFailedHandle(data);
+        }
+    }
+
+
+    /***
+     * 处理回调-支付成功
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentSucceededHandle(PaymentCallBack data) {
+        UserOrderPayment orderPayment = detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == orderPayment) {
+            log.error("支付回调,付款单未找到。 req is {}", JSONObject.toJSONString(data));
+            return;
+        }
+        //订单完成
+        UserOrderVo detail = userOrderService.detail(orderPayment.getOrderNo(), null);
+        if (null == detail) {
+            log.error("支付回调,订单未找到。 req is {}", JSONObject.toJSONString(data));
+            return;
+        }
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+            userOrderService.orderSuccess(detail, data);
+        }
+    }
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentFailedHandle(PaymentCallBack data, String errMsg) {
+        UserOrderPayment userOrderPayment = detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == userOrderPayment) {
+            log.error("支付回调,付款单未找到。 req is {}", JSONObject.toJSONString(data));
+            return;
+        }
+        UserOrderVo detail = userOrderService.detail(userOrderPayment.getOrderNo(), null);
+        if (null == detail) {
+            log.error("支付回调,订单未找到。 req is {}", JSONObject.toJSONString(data));
+            return;
+        }
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+            userOrderService.doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败:" + errMsg);
+        }
+    }
+
+    /***
+     * 处理回调-关单成功
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentCloseSucceededHandle(PaymentCallBack data) {
+        UserOrderPayment orderPayment = detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
+
+    /***
+     * 处理回调-关单失败
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentCloseFailedHandle(PaymentCallBack data) {
+        UserOrderPayment orderPayment = detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg("支付关单回调失败-" + data.getErrMsg());
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
+
+
 }

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundPaymentServiceImpl.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundBillServiceImpl.java

@@ -9,12 +9,12 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundBillVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundPaymentSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderRefundBillDao;
-import com.yonge.cooleshow.biz.dal.service.UserOrderRefundPaymentService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderRefundBillService;
 
 
 @Service
-public class UserOrderRefundPaymentServiceImpl extends ServiceImpl<UserOrderRefundBillDao, UserOrderRefundBill> implements UserOrderRefundPaymentService {
-    private final static Logger log = LoggerFactory.getLogger(UserOrderRefundPaymentServiceImpl.class);
+public class UserOrderRefundBillServiceImpl extends ServiceImpl<UserOrderRefundBillDao, UserOrderRefundBill> implements UserOrderRefundBillService {
+    private final static Logger log = LoggerFactory.getLogger(UserOrderRefundBillServiceImpl.class);
 
 	@Override
     public UserOrderRefundBillVo detail(Long id) {

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

@@ -8,14 +8,15 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderRefundDao;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
+import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
@@ -24,8 +25,10 @@ import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
-import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
+import com.yonge.toolset.payment.base.model.callback.RefundPaymentCallBack;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.utils.string.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,6 +49,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     @Autowired
     private UserOrderPaymentService orderPaymentService;
     @Autowired
+    private UserOrderRefundBillService refundBillService;
+    @Autowired
     private UserOrderDetailService orderDetailService;
     @Autowired
     private CourseGroupService courseGroupService;
@@ -53,8 +58,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private IdGeneratorService idGeneratorService;
     @Autowired
     private PaymentClient paymentClient;
-    @Autowired
-    private UserOrderRefundPaymentService refundPaymentService;
 
     //验证是否可以退款,获取退款金额信息
     private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
@@ -64,6 +67,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> refundSuccess = new HashMap<>();
     //退款未通过后执行
     private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> refundCancel = new HashMap<>();
+    //退款失败执行
+    private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> refundFailed = new HashMap<>();
 
     @PostConstruct
     private void init() {
@@ -98,7 +103,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (StringUtil.isEmpty(detail.getTransNo())) {
             return HttpResponseResult.failed("未找到订单付款信息");
         }
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(detail.getTransNo());
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
             return HttpResponseResult.failed("订单付款状态异常");
         }
@@ -208,7 +213,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             return HttpResponseResult.failed("未找到订单付款信息");
         }
 
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(detail.getTransNo());
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
             return HttpResponseResult.failed("订单付款状态异常");
         }
@@ -270,6 +275,16 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
     }
 
+
+    @Override
+    public void refundPaymentCallBack(PaymentCallBack data) {
+        if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//退款成功
+            paymentRefundSucceededHandle(data);
+        } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//退款失败
+            paymentRefundFailedHandle(data, data.getErrMsg());
+        }
+    }
+
     private HttpResponseResult<RefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())
@@ -286,6 +301,109 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         refundBill.setReason(orderRefund.getReason());
 
         BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundBill);
+
+        //入退款单表
+        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
+        orderRefundBill.setRefundId(orderRefund.getId());
+        orderRefundBill.setBillNo(billNo.toString());
+        if (refundBillBaseResult.getStatus()) {
+            orderRefundBill.setTransNo(refundBillBaseResult.getData().getId());
+        }
+        orderRefundBill.setRefundAmt(orderRefund.getActualAmount());
+        orderRefundBill.setStatus(TradeStatusEnum.pending);
+        refundBillService.save(orderRefundBill);
         return HttpResponseResult.status(refundBillBaseResult);
     }
+
+
+    /***
+     * 处理回调-退款成功
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentRefundSucceededHandle(PaymentCallBack data) {
+        RefundPaymentCallBack refundPaymentCallBack = data.getRefundPaymentCallBack();
+
+        UserOrderRefundBill one = refundBillService.getOne(Wrappers.<UserOrderRefundBill>lambdaQuery().and(
+                wrapper -> wrapper.eq(UserOrderRefundBill::getTransNo, refundPaymentCallBack.getTransNo())
+                        .or().eq(UserOrderRefundBill::getBillNo, refundPaymentCallBack.getBillNo())
+        ));
+
+        if (null == one) {
+            return;
+        }
+        one.setTransNo(refundPaymentCallBack.getTransNo());
+        one.setBackRefundAmt(new BigDecimal(refundPaymentCallBack.getRefundAmt()));
+        one.setStatus(TradeStatusEnum.succeeded);
+        one.setUpdateTime(new Date());
+        refundBillService.updateById(one);
+
+        //处理业务
+        UserOrderRefund orderRefund = getById(one.getRefundId());
+        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
+            List<Long> ids = new ArrayList<>();
+            for (String id : orderRefund.getOredrDetilIds().split(",")) {
+                ids.add(Long.parseLong(id));
+            }
+            OrderDetailSearch search = new OrderDetailSearch();
+            search.setIds(ids);
+            search.setOrderNo(orderRefund.getOrderNo());
+            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
+
+            for (UserOrderDetailVo vo : userOrderDetails) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
+                if (Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+
+        }
+    }
+
+    /***
+     * 处理回调-退款失败
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentRefundFailedHandle(PaymentCallBack data, String errMsg) {
+        RefundPaymentCallBack refundPaymentCallBack = data.getRefundPaymentCallBack();
+
+        UserOrderRefundBill one = refundBillService.getOne(Wrappers.<UserOrderRefundBill>lambdaQuery().and(
+                wrapper -> wrapper.eq(UserOrderRefundBill::getTransNo, refundPaymentCallBack.getTransNo())
+                        .or().eq(UserOrderRefundBill::getBillNo, refundPaymentCallBack.getBillNo())
+        ));
+
+        if (null == one) {
+            return;
+        }
+        one.setTransNo(refundPaymentCallBack.getTransNo());
+        one.setBackRefundAmt(new BigDecimal(refundPaymentCallBack.getRefundAmt()));
+        one.setStatus(TradeStatusEnum.failed);
+        one.setPayFailMsg(errMsg);
+        one.setUpdateTime(new Date());
+        refundBillService.updateById(one);
+
+        //处理业务
+        UserOrderRefund orderRefund = getById(one.getRefundId());
+        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
+            List<Long> ids = new ArrayList<>();
+            for (String id : orderRefund.getOredrDetilIds().split(",")) {
+                ids.add(Long.parseLong(id));
+            }
+            OrderDetailSearch search = new OrderDetailSearch();
+            search.setIds(ids);
+            search.setOrderNo(orderRefund.getOrderNo());
+            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
+
+            for (UserOrderDetailVo vo : userOrderDetails) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
+                if (Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+
+        }
+    }
 }

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

@@ -19,8 +19,9 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.Payment;
-import com.yonge.toolset.payment.core.props.PaymentProperties;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.utils.string.StringUtil;
 import org.apache.commons.beanutils.BeanUtils;
@@ -234,6 +235,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         }
     }
 
+
     @Override
     public IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
@@ -319,67 +321,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void adapayCallback(String data, String type) {
-        JSONObject hfRes = JSONObject.parseObject(data);
-        if (type.equals("payment.succeeded")) {//支付成功
-            paymentSucceededHandle(hfRes);
-        } else if (type.equals("payment.failed")) {//支付失败
-            paymentFailedHandle(hfRes);
-        } else if (type.equals("payment.close.succeeded")) {//支付关单成功
-            orderPaymentService.paymentCloseSucceededHandle(hfRes);
-        } else if (type.equals("payment.close.failed")) {//支付关单失败
-            orderPaymentService.paymentCloseFailedHandle(hfRes);
-        }
-    }
-
-
-    /***
-     * 处理回调-支付成功
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:09
-     */
-    private void paymentSucceededHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = orderPaymentService.detailByPaymentNo(hfRes.getString("order_no"));
-        if (null == orderPayment) {
-            return;
-        }
-        //订单完成
-        UserOrderVo detail = detail(orderPayment.getOrderNo(), null);
-        if (null == detail) {
-            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
-            return;
-        }
-        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
-            orderSuccess(detail, hfRes);
-        } else {
-            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
-        }
-    }
-
-    /***
-     * 处理回调-支付失败
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:09
-     */
-    private void paymentFailedHandle(JSONObject hfRes) {
-        UserOrderVo detail = detail(hfRes.getString("order_no"), null);
-        if (null == detail) {
-            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
-            return;
-        }
-        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
-            doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败");
-        } else {
-            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
-        }
-    }
-
-    @Override
     public void pollingOrder() {
         //查询半小时前创建的并且还未完成的订单 WAIT_PAY 待支付订单 PAYING 支付中订单
         OrderSearch search = new OrderSearch();
@@ -633,7 +574,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         baseMapper.updateById(userOrder);
     }
 
-    void orderSuccess(UserOrderVo detail) {
+    private void orderSuccess(UserOrderVo detail) {
         orderSuccess(detail, null);
     }
 
@@ -644,8 +585,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @param: detail
      * @updateTime 2022/4/13 17:17
      */
+    @Override
     @Transactional(rollbackFor = Exception.class)
-    void orderSuccess(UserOrderVo detail, JSONObject hfRes) {
+    public void orderSuccess(UserOrderVo detail, PaymentCallBack data) {
         //订单已完成
         if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
@@ -659,21 +601,27 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         updateById(detail);
 
         try {
-            if (null != hfRes) {
+            if (null != data) {
                 //更新付款单
-                UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("id"));
+                UserOrderPayment orderPayment = orderPaymentService
+                        .detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
                 if (null != orderPayment) {
                     orderPayment.setStatus(TradeStatusEnum.succeeded);
                     orderPayment.setArrivalTime(now);
                     orderPayment.setUpdateTime(now);
-                    orderPayment.setBackPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
-                    orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
+
+                    if (null != data.getExecutePaymentCallBack()) {
+                        orderPayment.setBackPayAmt(
+                                new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+                        orderPayment.setFeeAmt(
+                                new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
+                    }
                     orderPaymentService.updateById(orderPayment);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("完成订单失败,参数{}", hfRes.toJSONString());
+            log.error("完成订单失败,参数{}", JSONObject.toJSONString(data));
         }
         //调用业务
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
@@ -690,4 +638,5 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //清除老师声部缓存
         redissonClient.getBucket(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(detail.getUserId())).delete();
     }
+
 }

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

@@ -22,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserBankCardVo;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.utils.easyexcel.ErrMsg;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.easyexcel.ExcelException;

+ 23 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -57,16 +57,36 @@
         where t.order_no_ = #{orderNo}
     </select>
 
+    <sql id="selectSql">
+        SELECT
+            <include refid="baseColumns" />
+        FROM user_order_detail t
+        <where>
+            <if test="param.orderNo != null and param.orderNo != ''">
+                AND t.order_no_ = #{orderNo}
+            </if>
+            <if test="param.ids != null and param.ids.size()>0">
+                AND t.id_ IN
+                <foreach collection="param.ids " item="id" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </sql>
+
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
-		SELECT         
-        	<include refid="baseColumns" />
-		FROM user_order_detail t
+        <include refid="selectSql"/>
 	</select>
 
+    <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
+        <include refid="selectSql"/>
+    </select>
+
     <select id="getOrderDetilListByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns" />
         FROM user_order_detail t
         where t.order_no_ = #{orderNo}
     </select>
+
 </mapper>

+ 35 - 55
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.student.controller;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.huifu.adapay.core.AdapayCore;
 import com.huifu.adapay.core.util.AdapaySign;
 import com.huifu.adapay.core.util.StringUtil;
@@ -8,18 +11,22 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 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.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 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.slf4j.Logger;
@@ -29,8 +36,6 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -45,7 +50,7 @@ public class PaymentController extends BaseController {
     @Autowired
     private UserOrderPaymentService paymentService;
     @Autowired
-    private UserOrderService userOrderService;
+    private UserOrderRefundService userOrderRefundService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
@@ -54,6 +59,8 @@ public class PaymentController extends BaseController {
     private PaymentProperties paymentProperties;
     @Autowired
     private SysConfigPaymentService configPaymentService;
+    @Autowired
+    private WxPayService wxPayService;
 
     @ApiOperation(value = "查询付款单")
     @GetMapping("/queryPayment")
@@ -96,73 +103,46 @@ public class PaymentController extends BaseController {
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
-    ) throws Exception{
-        if (OpenEnum.ADAPAY.getCode().equals(openType)) {
-            return adapayCallbackHandle(payChannel, payMethod, request);
-        }
-        if (OpenEnum.ORIGINAL.getCode().equals(openType)) {
-            return originalCallbackHandle(payChannel, payMethod, request);
-        }
-        return null;
-    }
+    ) throws Exception {
+        BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
+                OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+        if(res.getStatus()){
+            PaymentCallBack data = res.getData();
 
-    /**
-     * 原生微信支付宝回调
-     *
-     * @param request
-     */
-    private Object originalCallbackHandle(String payChannel, String payMethod, HttpServletRequest request) throws Exception{
-        if (PayChannelEnum.alipay_app.getCode().equals(payChannel)) {
-            return alipayAppCallbackHandle(payMethod, request);
-        }
-        if (PayChannelEnum.wx_app.getCode().equals(payChannel)) {
-            return wxAppCallbackHandle(payMethod, request);
+            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;
+        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);
 
         }
         return null;
     }
 
-    //支付宝App支付回调
-    private Object alipayAppCallbackHandle(String payMethod, HttpServletRequest request) {
-        return null;
-    }
-
-    private Object adapayCallbackHandle(String payChannel, String payMethod, HttpServletRequest request) {
-        try {
-            //验签传参data
-            String data = request.getParameter("data");
-            //验签传参sign
-            String sign = request.getParameter("sign");
-            //回调业务类型
-            String type = request.getParameter("type");
-            log.info("汇付回调,type is {},sign is {}, data is {}", type, sign, data);
-            if (StringUtil.isEmpty(type)) {
-                log.error("汇付回调参数异常");
-                return null;
-            }
-            //验签传参publicKey
-            String publicKey = AdapayCore.PUBLIC_KEY;
-            //验签
-            boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
-            if (checkSign) {
-                log.info("验签成功");
-                userOrderService.adapayCallback(data, type);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
 }

+ 4 - 4
toolset/toolset-base/src/main/java/com/yonge/toolset/base/result/BaseResult.java

@@ -109,10 +109,6 @@ public class BaseResult<T> {
 		return getResponseData(false, statusCode, null, msg);
 	}
 
-	public static <T> BaseResult<T> status(boolean flag) {
-		return flag ? succeed() : failed("操作失败");
-	}
-
 	public static <T> BaseResult<T> failed(HttpStatus statusCode, T data, String msg) {
 		return getResponseData(false, statusCode, data, msg);
 	}
@@ -120,6 +116,10 @@ public class BaseResult<T> {
 		return new BaseResult<>(false, code, data, msg);
 	}
 
+	public static <T> BaseResult<T> status(boolean flag) {
+		return flag ? succeed() : failed("操作失败");
+	}
+
 	private static <T> BaseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
 		BaseResult<T> obj = new BaseResult<T>();
 		obj.setStatus(status);

+ 102 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java

@@ -1,26 +1,36 @@
 package com.yonge.toolset.payment.adapay;
 
 import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.AdapayCore;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.core.util.AdapaySign;
 import com.huifu.adapay.model.Refund;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.adapay.constant.AdapayConstant;
 import com.yonge.toolset.payment.base.PaymentTemplate;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.ClosePaymentCallBack;
+import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
+import com.yonge.toolset.payment.base.model.callback.RefundPaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -159,7 +169,99 @@ public class AdapayTemplate implements PaymentTemplate {
             String errorMsg = (String) res.get("error_msg");
             return BaseResult.failed(errorMsg);
         }
+        refundBill.setId(res.get("id").toString());
         refundBill.setStatus(TradeStatusEnum.getByName(res.get("status").toString()));
         return BaseResult.succeed(refundBill);
     }
+
+    @Override
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        PaymentCallBack paymentCallBack = new PaymentCallBack();
+
+        try {
+            //验签传参data
+            String data = request.getParameter("data");
+            //验签传参sign
+            String sign = request.getParameter("sign");
+            //回调业务类型
+            String type = request.getParameter("type");
+            log.info("汇付回调,type is {},sign is {}, data is {}", type, sign, data);
+            if (com.huifu.adapay.core.util.StringUtil.isEmpty(type)) {
+                log.error("汇付回调参数异常");
+                return null;
+            }
+            //验签传参publicKey
+            String publicKey = AdapayCore.PUBLIC_KEY;
+            //验签
+            boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
+            if (checkSign) {
+                JSONObject hfRes = JSONObject.parseObject(data);
+
+                if (type.equals("payment.succeeded")) {//支付成功
+                    paymentCallBack.setId(hfRes.getString("id"));
+                    paymentCallBack.setPaymentNo(hfRes.getString("order_no"));
+                    paymentCallBack.setStatus(TradeStatusEnum.succeeded);
+                    paymentCallBack.setMethodName(MethodNameEnum.executePayment);
+
+                    ExecutePaymentCallBack executePayment = new ExecutePaymentCallBack();
+                    executePayment.setPayAmt(hfRes.getString("pay_amt"));
+                    executePayment.setFeeAmt(hfRes.getString("fee_amt"));
+                    paymentCallBack.setExecutePaymentCallBack(executePayment);
+                } else if (type.equals("payment.failed")) {//支付失败
+                    paymentCallBack.setId(hfRes.getString("id"));
+                    paymentCallBack.setPaymentNo(hfRes.getString("order_no"));
+                    paymentCallBack.setStatus(TradeStatusEnum.failed);
+                    paymentCallBack.setMethodName(MethodNameEnum.executePayment);
+
+                    ExecutePaymentCallBack executePayment = new ExecutePaymentCallBack();
+                    executePayment.setPayAmt(hfRes.getString("pay_amt"));
+                    paymentCallBack.setExecutePaymentCallBack(executePayment);
+                } else if (type.equals("payment.close.succeeded")) {//支付关单成功
+                    paymentCallBack.setId(hfRes.getString("payment_id"));
+                    paymentCallBack.setStatus(TradeStatusEnum.succeeded);
+                    paymentCallBack.setMethodName(MethodNameEnum.closePayment);
+
+                    ClosePaymentCallBack closePayment = new ClosePaymentCallBack();
+                    paymentCallBack.setClosePaymentCallBack(closePayment);
+                } else if (type.equals("payment.close.failed")) {//支付关单失败
+                    paymentCallBack.setId(hfRes.getString("payment_id"));
+                    paymentCallBack.setStatus(TradeStatusEnum.failed);
+                    paymentCallBack.setErrMsg(hfRes.getString("error_msg"));
+                    paymentCallBack.setMethodName(MethodNameEnum.closePayment);
+
+                    ClosePaymentCallBack closePayment = new ClosePaymentCallBack();
+                    paymentCallBack.setClosePaymentCallBack(closePayment);
+                } else if (type.equals("refund.succeeded")) {//退款成功
+                    paymentCallBack.setId(hfRes.getString("payment_id"));
+                    paymentCallBack.setStatus(TradeStatusEnum.succeeded);
+                    paymentCallBack.setMethodName(MethodNameEnum.refundPayment);
+
+                    RefundPaymentCallBack refundPayment = new RefundPaymentCallBack();
+                    refundPayment.setBillNo(hfRes.getString("refund_order_no"));
+                    refundPayment.setTransNo(hfRes.getString("id"));
+                    refundPayment.setRefundAmt(hfRes.getString("pay_amt"));
+                    refundPayment.setFeeAmt(hfRes.getString("fee_amt"));
+                    paymentCallBack.setRefundPaymentCallBack(refundPayment);
+                } else if (type.equals("refund.failed")) {//退款失败
+                    paymentCallBack.setId(hfRes.getString("payment_id"));
+                    paymentCallBack.setStatus(TradeStatusEnum.failed);
+                    paymentCallBack.setErrMsg(hfRes.getString("error_msg"));
+                    paymentCallBack.setMethodName(MethodNameEnum.closePayment);
+
+                    RefundPaymentCallBack refundPayment = new RefundPaymentCallBack();
+                    refundPayment.setBillNo(hfRes.getString("refund_order_no"));
+                    refundPayment.setTransNo(hfRes.getString("id"));
+                    refundPayment.setRefundAmt(hfRes.getString("pay_amt"));
+                    refundPayment.setFeeAmt(hfRes.getString("fee_amt"));
+                    paymentCallBack.setRefundPaymentCallBack(refundPayment);
+                }
+                return BaseResult.succeed(paymentCallBack);
+            } else {
+                return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "未通过验签");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "解析异常");
+        }
+    }
 }

+ 17 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java

@@ -1,11 +1,17 @@
 package com.yonge.toolset.payment.base;
 
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
+import org.springframework.web.bind.annotation.PathVariable;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -18,9 +24,10 @@ public interface PaymentTemplate {
      * @author liweifan
      * @param: openAuth
      * @updateTime 2022/5/12 10:43
-     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map<java.lang.String,java.lang.Object>>
+     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map < java.lang.String, java.lang.Object>>
      */
     BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth);
+
     /***
      * 统一下单接口
      * @author liweifan
@@ -57,5 +64,13 @@ public interface PaymentTemplate {
      */
     BaseResult<RefundBill> refundPayment(RefundBill refundBill);
 
-
+    /**
+     * 解析异步通知
+     * @param openType
+     * @param payChannel
+     * @param methodName
+     * @param request
+     * @return
+     */
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 41 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/MethodNameEnum.java

@@ -0,0 +1,41 @@
+package com.yonge.toolset.payment.base.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 支付方法
+ */
+public enum MethodNameEnum implements BaseEnum<String, MethodNameEnum> {
+    executePayment("统一支付请求"),
+    queryPayment("查询订单"),
+    closePayment("关闭订单"),
+    refundPayment("退款"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    MethodNameEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+}

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

@@ -33,6 +33,10 @@ public class ClosePayment extends Base {
      * @updateTime 2022/5/10 15:30
      */
     String expend;
+    /**
+     * 是否有回调通知
+     */
+    Boolean hasNotify = true;
 
     public ClosePayment(OpenEnum openType, PayChannelEnum payChannel){
         super(openType,payChannel);
@@ -69,4 +73,12 @@ public class ClosePayment extends Base {
     public void setExpend(String expend) {
         this.expend = expend;
     }
+
+    public Boolean getHasNotify() {
+        return hasNotify;
+    }
+
+    public void setHasNotify(Boolean hasNotify) {
+        this.hasNotify = hasNotify;
+    }
 }

+ 10 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ClosePaymentCallBack.java

@@ -0,0 +1,10 @@
+package com.yonge.toolset.payment.base.model.callback;
+
+import java.io.Serializable;
+
+/**
+ * 关闭订单回调对象
+ */
+public class ClosePaymentCallBack implements Serializable {
+
+}

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

@@ -0,0 +1,37 @@
+package com.yonge.toolset.payment.base.model.callback;
+
+import java.io.Serializable;
+
+/**
+ * 支付方法回调对象
+ */
+public class ExecutePaymentCallBack implements Serializable {
+    /***
+     * 交易金额,必须大于0,保留两位小数点,如0.10、100.05等(必填)
+     * @author liweifan
+     * @updateTime 2022/3/31 11:01
+     */
+    private String payAmt;
+    /***
+     * 服务费
+     * @author liweifan
+     * @updateTime 2022/3/31 11:01
+     */
+    private String feeAmt;
+
+    public String getPayAmt() {
+        return payAmt;
+    }
+
+    public void setPayAmt(String payAmt) {
+        this.payAmt = payAmt;
+    }
+
+    public String getFeeAmt() {
+        return feeAmt;
+    }
+
+    public void setFeeAmt(String feeAmt) {
+        this.feeAmt = feeAmt;
+    }
+}

+ 128 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/PaymentCallBack.java

@@ -0,0 +1,128 @@
+package com.yonge.toolset.payment.base.model.callback;
+
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+
+import java.io.Serializable;
+
+/**
+ * 付款回调对象
+ */
+public class PaymentCallBack implements Serializable {
+    /***
+     * 三方支付流水号(请求后才有)
+     * @author liweifan
+     * @updateTime 2022/3/31 11:00
+     */
+    private String id;
+    /***
+     * 支付订单号
+     * @author liweifan
+     * @updateTime 2022/3/31 11:00
+     */
+    private String paymentNo;
+    /***
+     * 交易状态
+     * @author liweifan
+     * @updateTime 2022/3/31 11:01
+     */
+    private TradeStatusEnum status;
+    /**
+     * 支付方法
+     */
+    private MethodNameEnum methodName;
+    /**
+     * 异常原因
+     */
+    private String errMsg;
+
+    /**
+     * 回执消息
+     */
+    private Object resMsg;
+    /**
+     * 支付方法回调对象
+     */
+    private ExecutePaymentCallBack executePaymentCallBack;
+    /**
+     * 关闭订单回调对象
+     */
+    private ClosePaymentCallBack closePaymentCallBack;
+    /**
+     * 退款回调对象
+     */
+    private RefundPaymentCallBack refundPaymentCallBack;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPaymentNo() {
+        return paymentNo;
+    }
+
+    public void setPaymentNo(String paymentNo) {
+        this.paymentNo = paymentNo;
+    }
+
+    public TradeStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(TradeStatusEnum status) {
+        this.status = status;
+    }
+
+    public MethodNameEnum getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(MethodNameEnum methodName) {
+        this.methodName = methodName;
+    }
+
+    public ExecutePaymentCallBack getExecutePaymentCallBack() {
+        return executePaymentCallBack;
+    }
+
+    public void setExecutePaymentCallBack(ExecutePaymentCallBack executePaymentCallBack) {
+        this.executePaymentCallBack = executePaymentCallBack;
+    }
+
+    public ClosePaymentCallBack getClosePaymentCallBack() {
+        return closePaymentCallBack;
+    }
+
+    public void setClosePaymentCallBack(ClosePaymentCallBack closePaymentCallBack) {
+        this.closePaymentCallBack = closePaymentCallBack;
+    }
+
+    public RefundPaymentCallBack getRefundPaymentCallBack() {
+        return refundPaymentCallBack;
+    }
+
+    public void setRefundPaymentCallBack(RefundPaymentCallBack refundPaymentCallBack) {
+        this.refundPaymentCallBack = refundPaymentCallBack;
+    }
+
+    public String getErrMsg() {
+        return errMsg;
+    }
+
+    public void setErrMsg(String errMsg) {
+        this.errMsg = errMsg;
+    }
+
+    public Object getResMsg() {
+        return resMsg;
+    }
+
+    public void setResMsg(Object resMsg) {
+        this.resMsg = resMsg;
+    }
+}

+ 57 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/RefundPaymentCallBack.java

@@ -0,0 +1,57 @@
+package com.yonge.toolset.payment.base.model.callback;
+
+import java.io.Serializable;
+
+/**
+ * 退款返回对象
+ */
+public class RefundPaymentCallBack implements Serializable {
+    /**
+     * 退款订单号
+     */
+    private String billNo;
+    /**
+     * 三方交易流水号
+     */
+    private String transNo;
+    /**
+     * 退款金额(单位:元)
+     */
+    private String refundAmt;
+    /**
+     * 退款手续费(单位:元)
+     */
+    private String feeAmt;
+
+    public String getBillNo() {
+        return billNo;
+    }
+
+    public void setBillNo(String billNo) {
+        this.billNo = billNo;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public String getRefundAmt() {
+        return refundAmt;
+    }
+
+    public void setRefundAmt(String refundAmt) {
+        this.refundAmt = refundAmt;
+    }
+
+    public String getFeeAmt() {
+        return feeAmt;
+    }
+
+    public void setFeeAmt(String feeAmt) {
+        this.feeAmt = feeAmt;
+    }
+}

+ 14 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java

@@ -1,11 +1,16 @@
 package com.yonge.toolset.payment.core.service;
 
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -57,4 +62,13 @@ public interface PaymentClient {
      */
     BaseResult<RefundBill> refundPayment(RefundBill refundBill);
 
+    /**
+     * 解析异步通知
+     * @param openType
+     * @param payChannel
+     * @param methodName
+     * @param request
+     * @return
+     */
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 10 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java

@@ -2,14 +2,19 @@ package com.yonge.toolset.payment.core.service.impl;
 
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.util.PaywayUtil;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -42,4 +47,9 @@ public class PaymentClientImpl implements PaymentClient {
     public BaseResult<RefundBill> refundPayment(RefundBill refundBill) {
         return PaywayUtil.getRealTemplate(refundBill.getOpenType(), refundBill.getPayChannel()).refundPayment(refundBill);
     }
+
+    @Override
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        return PaywayUtil.getRealTemplate(openType, payChannel).analysisNotice(openType, payChannel, methodName, request);
+    }
 }

+ 10 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -13,8 +13,12 @@ import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.alipay.api.response.AlipayTradeRefundResponse;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.*;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import org.slf4j.Logger;
@@ -23,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -180,4 +185,9 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
             return BaseResult.failed("退款失败");
         }
     }
+
+    @Override
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        return null;
+    }
 }

+ 51 - 213
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -1,8 +1,8 @@
 package com.yonge.toolset.payment.original.wx;
 
-import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
+import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
 import com.github.binarywang.wxpay.bean.request.*;
 import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
@@ -11,18 +11,22 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
+import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
 import com.yonge.toolset.utils.collection.MapUtil;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import com.yonge.toolset.utils.string.StringUtil;
+import com.yonge.toolset.utils.web.WebUtil;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -34,10 +38,13 @@ import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.Map;
 
 @Component
@@ -51,221 +58,13 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    /*@Autowired
-    private CloseableHttpClient httpClient;*/
     @Autowired
     private WxPayService wxPayService;
-    private String tradeState;
-
 
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
         return null;
     }
-    /**
-    @Override
-    public BaseResult<Payment> executePayment(Payment payment) {
-        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
-        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-
-        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/app");
-        httpPost.addHeader("Accept", "application/json");
-        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
-
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        ObjectNode rootNode = objectMapper.createObjectNode();
-        rootNode.put("mchid", MERCHANT_ID)
-                .put("appid", APP_ID)
-                .put("description", payment.getOrderDesc())
-                .put("out_trade_no", payment.getPaymentNo())
-                .put("notify_url", paymentProperties.getNotifyUrl()
-                        + "/" + payment.getOpenType().getCode()
-                        + "/" + payment.getPayChannel().getCode()
-                        + "/executePayment");
-
-        if (StringUtil.isEmpty(payment.getPayAmt())) {
-            return BaseResult.failed("微信APP支付金额异常");
-        }
-
-        BigDecimal amnout = new BigDecimal(payment.getPayAmt()).multiply(new BigDecimal("100"));
-
-        rootNode.putObject("amount")
-                .put("total", amnout.abs().intValue());
-
-        try {
-            objectMapper.writeValue(bos, rootNode);
-            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付参数转换失败");
-        }
-
-        CloseableHttpResponse response;
-        try {
-            response = httpClient.execute(httpPost);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付请求失败");
-        }
-        String bodyAsString;
-        try {
-            bodyAsString = EntityUtils.toString(response.getEntity());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付返回结果转换失败");
-        }
-        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
-        String prepay_id = jsonObject.getString("prepay_id");
-        payment.setPayInfo(prepay_id);
-
-        BaseResult<Payment> paymentBaseResult = queryPayment(payment);
-        if (paymentBaseResult.getStatus()) {
-            payment.setId(paymentBaseResult.getData().getId());
-        }
-        return BaseResult.succeed(payment);
-    }
-
-    @Override
-    public BaseResult<Payment> queryPayment(Payment payment) {
-        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-
-        String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + payment.getPaymentNo() + "?mchid=" + MERCHANT_ID;
-
-        HttpGet httpGet;
-        try {
-            URIBuilder uriBuilder = new URIBuilder(url);
-            httpGet = new HttpGet(uriBuilder.build());
-            httpGet.addHeader("Accept", "application/json");
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付参数转换失败");
-        }
-
-        CloseableHttpResponse response;
-        try {
-            response = httpClient.execute(httpGet);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付请求失败");
-        }
-        String bodyAsString;
-        try {
-            bodyAsString = EntityUtils.toString(response.getEntity());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付返回结果转换失败");
-        }
-        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
-        payment.setId(jsonObject.getString("transaction_id"));
-
-        String trade_state = jsonObject.getString("trade_state");
-        if ("SUCCESS".equals(trade_state)) {
-            payment.setStatus(TradeStatusEnum.succeeded);
-        } else if ("REFUND".equals(trade_state)) {
-            payment.setStatus(TradeStatusEnum.close);
-        } else if ("NOTPAY".equals(trade_state)) {
-            payment.setStatus(TradeStatusEnum.pending);
-        } else if ("CLOSED".equals(trade_state)) {
-            payment.setStatus(TradeStatusEnum.close);
-        }
-        return BaseResult.succeed(payment);
-    }
-
-    @Override
-    public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-
-        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + closePayment.getPaymentNo() + "/close");
-        httpPost.addHeader("Accept", "application/json");
-        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
-
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        ObjectNode rootNode = objectMapper.createObjectNode();
-        rootNode.put("mchid", MERCHANT_ID)
-                .put("notify_url", paymentProperties.getNotifyUrl()
-                        + "/" + closePayment.getOpenType().getCode()
-                        + "/" + closePayment.getPayChannel().getCode()
-                        + "/closePayment");
-        try {
-            objectMapper.writeValue(bos, rootNode);
-            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付参数转换失败");
-        }
-
-        CloseableHttpResponse response;
-        try {
-            response = httpClient.execute(httpPost);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付请求失败");
-        }
-        return BaseResult.succeed(closePayment);
-    }
-
-    @Override
-    public BaseResult<RefundBill> refundPayment(RefundBill refundBill) {
-        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
-        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-
-        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds");
-        httpPost.addHeader("Accept", "application/json");
-        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
-
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        ObjectNode rootNode = objectMapper.createObjectNode();
-        rootNode.put("mchid", MERCHANT_ID)
-                .put("appid", APP_ID)
-                .put("transaction_id", refundBill.getTradeNo())
-                .put("out_trade_no", refundBill.getPaymentNo())
-                .put("out_refund_no", refundBill.getRefundNo())
-                .put("reason", refundBill.getReason())
-                .put("notify_url", paymentProperties.getNotifyUrl()
-                        + "/" + refundBill.getOpenType().getCode()
-                        + "/" + refundBill.getPayChannel().getCode()
-                        + "/refundPayment");
-
-        rootNode.putObject("amount")
-                .put("refund", refundBill.getRefundAmt())
-                .put("total", refundBill.getOrderAmt())
-                .put("currency", "CNY");
-
-        try {
-            objectMapper.writeValue(bos, rootNode);
-
-            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付参数转换失败");
-        }
-
-        CloseableHttpResponse response;
-        try {
-            response = httpClient.execute(httpPost);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付请求失败");
-        }
-        String bodyAsString;
-        try {
-            bodyAsString = EntityUtils.toString(response.getEntity());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return BaseResult.failed("微信APP支付返回结果转换失败");
-        }
-        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
-        String refund_id = jsonObject.getString("refund_id");
-        refundBill.setId(refund_id);
-        return BaseResult.succeed(refundBill);
-    }
-    **/
 
     @Override
     public BaseResult<Payment> executePayment(Payment payment) {
@@ -317,7 +116,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
         WxPayOrderQueryV3Request param = new WxPayOrderQueryV3Request();
         param.setMchid(MERCHANT_ID);
-        if(!StringUtil.isEmpty(payment.getId())){
+        if (!StringUtil.isEmpty(payment.getId())) {
             param.setTransactionId(payment.getId());
         }
         param.setOutTradeNo(payment.getPaymentNo());
@@ -354,7 +153,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setMchid(MERCHANT_ID);
         param.setOutTradeNo(closePayment.getPaymentNo());
 
-        try{
+        try {
             wxPayService.closeOrderV3(param);
             return BaseResult.succeed(closePayment);
         } catch (WxPayException e) {
@@ -403,4 +202,43 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
             return BaseResult.failed("微信APP支付关单请求失败");
         }
     }
+
+    @Override
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        //支付回调
+        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);
+        PaymentCallBack paymentCallBack = new PaymentCallBack();
+
+        Map<String,Object> resMsg = new HashMap<>();
+        try {
+            if (MethodNameEnum.executePayment.equals(methodName)) {
+                WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, header);
+                //封装支付回调对象
+            } else if (MethodNameEnum.refundPayment.equals(methodName)) {
+                WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = wxPayService.parseRefundNotifyV3Result(params, header);
+                //封装退款回调对象
+            }
+            resMsg.put("code","SUCCESS");
+            paymentCallBack.setResMsg(resMsg);
+            return BaseResult.succeed(paymentCallBack);
+        } catch (WxPayException e) {
+            resMsg.put("code","FAIL");
+            resMsg.put("message","失败");
+            paymentCallBack.setResMsg(resMsg);
+            log.error("微信回调对象转换失败, param is {} , err is {}", params, e.toString());
+            return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "微信回调对象转换失败");
+        } catch (Exception e) {
+            e.printStackTrace();
+            resMsg.put("code","FAIL");
+            resMsg.put("message","失败");
+            paymentCallBack.setResMsg(resMsg);
+            return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "解析异常");
+        }
+    }
 }

+ 17 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/web/WebUtil.java

@@ -7,6 +7,8 @@
  */
 package com.yonge.toolset.utils.web;
 
+import java.io.BufferedReader;
+import java.io.IOException;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -192,4 +194,19 @@ public class WebUtil {
 
 		return isFromMobile;
 	}
+
+
+	public static String getBodyData(HttpServletRequest request) {
+		StringBuffer data = new StringBuffer();
+		String line = null;
+		BufferedReader reader = null;
+		try {
+			reader = request.getReader();
+			while (null != (line = reader.readLine()))
+				data.append(line);
+		} catch (IOException e) {
+		} finally {
+		}
+		return data.toString();
+	}
 }