Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

liujunchi 3 years ago
parent
commit
782b2a2345
52 changed files with 1750 additions and 756 deletions
  1. 0 1
      cooleshow-user/pom.xml
  2. 5 6
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java
  3. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/WithdrawalConstant.java
  4. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOpenContractRecordDao.java
  5. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java
  6. 0 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java
  7. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderDetailSearch.java
  8. 11 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  9. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOpenContractRecord.java
  10. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  11. 7 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderRefundBill.java
  12. 91 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  13. 1 46
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawalCallback.java
  14. 0 43
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java
  15. 79 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/WithdrawalProperties.java
  16. 32 61
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java
  17. 47 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LingXinService.java
  18. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderDetailService.java
  19. 21 26
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  20. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java
  21. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  22. 8 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  23. 11 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java
  24. 236 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LingXinServiceImpl.java
  25. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherFreeTimeServiceImpl.java
  26. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderDetailServiceImpl.java
  27. 122 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  28. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundBillServiceImpl.java
  29. 124 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  30. 18 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  31. 82 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  32. 6 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java
  33. 23 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  34. 27 28
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  35. 35 57
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  36. 48 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  37. 15 19
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java
  38. 4 4
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/result/BaseResult.java
  39. 102 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  40. 17 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java
  41. 41 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/MethodNameEnum.java
  42. 12 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  43. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ClosePaymentCallBack.java
  44. 37 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/ExecutePaymentCallBack.java
  45. 128 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/PaymentCallBack.java
  46. 57 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/callback/RefundPaymentCallBack.java
  47. 14 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java
  48. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java
  49. 10 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  50. 51 213
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  51. 7 0
      toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java
  52. 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>

+ 5 - 6
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -66,9 +66,8 @@ public class UserWithdrawalController extends BaseController {
     @ApiOperation(value = "查询导出", notes = "传入TeacherWithdrawalSearch")
     @PreAuthorize("@pcs.hasPermissions('userWithdrawal/exportExcel')")
     public void exportExcel(@RequestBody TeacherWithdrawalSearch query) {
-        query.setStatus(AuthStatusEnum.DOING);
         List<UserWithdrawalVo> withdrawalVoList = userWithdrawalService.selectList(query);
-        List<UserWithdrawalExport> list = new ArrayList<>();
+        /*List<UserWithdrawalExport> list = new ArrayList<>();
         withdrawalVoList.forEach(o -> {
             UserWithdrawalExport export = new UserWithdrawalExport();
             try {
@@ -86,15 +85,15 @@ public class UserWithdrawalController extends BaseController {
             } catch (InvocationTargetException e) {
                 e.printStackTrace();
             }
-        });
-        ExcelUtils.exportExcel(list, "提现列表数据" + System.currentTimeMillis(),
+        });*/
+        ExcelUtils.exportExcel(withdrawalVoList, "提现列表数据" + System.currentTimeMillis(),
                 "列表数据");
     }
 
     /**
      * 导入
      */
-    @PostMapping("/importExcel")
+    /*@PostMapping("/importExcel")
     @ApiOperation(value = "导入", notes = "传入file")
     @PreAuthorize("@pcs.hasPermissions('userWithdrawal/importExcel')")
     public HttpResponseResult<List<ErrMsg>> importExcel(@RequestParam("file") MultipartFile file) {
@@ -112,5 +111,5 @@ public class UserWithdrawalController extends BaseController {
         } catch (ExcelException e) {
             return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(), BizHttpStatus.IMPORT.getMsg());
         }
-    }
+    }*/
 }

+ 21 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/WithdrawalConstant.java

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.biz.dal.constant;
+
+public interface WithdrawalConstant {
+    /**
+     * 提现三方类型:lingxinpay 灵薪付
+     */
+    String openType = "lingxinpay";
+    //第三方url
+    String apiUrl = "http://39.107.15.64:8090";
+    //商户号
+    String memberNo = "1491663782974988288";
+    //第三方公钥
+    String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYT5eCY6r8sGWgbiId/VqSZmS6XkBNGMkzUqTIkpkecOzsFBxFXTQmgDeR991YfgqmyOaHsJ/ons/H+e8l+RmHsOm4eErFU+9qXFq+k195YFV1vAR9O7MIG+FR5vmLDuhgimPsgqscWhUrGinc8RUpi5KwClgx7d+d8ZJ4GmkR0QIDAQAB";
+    //第三方私钥
+    String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANf/X1s2raYQAmY5VY929XqOIRESFlpLzWbltA08EI2i0jnJY3/kcCpo1sCHqkyWpDFGRgM1WYE90ayzEpS6EdZpyJ2/N5JFJzx4wMil5KHLdtQUmVv9si+xuYNOKfJW6Xn6zI/Wh81J1+hMlUY4WigU5Qci7DjdOjg5OD6e5DO3AgMBAAECgYEAor9ENhII3SsK48MneKWFaQZWW+po9ThQV8uT0rUDM/UOuYPIeMDC0vGTfhW6d2K57Haqohg8jGjr51g2E+HvNV+fARaBfCwy00DGcxjI6N8gEInj2AppsGV6a0ZtzGBh3BxGhEFV7x3NmTylDk3WkGnkGDqDNyrBUgK0BzCJEmECQQD+gYckYRevVfrZEHDQHRNzzMUlV9/ljA9x8dt0LoCNbd/wFvs0Ekjhas/2lUBkewEd4Kr0jaFcYzlUO/qihcpNAkEA2UP5W44yLuIo8ttPpdsfkH/8Ax64IywQHrXWq+thH7I91VwY2vomTduw8x0PafZtp8xryF3LixTZwQ7gsYbwEwJAQbb8SB5x2SogPVALcREw5qOm+/92pnTFwCws+BDRzLLkMcAdWNKn0tybmhXrrIY+QZKzUbYIRiywrtlV3AUjuQJBAJbnFnfX4NUdchGT79Mjyd2kdxZ3rK+JOD0MUWkhWFkahMX/bKgTXK1xLIr/ISiY53rHigkl1Gzqc4Aa5EeJkI8CQFlzlBOfoVnq3fPMZCCZcZSm97L12MgHho0AzoNj9sw9YYn9WPM7bw2HT8GUheiU3aiZGCyGGpYuVHMiBGa7l9U=";
+    //MD5加密的key
+    String md5Key = "0fd42370bad6485e46718b97f3dd1536";
+    //回调地址
+    String notifyUrl = "http://47.114.1.200:8000/teacher-server/withdraw/callback";
+
+}

+ 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

+ 0 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java

@@ -1,7 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import java.util.List;
-import java.util.Map;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -36,10 +35,4 @@ public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal>{
 	 */
 	List<UserWithdrawalVo> selectList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
 
-	/**
-	 * @Description: 提现成功回调
-	 * @Author: cy
-	 * @Date: 2022/5/9
-	 */
-    void withdrawSuccess(Map<String, Object> withdrawRecord);
 }

+ 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;
+	}
 }

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

@@ -1,8 +1,8 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 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;
 
@@ -15,10 +15,10 @@ import java.time.LocalDateTime;
 @ApiModel(value = "TeacherWithdrawalSearch对象", description = "老师账户提现表查询对象")
 public class TeacherWithdrawalSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
-	@ApiModelProperty("银行(交易)流水号 ")
-	private String bankFlowNo;
-	@ApiModelProperty("状态 DOING、审核中 PASS、通过 UNPASS、不通过")
-	private AuthStatusEnum status;
+	@ApiModelProperty("三方交易流水号 ")
+	private String transNo;
+	@ApiModelProperty("交易状态 pending、交易处理中 succeeded、交易成功 failed、交易失败 ")
+	private TradeStatusEnum status;
 	@ApiModelProperty(value = "申请开始时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime startTime;
@@ -30,19 +30,19 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 
 	private Long userId;
 
-	public String getBankFlowNo() {
-		return bankFlowNo;
+	public String getTransNo() {
+		return transNo;
 	}
 
-	public void setBankFlowNo(String bankFlowNo) {
-		this.bankFlowNo = bankFlowNo;
+	public void setTransNo(String transNo) {
+		this.transNo = transNo;
 	}
 
-	public AuthStatusEnum getStatus() {
+	public TradeStatusEnum getStatus() {
 		return status;
 	}
 
-	public void setStatus(AuthStatusEnum status) {
+	public void setStatus(TradeStatusEnum status) {
 		this.status = status;
 	}
 

+ 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;
     }
     

+ 91 - 69
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java

@@ -4,7 +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.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -20,154 +20,176 @@ import java.math.BigDecimal;
 @TableName("user_withdrawal")
 @ApiModel(value = "UserWithdrawal对象", description = "用户账户提现表")
 public class UserWithdrawal implements Serializable {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
     @ApiModelProperty("提现id ")
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;
     @ApiModelProperty("用户表id ")
-	@TableField(value = "user_id_")
+    @TableField(value = "user_id_")
     private Long userId;
     @ApiModelProperty("提现金额 ")
-	@TableField(value = "amount_")
+    @TableField(value = "amount_")
     private BigDecimal amount;
     @ApiModelProperty("平台服务费 ")
-	@TableField(value = "plantform_fee_")
+    @TableField(value = "plantform_fee_")
     private BigDecimal plantformFee;
+    @ApiModelProperty("银行卡id ")
+    @TableField(value = "bank_card_id_")
+    private Long bankCardId;
+    @ApiModelProperty("第三方类型 ")
+    @TableField(value = "open_type_")
+    private String openType;
+    @ApiModelProperty("三方交易流水号 ")
+    @TableField(value = "trans_no_")
+    private String transNo;
+    @ApiModelProperty("交易状态 pending、交易处理中 succeeded、交易成功 failed、交易失败 ")
+    @TableField(value = "status_")
+    private TradeStatusEnum status;
     @ApiModelProperty("实际到账金额 ")
-	@TableField(value = "actual_amount_")
+    @TableField(value = "actual_amount_")
     private BigDecimal actualAmount;
-    @ApiModelProperty("银行卡 ")
-	@TableField(value = "bank_card_")
-    private String bankCard;
-    @ApiModelProperty("银行流水号 ")
-	@TableField(value = "bank_flow_no_")
-    private String bankFlowNo;
     @ApiModelProperty("转账时间 ")
-	@TableField(value = "transfer_time_")
+    @TableField(value = "transfer_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date transferTime;
-    @ApiModelProperty("提现状态 DOING、提现中 PASS、成功 UNPASS、失败")
-    @TableField(value = "status_")
-    private AuthStatusEnum status;
-    @ApiModelProperty("审核人")
-    @TableField(value = "verify_user_id_")
-    private Long verifyUserId;
-    @ApiModelProperty("审核原因")
-    @TableField(value = "verify_reason_")
-    private String verifyReason;
+    @ApiModelProperty("支付失败码 ")
+    @TableField(value = "error_code_")
+    private String errorCode;
+    @ApiModelProperty("支付失败时返回 ")
+    @TableField(value = "error_msg_")
+    private String errorMsg;
+    @ApiModelProperty("三方回调json ")
+    @TableField(value = "callback_json_")
+    private String callbackJson;
     @ApiModelProperty("发起时间 ")
-	@TableField(value = "create_time_")
+    @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
     @ApiModelProperty("修改时间 ")
-	@TableField(value = "update_time_")
+    @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public Long getUserId() {
+
+    public Long getUserId() {
         return userId;
     }
 
     public void setUserId(Long userId) {
         this.userId = userId;
     }
-    
-	public BigDecimal getAmount() {
+
+    public BigDecimal getAmount() {
         return amount;
     }
 
     public void setAmount(BigDecimal amount) {
         this.amount = amount;
     }
-    
-	public BigDecimal getPlantformFee() {
+
+    public BigDecimal getPlantformFee() {
         return plantformFee;
     }
 
     public void setPlantformFee(BigDecimal plantformFee) {
         this.plantformFee = plantformFee;
     }
-    
-	public BigDecimal getActualAmount() {
-        return actualAmount;
+
+    public Long getBankCardId() {
+        return bankCardId;
     }
 
-    public void setActualAmount(BigDecimal actualAmount) {
-        this.actualAmount = actualAmount;
+    public void setBankCardId(Long bankCardId) {
+        this.bankCardId = bankCardId;
+    }
+
+    public String getOpenType() {
+        return openType;
+    }
+
+    public void setOpenType(String openType) {
+        this.openType = openType;
+    }
+
+    public String getTransNo() {
+        return transNo;
     }
-    
-	public String getBankCard() {
-        return bankCard;
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
     }
 
-    public void setBankCard(String bankCard) {
-        this.bankCard = bankCard;
+    public TradeStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(TradeStatusEnum status) {
+        this.status = status;
     }
 
-	public String getBankFlowNo() {
-        return bankFlowNo;
+    public BigDecimal getActualAmount() {
+        return actualAmount;
     }
 
-    public void setBankFlowNo(String bankFlowNo) {
-        this.bankFlowNo = bankFlowNo;
+    public void setActualAmount(BigDecimal actualAmount) {
+        this.actualAmount = actualAmount;
     }
-    
-	public Date getTransferTime() {
+
+    public Date getTransferTime() {
         return transferTime;
     }
 
     public void setTransferTime(Date transferTime) {
         this.transferTime = transferTime;
     }
-    
-	public Date getCreateTime() {
-        return createTime;
+
+    public String getErrorCode() {
+        return errorCode;
     }
 
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
     }
-    
-	public Date getUpdateTime() {
-        return updateTime;
+
+    public String getErrorMsg() {
+        return errorMsg;
     }
 
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
     }
 
-    public AuthStatusEnum getStatus() {
-        return status;
+    public String getCallbackJson() {
+        return callbackJson;
     }
 
-    public void setStatus(AuthStatusEnum status) {
-        this.status = status;
+    public void setCallbackJson(String callbackJson) {
+        this.callbackJson = callbackJson;
     }
 
-    public Long getVerifyUserId() {
-        return verifyUserId;
+    public Date getCreateTime() {
+        return createTime;
     }
 
-    public void setVerifyUserId(Long verifyUserId) {
-        this.verifyUserId = verifyUserId;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
-    public String getVerifyReason() {
-        return verifyReason;
+    public Date getUpdateTime() {
+        return updateTime;
     }
 
-    public void setVerifyReason(String verifyReason) {
-        this.verifyReason = verifyReason;
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
     }
 }

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

@@ -1,8 +1,5 @@
 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.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -14,140 +11,98 @@ import java.util.Date;
  * @Author: cy
  * @Date: 2022/5/10
  */
-@ApiModel(value = "user_withdrawal_callback-提现回调")
+@ApiModel(value = "user_withdrawal_callback-提现回调")
 public class UserWithdrawalCallback extends BaseEntity {
-    @TableId(value = "id_", type = IdType.AUTO)
-    @ApiModelProperty(value = "主键id")
-    private Long id;
-
-    @TableField("order_no_")
     @ApiModelProperty(value = "众薪平台唯一订单号")
     private String orderNo;
 
-    @TableField("out_member_no_")
     @ApiModelProperty(value = "商户号")
     private String outMemberNo;
 
-    @TableField("outer_order_no_")
     @ApiModelProperty(value = "商户唯一订单号")
     private String outerOrderNo;
 
-    @TableField("additional_charge_")
     @ApiModelProperty(value = "个人附加费(单位为:分)")
     private Integer additionalCharge;
 
-    @TableField("actual_amount_")
     @ApiModelProperty(value = "实发金额(单位为:分,范围:1~10000000000)")
     private Integer actualAmount;
 
-    @TableField("company_charge_")
     @ApiModelProperty(value = "企业附加费(单位为:分)")
     private Integer companyCharge;
 
-    @TableField("company_service_fee_")
     @ApiModelProperty(value = "公司服务费汇总=企业个税+企业附加费+企业服务费(单位为:分)")
     private Integer companyServiceFee;
 
-    @TableField("company_tax_")
     @ApiModelProperty(value = "企业承担个税(单位为:分)")
     private Integer companyTax;
 
-    @TableField("service_charge_")
     @ApiModelProperty(value = "企业服务费(单位为:分)")
     private Integer serviceCharge;
 
-    @TableField("tax_fee_")
     @ApiModelProperty(value = "个人承担个税(单位为:分)")
     private Integer taxFee;
 
-    @TableField("person_service_fee_")
     @ApiModelProperty(value = "个人服务费汇总=个人个税+个人附加费(单位为:分)")
     private Integer personServiceFee;
 
-    @TableField("predict_amount_")
     @ApiModelProperty(value = "应发金额(单位为:分,范围:1~10000000000)")
     private Integer predictAmount;
 
-    @TableField("salary_type_")
     @ApiModelProperty(value = "发放类型(0:个人经营所得)")
     private String salaryType;
 
-    @TableField("status_")
     @ApiModelProperty(value = "交易状态(0:交易中;1:交易成功;2:交易失败)")
     private String status;
 
-    @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
-    @TableField("end_time_")
     @ApiModelProperty(value = "完成时间")
     private Date endTime;
 
-    @TableField("error_code_")
     @ApiModelProperty(value = "支付失败时返回")
     private String errorCode;
 
-    @TableField("error_msg_")
     @ApiModelProperty(value = "支付失败时返回")
     private String errorMsg;
 
-    @TableField("mobile_")
     @ApiModelProperty(value = "收款方电话")
     private String mobile;
 
-    @TableField("certificate_no_")
     @ApiModelProperty(value = "收款方身份证号")
     private String certificateNo;
 
-    @TableField("name_")
     @ApiModelProperty(value = "收款方姓名(银行预留姓名等)")
     private String name;
 
-    @TableField("card_attribute_")
     @ApiModelProperty(value = "卡属性:(C:对私)")
     private String cardAttribute;
 
-    @TableField("card_type_")
     @ApiModelProperty(value = "卡类型:DC借记卡")
     private String cardType;
 
-    @TableField("pay_account_")
     @ApiModelProperty(value = "收款方账号(银行卡号/支付宝账号/open_id)以实际业务为准")
     private String payAccount;
 
-    @TableField("pay_type_")
     @ApiModelProperty(value = "支付类型(1:银行卡,2:支付宝,4:微信)以实际业务为准")
     private String payType;
 
-    @TableField("project_name_")
     @ApiModelProperty(value = "项目名称")
     private String projectName;
 
-    @TableField("remark_")
     @ApiModelProperty(value = "备注(扩展字段)只针对测试环境:只要参数合规都会返回交易成功,如果想要模拟交易失败,该字段值中含有“失败”二字即会失败。")
     private String remark;
 
-    @TableField("service_")
     @ApiModelProperty(value = "接口名称: bpotop.zx.pay.order")
     private String service;
 
-    @TableField("sign_type_")
     @ApiModelProperty(value = "签名类型:RSA")
     private String signType;
 
-    @TableField("notify_url_")
     @ApiModelProperty(value = "回调地址")
     private String notifyUrl;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
     public String getOrderNo() {
         return orderNo;
     }

+ 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;
-    }
-}

+ 79 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/WithdrawalProperties.java

@@ -0,0 +1,79 @@
+package com.yonge.cooleshow.biz.dal.props;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "withdrawal")
+public class WithdrawalProperties {
+    //提现服务提供方 lingxinpay 灵薪付
+    private String openType;
+    //第三方url
+    private String apiUrl;
+    //商户号
+    private String memberNo;
+    //第三方公钥
+    private String publicKey;
+    //第三方私钥
+    private String privateKey;
+    //MD5加密的key
+    private String md5Key;
+    //回调地址
+    private String notifyUrl;
+
+    public String getOpenType() {
+        return openType;
+    }
+
+    public void setOpenType(String openType) {
+        this.openType = openType;
+    }
+
+    public String getApiUrl() {
+        return apiUrl;
+    }
+
+    public void setApiUrl(String apiUrl) {
+        this.apiUrl = apiUrl;
+    }
+
+    public String getMemberNo() {
+        return memberNo;
+    }
+
+    public void setMemberNo(String memberNo) {
+        this.memberNo = memberNo;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    public void setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+    }
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public void setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public String getMd5Key() {
+        return md5Key;
+    }
+
+    public void setMd5Key(String md5Key) {
+        this.md5Key = md5Key;
+    }
+
+    public String getNotifyUrl() {
+        return notifyUrl;
+    }
+
+    public void setNotifyUrl(String notifyUrl) {
+        this.notifyUrl = notifyUrl;
+    }
+}

+ 32 - 61
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/lingxinpay/Withdraw.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java

@@ -1,30 +1,32 @@
-package com.yonge.toolset.thirdparty.lingxinpay;
+package com.yonge.cooleshow.biz.dal.sdk;
 
 import com.alibaba.fastjson.JSONObject;
+import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
+import com.yonge.toolset.thirdparty.lingxinpay.Md5EncryptUtils;
+import com.yonge.toolset.thirdparty.lingxinpay.RSA;
+import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 
 /**
  * @author: cy
  * @date: 2022/5/9 11:24
  */
 @Service
-public class Withdraw {
-    private static final Logger logger = LoggerFactory.getLogger(Withdraw.class);
+public class WithdrawSdk {
+    private static final Logger logger = LoggerFactory.getLogger(WithdrawSdk.class);
 
-    private String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYT5eCY6r8sGWgbiId/VqSZmS6XkBNGMkzUqTIkpkecOzsFBxFXTQmgDeR991YfgqmyOaHsJ/ons/H+e8l+RmHsOm4eErFU+9qXFq+k195YFV1vAR9O7MIG+FR5vmLDuhgimPsgqscWhUrGinc8RUpi5KwClgx7d+d8ZJ4GmkR0QIDAQAB";
-    private String md5Key = "0fd42370bad6485e46718b97f3dd1536";
-    private String notifyUrl = "http://47.114.1.200:8000/teacher-server/withdraw/callback";//回调地址
-    private String memberNo = "1491663782974988288";//商户号
-    private String apiUrl = "http://39.107.15.64:8090";//第三方url
+    @Autowired
+    private WithdrawalProperties withdrawalProperties;
 
     /**
      * 单笔提现
@@ -35,35 +37,34 @@ public class Withdraw {
      * @param certificateNo 收款方身份证号
      * @param predictAmount 应发金额(单位为:分,范围: 1~10000000000)
      * @param payAccount    收款方账号(银行卡号/支付宝账号 /open_id)以实际业务为准
-     * @param cardType      卡类型:DC 借记卡
-     * @param salaryType    发放类型(0:个人经营所得)
-     * @param projectName   项目名称
-     * @param payType       支付类型(1:银行卡,2:支付宝,4:微信) 以实际业务为准
-     * @param cardAttribute 卡属性:(C:对私)
      * @param remark        备注(扩展字段) 只针对测试环境:只要参数合规都会返回交易成功,如果想要模拟交易失败,该字段值中含有“失败”二字即会失败。
      * @return
      */
-    public String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, String predictAmount,
-                           String payAccount, String cardType, String salaryType, String projectName, String payType, String cardAttribute, String remark) {
+    public String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount,
+                           String payAccount, String remark) {
         Map<String, Object> map = new HashMap<>();
-        map.put("outMemberNo", memberNo);
+        map.put("outMemberNo", withdrawalProperties.getMemberNo());
         map.put("outerOrderNo", outerOrderNo);
         map.put("name", name);
         map.put("certificateNo", certificateNo);
         map.put("predictAmount", predictAmount);
-        String signs = Md5EncryptUtils.sign(map, md5Key);
+        String signs = Md5EncryptUtils.sign(map, withdrawalProperties.getMd5Key());
 
         map.put("charset", "UTF-8");
         map.put("mobile", mobile);
         map.put("version", "1.1");
         map.put("service", "bpotop.zx.pay.order");
         map.put("Md5Key", signs);
-        map.put("notifyUrl", notifyUrl);
-        map.put("cardType", cardType);
-        map.put("salaryType", salaryType);
-        map.put("projectName", projectName);
-        map.put("payType", payType);
-        map.put("cardAttribute", cardAttribute);
+        map.put("notifyUrl", withdrawalProperties.getNotifyUrl());
+        //卡类型 DC 借记卡
+        map.put("cardType", "DC");
+        //输入发放类型(0:工资,1:奖金,2:绩效,3:劳务,4:个人经营所得,5:其他)
+        map.put("salaryType", 4);
+        map.put("projectName", name + DateUtil.format(new Date(), DateUtil.DEFAULT_PATTERN) + "提现");
+        //支付类型(1:银行卡,2:支付宝,4:微信) 以实际业务为准
+        map.put("payType", 1);
+        //卡属性:(C:对私)
+        map.put("cardAttribute", "C");
         map.put("payAccount", payAccount);
         if (StringUtils.isNotBlank(remark)) {
             map.put("remark", remark);
@@ -74,8 +75,8 @@ public class Withdraw {
         JSONObject mapParam = new JSONObject();
         try {
             //使用公钥加密
-            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
-            mapParam.put("outMemberNo", memberNo);
+            String encryptStr = RSA.encryptPub(jsonStr, withdrawalProperties.getPublicKey());
+            mapParam.put("outMemberNo", withdrawalProperties.getMemberNo());
             mapParam.put("signType", "RSA");
             mapParam.put("sign", encryptStr);
             logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(mapParam));
@@ -85,7 +86,7 @@ public class Withdraw {
 
         //发送
         try {
-            String resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
+            String resultJsonStr = HttpUtil.postForHttp(withdrawalProperties.getApiUrl() + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
             logger.info("单笔请求返回参数:{}", resultJsonStr);
             return resultJsonStr;
         } catch (IOException e) {
@@ -102,51 +103,21 @@ public class Withdraw {
      */
     public void query(String outerOrderNo) throws Exception {
         Map<String, Object> requestMap = new HashMap<>();
-        requestMap.put("outMemberNo", memberNo);
+        requestMap.put("outMemberNo", withdrawalProperties.getMemberNo());
         requestMap.put("outerOrderNo", outerOrderNo);
         requestMap.put("service", "bpotop.zx.pay.order");
         requestMap.put("version", "1.0");
         requestMap.put("signType", "RSA");
         requestMap.put("charset", "UTF-8");
         String jsonStr = JSONObject.toJSONString(requestMap);
-        String encryptStr = RSA.encryptPub(jsonStr, publicKey);
+        String encryptStr = RSA.encryptPub(jsonStr, withdrawalProperties.getPublicKey());
 
         Map<String, Object> requestMap2 = new HashMap<>();
-        requestMap2.put("outMemberNo", memberNo);
+        requestMap2.put("outMemberNo", withdrawalProperties.getMemberNo());
         requestMap2.put("sign", encryptStr);
         logger.info("单笔查询请求参数:{}", JSONObject.toJSONString(requestMap2));
-        String resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
+        String resultJsonStr = HttpUtil.postForHttp(withdrawalProperties.getApiUrl() + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
         logger.info("单笔查询响应参数:{}", resultJsonStr);
     }
 
-    public static void main(String[] args) throws Exception {
-        Withdraw withdraw = new Withdraw();
-
-        //输入商户订单号
-        String outerOrderNo = UUID.randomUUID().toString().substring(0, 12);
-        //输入收款人手机号
-        String name = "何亮";
-        //输入收款人姓名
-        String mobile = "17600220933";
-        //输入收款人身份证号
-        String certificateNo = "130423199206192818";
-        //输入转账金额(单位分)
-        String predictAmount = "1";
-        //输入收款人账号
-        String payAccount = "6228480018864836772";
-        //输入卡类型:DC借记卡,CC信用卡(暂不支持)
-        String cardType = "DC";
-        //输入发放类型(0:工资,1:奖金,2:绩效,3:劳务,4:个人经营所得,5:其他)
-        String salaryType = "4";
-        //输入项目名称
-        String projectName = "测试";
-        //输入支付类型(1:银行卡)
-        String payType = "1";
-        //输入卡属性:(C:对私 ,B:对公)暂时不支持对公
-        String cardAttribute = "C";
-
-        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount, payAccount, cardType,
-                salaryType, projectName, payType, cardAttribute,null);
-        logger.info("单笔请求返回参数:{}", requestParam);
-    }
 }

+ 47 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LingXinService.java

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+/**
+ * @author: cy
+ * @date: 2022/5/18 14:52
+ */
+public interface LingXinService {
+    /**
+     * 签署协议
+     *
+     * @param realName 真实姓名
+     * @param idcard   身份证号
+     * @param mobileNo 手机号
+     * @param serialNo 唯一标识
+     * @return
+     */
+    boolean signContract(String realName, String idcard, String mobileNo, String serialNo);
+
+    /**
+     * 查询协议
+     *
+     * @param serialNo 唯一标识
+     * @return
+     */
+    String querySignContractResult(String serialNo);
+
+    /**
+     * 单笔提现
+     *
+     * @param outerOrderNo  唯一单号
+     * @param name          收款方姓名
+     * @param mobile        收款方电话
+     * @param certificateNo 收款方身份证号
+     * @param predictAmount 应发金额(单位为:分,范围: 1~10000000000)
+     * @param payAccount    收款方银行卡号
+     * @return
+     */
+    String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount, String payAccount);
+
+    /**
+     * 查询接口
+     *
+     * @param outerOrderNo 商户唯一订单号
+     * @throws Exception
+     */
+    String query(String outerOrderNo);
+}

+ 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);
 }

+ 11 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java

@@ -2,8 +2,10 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
+import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
@@ -53,12 +55,18 @@ public interface UserWithdrawalService extends IService<UserWithdrawal>  {
 	/***
 	 * 用户发起提现申请
 	 * @author liweifan
-	 * @param: userId
+	 * @param: user
 	 * @param: withdrawalReq
 	 * @updateTime 2022/4/7 15:26
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
-	HttpResponseResult<Boolean> withdrawal(Long userId, WithdrawalReq withdrawalReq);
+	HttpResponseResult<Boolean> withdrawal(SysUser user, WithdrawalReq withdrawalReq);
+
+	/**
+	 * 提现回调
+	 * @param callback
+	 */
+	void callback(UserWithdrawalCallback callback,String jsonStr);
 
 	/***
 	 * 导入
@@ -67,5 +75,5 @@ public interface UserWithdrawalService extends IService<UserWithdrawal>  {
 	 * @updateTime 2022/4/20 9:45
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.util.List<com.yonge.toolset.utils.easyexcel.ErrMsg>>
 	 */
-    void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId);
+    /*void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId);*/
 }

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

@@ -0,0 +1,236 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSONPath;
+import com.yonge.cooleshow.biz.dal.service.LingXinService;
+import com.yonge.toolset.base.exception.ThirdpartyException;
+import com.yonge.toolset.thirdparty.lingxinpay.Md5EncryptUtils;
+import com.yonge.toolset.thirdparty.lingxinpay.RSA;
+import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.http.HttpUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: cy
+ * @date: 2022/5/18 14:54
+ */
+@Service("lingXinService")
+public class LingXinServiceImpl implements LingXinService {
+    private static final Logger logger = LoggerFactory.getLogger(LingXinServiceImpl.class);
+
+    @Value("${withdraw.publicKey}")
+    private String publicKey;
+    @Value("${withdraw.md5Key}")
+    private String md5Key;
+    @Value("${withdraw.memberNo}")
+    private String memberNo;// 商户号
+    @Value("${withdraw.contractNo}")
+    private String contractNo;// 模板协议号
+    @Value("${withdraw.contractNotifyUrl}")
+    private String contractNotifyUrl;//签署协议回调地址
+    @Value("${withdraw.contractApiUrl}")
+    private String contractApiUrl;//签署协议url
+    @Value("${withdraw.notifyUrl}")
+    private String notifyUrl;//提现回调地址
+    @Value("${withdraw.apiUrl}")
+    private String apiUrl;//提现第三方url
+
+    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+    /**
+     * 签署协议
+     *
+     * @param realName 真实姓名
+     * @param idcard   身份证号
+     * @param mobileNo 手机号
+     * @param serialNo 唯一标识
+     * @return
+     */
+    public boolean signContract(String realName, String idcard, String mobileNo, String serialNo) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("signType", "RSA");
+        jsonObject.put("service", "bpotop.zx.contract");
+        jsonObject.put("charset", "UTF-8");
+        jsonObject.put("version", "1.0");
+        jsonObject.put("createTime", sdf.format(new Date()));
+
+        jsonObject.put("outMemberNo", memberNo);// 公司商户号
+        jsonObject.put("serialNo", serialNo);// 流水号(商户唯一标识)
+        jsonObject.put("contractNo", contractNo);// 合同模板号
+        jsonObject.put("notifyUrl", contractNotifyUrl);// 返回结果异步通知地址
+
+        JSONObject jsonObject2 = new JSONObject();
+        jsonObject2.put("name", realName);
+        jsonObject2.put("phone", mobileNo);
+        jsonObject2.put("identityId", idcard);
+        jsonObject2.put("citizenship", "0");
+        jsonObject2.put("signTime", sdf.format(new Date()));
+        jsonObject.put("contractSignInfo", jsonObject2);
+        String jsonStr = JSONObject.toJSONString(jsonObject);
+
+        try {
+            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
+            jsonObject.put("sign", encryptStr);
+        } catch (Exception e) {
+            logger.error("加密失败", e);
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+        logger.info("[合同签署]请求参数:{}", jsonObject.toJSONString());
+        try {
+            String s = HttpUtil.postForHttp(contractApiUrl + "/api/signContract", jsonObject.toJSONString(), null);
+            logger.info("请求[合同签署]响应参数:{}", s);
+
+            jsonObject = JSONObject.parseObject(s);
+            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
+                return true;
+            }
+            throw new ThirdpartyException("合同签署失败:{}", jsonObject.getString("content"));
+        } catch (IOException e) {
+            logger.error("请求[合同签署]接口报错", e);
+            throw new ThirdpartyException("请求[合同签署]接口报错:{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 查询协议
+     *
+     * @param serialNo 唯一标识
+     * @return
+     */
+    public String querySignContractResult(String serialNo) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("outMemberNo", memberNo);
+        jsonObject.put("serialNo", serialNo);
+        jsonObject.put("contractNo", contractNo);
+        try {
+            String encryptStr = RSA.encryptPub(JSONObject.toJSONString(jsonObject), publicKey);
+            jsonObject.put("sign", encryptStr);
+        } catch (Exception e) {
+            logger.error("加密失败", e);
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+        jsonObject.put("signType", "RSA");
+        jsonObject.put("service", "bpotop.zx.contract");
+        jsonObject.put("charset", "UTF-8");
+        jsonObject.put("version", "1.0");
+        jsonObject.put("createTime", sdf.format(new Date()));
+        try {
+            String s = HttpUtil.postForHttp(contractApiUrl + "/api/queryContractInfo", jsonObject.toJSONString(), null);
+            logger.info("[合同查询]响应参数:{}", s);
+
+            jsonObject = JSONObject.parseObject(s);
+            if (StringUtils.equals(jsonObject.getString("return_code"), "T")) {
+                return (String) JSONPath.eval(jsonObject, "$.content.contractUrl");
+            }
+        } catch (IOException e) {
+            logger.error("请求[合同查询]接口报错", e);
+        }
+        return null;
+    }
+
+    /**
+     * 单笔提现
+     *
+     * @param outerOrderNo  商户唯一订单号
+     * @param name          收款方姓名(银行预留姓名等)
+     * @param mobile        收款方电话
+     * @param certificateNo 收款方身份证号
+     * @param predictAmount 应发金额(单位为:分,范围: 1~10000000000)
+     * @param payAccount    收款方账号(银行卡号/支付宝账号 /open_id)以实际业务为准
+     * @return
+     */
+    public String withdraw(String outerOrderNo, String name, String mobile, String certificateNo, Integer predictAmount,
+                           String payAccount) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("outMemberNo", memberNo);
+        map.put("outerOrderNo", outerOrderNo);
+        map.put("name", name);
+        map.put("certificateNo", certificateNo);
+        map.put("predictAmount", predictAmount);
+        String signs = Md5EncryptUtils.sign(map, md5Key);
+
+        map.put("charset", "UTF-8");
+        map.put("mobile", mobile);
+        map.put("version", "1.1");
+        map.put("service", "bpotop.zx.pay.order");
+        map.put("Md5Key", signs);
+        map.put("notifyUrl", notifyUrl);
+        map.put("cardType", "DC");
+        map.put("salaryType", "4");
+        map.put("projectName", name + "-" + DateUtil.getStrDate());
+        map.put("payType", "1");
+        map.put("cardAttribute", "C");
+        map.put("payAccount", payAccount);
+        String jsonStr = JSONObject.toJSONString(map);
+
+        //签名
+        JSONObject mapParam = new JSONObject();
+        try {
+            //使用公钥加密
+            String encryptStr = RSA.encryptPub(jsonStr, publicKey);
+            mapParam.put("outMemberNo", memberNo);
+            mapParam.put("signType", "RSA");
+            mapParam.put("sign", encryptStr);
+            logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(mapParam));
+        } catch (Exception e) {
+            logger.info("加密失败:{}", e);
+        }
+
+        //发送
+        try {
+            String resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/single", JSONObject.toJSONString(mapParam), null);
+            logger.info("单笔请求返回参数:{}", resultJsonStr);
+            return resultJsonStr;
+        } catch (IOException e) {
+            logger.info("发送失败:{}", e);
+        }
+        return null;
+    }
+
+    /**
+     * 查询接口
+     *
+     * @param outerOrderNo 商户唯一订单号
+     * @throws Exception
+     */
+    public String query(String outerOrderNo) {
+        Map<String, Object> requestMap = new HashMap<>();
+        requestMap.put("outMemberNo", memberNo);
+        requestMap.put("outerOrderNo", outerOrderNo);
+        requestMap.put("service", "bpotop.zx.pay.order");
+        requestMap.put("version", "1.0");
+        requestMap.put("signType", "RSA");
+        requestMap.put("charset", "UTF-8");
+        String jsonStr = JSONObject.toJSONString(requestMap);
+        String encryptStr = null;
+        try {
+            encryptStr = RSA.encryptPub(jsonStr, publicKey);
+        } catch (Exception e) {
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+
+        Map<String, Object> requestMap2 = new HashMap<>();
+        requestMap2.put("outMemberNo", memberNo);
+        requestMap2.put("sign", encryptStr);
+        logger.info("单笔查询请求参数:{}", JSONObject.toJSONString(requestMap2));
+        String resultJsonStr = null;
+        try {
+            resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/order_query", JSONObject.toJSONString(requestMap2), null);
+            logger.info("单笔查询响应参数:{}", resultJsonStr);
+            return resultJsonStr;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

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

@@ -46,7 +46,7 @@ public class TeacherFreeTimeServiceImpl extends ServiceImpl<TeacherFreeTimeDao,
                 teacherFreeTime.getFreeMinutes());
         System.out.println(teacherFreeTime.getMonday());
         //结束时间减去休息时间
-        if (StringUtil.isNotBlank(teacherFreeTime.getMonday())){
+/*        if (StringUtil.isNotBlank(teacherFreeTime.getMonday())){
             teacherFreeTime.setMonday(timeOffSet(teacherFreeTime.getMonday(), teacherFreeTime.getFreeMinutes()));
         }
         if (StringUtil.isNotBlank(teacherFreeTime.getTuesday())){
@@ -66,7 +66,7 @@ public class TeacherFreeTimeServiceImpl extends ServiceImpl<TeacherFreeTimeDao,
         }
         if (StringUtil.isNotBlank(teacherFreeTime.getSunday())){
             teacherFreeTime.setSunday(timeOffSet(teacherFreeTime.getSunday(),teacherFreeTime.getFreeMinutes()));
-        }
+        }*/
 
         //删除原有设置
         if(Objects.nonNull(oldTeacherFreeTime)){

+ 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();
     }
+
 }

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

@@ -2,16 +2,19 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
-import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
+import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
+import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
+import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
-import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
@@ -19,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;
@@ -27,6 +31,7 @@ import com.yonge.toolset.utils.string.ValueUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -52,7 +57,10 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     private UserAccountService userAccountService;
     @Autowired
     private SysConfigService sysConfigService;
-
+    @Autowired
+    private WithdrawalProperties withdrawalProperties;
+    @Autowired
+    private WithdrawSdk withdrawSdk;
 
     @Override
     public UserWithdrawalVo detail(Long id) {
@@ -91,34 +99,40 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<Boolean> withdrawal(Long userId, WithdrawalReq withdrawalReq) {
+    public HttpResponseResult<Boolean> withdrawal(SysUser user, WithdrawalReq withdrawalReq) {
         BigDecimal withdrawalServiceFee = getWithdrawalServiceFee();
         //校验金额
         if (withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee).floatValue() < 0) {
             return HttpResponseResult.failed("提现金额过小");
         }
         //获取用户提现金额
-        BigDecimal amountWithdrawal = getAmountUsable(userId);
+        BigDecimal amountWithdrawal = getAmountUsable(user.getId());
         //比较大小
         if (amountWithdrawal.compareTo(withdrawalReq.getAmountWithdrawal()) < 0) {
             return HttpResponseResult.failed("账户余额不足");
         }
         //获取提现银行卡
-        UserBankCardVo bankCardVo = bankCardDao.getBankByUserIdAndCardId(userId, withdrawalReq.getBankCardId());
+        UserBankCardVo bankCardVo = bankCardDao.getBankByUserIdAndCardId(user.getId(), withdrawalReq.getBankCardId());
         if (null == bankCardVo) {
             return HttpResponseResult.failed("未找到用户绑卡信息");
         }
+
         //插入用户提现表
-        UserWithdrawal userWithdrawal = insertUserWithdrawal(userId, withdrawalReq, bankCardVo, withdrawalServiceFee);
+        UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee);
         //插入账户变更
         UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                userId, withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+                user.getId(), withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
                 userWithdrawal.getId(), "老师提现", null
         );
         accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
         accountRecordDto.setSaveRecord(false);
         HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
         if (accountChange.getStatus()) {
+            //请求三方接口
+            withdrawSdk.withdraw(
+                    userWithdrawal.getId().toString(), bankCardVo.getName(), bankCardVo.getPhone(), user.getIdCardNo(),
+                    amountWithdrawal.multiply(new BigDecimal("100")).intValue(), bankCardVo.getBankCard(), null
+            );
             return HttpResponseResult.succeed(true);
         } else {
             throw new BizException("提现失败");
@@ -127,6 +141,58 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void callback(UserWithdrawalCallback callback, String jsonStr) {
+        if (StringUtil.isEmpty(callback.getOuterOrderNo()) ||
+                StringUtil.isEmpty(callback.getStatus())) {
+            throw new BizException("参数异常,参数缺失,param is {}", jsonStr);
+        }
+        UserWithdrawalVo detail = detail(Long.parseLong(callback.getOuterOrderNo().trim()));
+        if (null == detail) {
+            throw new BizException("参数异常,未找到交易记录,param is {}", jsonStr);
+        }
+        if(!TradeStatusEnum.pending.equals(detail.getStatus())){
+            return;
+        }
+        if ("1".equals(callback.getStatus())) {
+            //交易成功
+            detail.setStatus(TradeStatusEnum.succeeded);
+            detail.setTransNo(callback.getOrderNo());
+            BigDecimal actualAmount = new BigDecimal(callback.getActualAmount());
+            detail.setActualAmount(actualAmount.divide(new BigDecimal("100")));
+            detail.setTransferTime(callback.getEndTime());
+
+            //审核通过,账户解冻,入账户明细
+            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
+                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+                    detail.getId(), "老师提现", null
+            );
+            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_DEDUCT);
+            accountRecordDto.setSaveRecord(true);
+            userAccountService.accountChange(accountRecordDto);
+
+        }else if("2".equals(callback.getStatus())){
+            //交易失败
+            detail.setStatus(TradeStatusEnum.failed);
+            detail.setErrorCode(callback.getErrorCode());
+            detail.setErrorMsg(callback.getErrorMsg());
+
+            //审核不通过,账户解冻
+            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
+                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+                    detail.getId(), "老师提现", null
+            );
+            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
+            accountRecordDto.setSaveRecord(false);
+            userAccountService.accountChange(accountRecordDto);
+        }else{
+            return;
+        }
+        detail.setCallbackJson(jsonStr);
+        updateById(detail);
+    }
+
+   /* @Override
+    @Transactional(rollbackFor = Exception.class)
     public void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId) {
         List<ErrMsg> errMsgList = new ArrayList<>();
         dataList.sort(Comparator.comparingInt(ExcelDataReaderProperty::getRowIndex));
@@ -171,7 +237,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             throw new ExcelException("导入异常", errMsgList);
         }
         authWithdrawalBancth(userWithdrawalList, userId);
-    }
+    }*/
 
     /***
      * 审核
@@ -179,7 +245,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
      * @param: userWithdrawalList
      * @updateTime 2022/4/20 11:18
      */
-    private void authWithdrawalBancth(List<UserWithdrawal> userWithdrawalList, Long userId) {
+    /*private void authWithdrawalBancth(List<UserWithdrawal> userWithdrawalList, Long userId) {
         for (UserWithdrawal userWithdrawal : userWithdrawalList) {
             UserWithdrawal old = baseMapper.selectById(userWithdrawal.getId());
             if (null == old || !AuthStatusEnum.DOING.equals(old.getStatus()) || AuthStatusEnum.DOING.equals(userWithdrawal.getStatus())) {
@@ -212,7 +278,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             }
             baseMapper.updateById(userWithdrawal);
         }
-    }
+    }*/
 
     /***
      * 入提现表
@@ -229,13 +295,11 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         userWithdrawal.setUserId(userId);
         userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
         userWithdrawal.setPlantformFee(withdrawalServiceFee);
-
-        BigDecimal actualAmount = withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee);
-        userWithdrawal.setActualAmount(actualAmount);
-        userWithdrawal.setBankCard(bankCardVo.getBankCard());
+        userWithdrawal.setBankCardId(bankCardVo.getId());
+        userWithdrawal.setOpenType(withdrawalProperties.getOpenType());
+        userWithdrawal.setStatus(TradeStatusEnum.pending);
         userWithdrawal.setCreateTime(new Date());
         userWithdrawal.setUpdateTime(new Date());
-        userWithdrawal.setStatus(AuthStatusEnum.DOING);
         baseMapper.insert(userWithdrawal);
         return userWithdrawal;
     }

+ 6 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java

@@ -10,15 +10,14 @@ import io.swagger.annotations.ApiModelProperty;
  */
 @ApiModel(value = "UserWithdrawalVo对象", description = "账户提现表查询视图对象")
 public class UserWithdrawalVo extends UserWithdrawal {
-
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("银行卡号 ")
+	private String bankCard;
 	@ApiModelProperty("银行名称 ")
 	private String bankName;
 	@ApiModelProperty("提现人 ")
 	private String	withdrawaUser;
-	@ApiModelProperty("转账人 ")
-	private String verifyUser;
 
 	public String getBankName() {
 		return bankName;
@@ -36,11 +35,11 @@ public class UserWithdrawalVo extends UserWithdrawal {
 		this.withdrawaUser = withdrawaUser;
 	}
 
-	public String getVerifyUser() {
-		return verifyUser;
+	public String getBankCard() {
+		return bankCard;
 	}
 
-	public void setVerifyUser(String verifyUser) {
-		this.verifyUser = verifyUser;
+	public void setBankCard(String bankCard) {
+		this.bankCard = bankCard;
 	}
 }

+ 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>

+ 27 - 28
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml

@@ -1,43 +1,51 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserWithdrawalDao">
+
     <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserWithdrawal">
         <result column="id_" property="id" />
         <result column="user_id_" property="userId" />
         <result column="amount_" property="amount" />
         <result column="plantform_fee_" property="plantformFee" />
+        <result column="bank_card_id_" property="bankCardId" />
+        <result column="open_type_" property="openType" />
+        <result column="trans_no_" property="transNo" />
+        <result column="status_" property="status" />
         <result column="actual_amount_" property="actualAmount" />
-        <result column="bank_card_" property="bankCard" />
-        <result column="bank_flow_no_" property="bankFlowNo" />
         <result column="transfer_time_" property="transferTime" />
-        <result column="status_" property="status" />
-        <result column="verify_user_id_" property="verifyUserId" />
-        <result column="verify_reason_" property="verifyReason" />
+        <result column="error_code_" property="errorCode" />
+        <result column="error_msg_" property="errorMsg" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
     </resultMap>
 
     <!-- 表字段 -->
     <sql id="baseColumns">
-         t.id_ as id
+        t.id_ as id
         , t.user_id_ as userId
         , t.amount_ as amount
         , t.plantform_fee_ as plantformFee
+        , t.bank_card_id_ as bankCardId
+        , t.open_type_ as openType
+        , t.trans_no_ as transNo
+        , t.status_ as status
         , t.actual_amount_ as actualAmount
-        , t.bank_card_ as bankCard
-        , t.bank_flow_no_ as bankFlowNo
         , t.transfer_time_ as transferTime
-        , t.status_ as status
-        , t.verify_user_id_ as verifyUserId
-        , t.verify_reason_ as verifyReason
+        , t.error_code_ as errorCode
+        , t.error_msg_ as errorMsg
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
-        </sql>
+    </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         SELECT
-        <include refid="baseColumns"/>
+            <include refid="baseColumns"/>,
+            bc.bank_name_ as bankName,
+            bc.bank_card_ as bankCard,
+            u.username_  as withdrawaUser
         FROM user_withdrawal t
+        LEFT JOIN user_bank_card bc on t.bank_card_id_ = bc.id_ and t.user_id_ = bc.user_id_
+        left join sys_user u on t.user_id_ = u.id_
         where t.id_ = #{id}
     </select>
 
@@ -45,13 +53,11 @@
         SELECT
             <include refid="baseColumns" />,
             bc.bank_name_ as bankName,
-            u.username_  as withdrawaUser,
-            (
-                SELECT u.username_ FROM sys_user u WHERE u.id_ = t.verify_user_id_
-            ) as verifyUser
+            bc.bank_card_ as bankCard,
+            u.username_  as withdrawaUser
         FROM user_withdrawal t
-        left join sys_user u on u.id_ = t.user_id_
-        LEFT JOIN user_bank_card bc on t.bank_card_ = bc.bank_card_ and t.user_id_ = bc.user_id_ and bc.del_flag_ = 0
+        LEFT JOIN user_bank_card bc on t.bank_card_id_ = bc.id_ and t.user_id_ = bc.user_id_
+        left join sys_user u on t.user_id_ = u.id_
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
@@ -60,8 +66,8 @@
                     u.phone_ LIKE CONCAT('%', #{param.search}, '%')
                 )
             </if>
-            <if test="null != param.bankFlowNo and '' != param.bankFlowNo">
-                AND t.bank_flow_no_ LIKE CONCAT('%', #{param.bankFlowNo}, '%')
+            <if test="null != param.transNo and '' != param.transNo">
+                AND t.trans_no_ LIKE CONCAT('%', #{transNo}, '%')
             </if>
             <if test="param.startTime !=null">
                 <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
@@ -81,11 +87,4 @@
     <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         <include refid="selectSql"/>
     </select>
-
-    <insert id="withdrawSuccess" parameterType="java.util.Map">
-        INSERT INTO user_withdrawal_history
-        VALUES (#{outMemberNo},#{outerOrderNo},#{orderNo},#{name},#{mobile},#{certificateNo},
-                #{status},#{payType},#{payAccount},#{predictAmount},#{actualAmount},#{endTime})
-    </insert>
-
 </mapper>

+ 35 - 57
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,75 +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);
+    ) throws Exception {
+        BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
+                OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+        if(res.getStatus()){
+            PaymentCallBack data = res.getData();
+
+            if(MethodNameEnum.executePayment.equals(data.getMethodName())){
+                //支付交易
+                paymentService.executePaymentCallBack(data);
+            }else if(MethodNameEnum.closePayment.equals(data.getMethodName())){
+                //关闭订单
+                paymentService.closePaymentCallBack(data);
+            }else if(MethodNameEnum.refundPayment.equals(data.getMethodName())){
+                //退款
+                userOrderRefundService.refundPaymentCallBack(data);
+            }
         }
-        return null;
+        return res.getData().getResMsg();
     }
 
-    /**
-     * 原生微信支付宝回调
-     *
-     * @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);
-        }
-        return null;
-    }
+
 
     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;
-    }
 }

+ 48 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
+import com.yonge.cooleshow.biz.dal.props.WithdrawalProperties;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -13,33 +16,46 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.thirdparty.lingxinpay.RSA;
 import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.json.JsonUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/userWithdrawal")
 @Api(value = "用户账户提现表", tags = "用户账户提现表")
 public class UserWithdrawalController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(UserWithdrawalController.class);
+
     @Autowired
     private UserWithdrawalService userWithdrawalService;
+
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private WithdrawalProperties withdrawalProperties;
+
     @PostMapping("/getWithdrawalInfo")
     @ApiOperation(value = "查询提现页面信息")
     public HttpResponseResult<WithdrawalInfoRes> getWithdrawalInfo() {
@@ -57,7 +73,7 @@ public class UserWithdrawalController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return userWithdrawalService.withdrawal(user.getId(), withdrawalReq);
+        return userWithdrawalService.withdrawal(user, withdrawalReq);
     }
 
     @PostMapping("/withdrawalPage")
@@ -101,4 +117,35 @@ public class UserWithdrawalController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
+    /**
+     * 异步回调接收
+     * @param content
+     * @param request
+     * @return
+     */
+    @PostMapping("/callback")
+    public String callback(@RequestBody String content, HttpServletRequest request) {
+        log.info("交易回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
+        try {
+            if (StringUtils.isBlank(content)) {
+                throw new Exception();
+            }
+            Map<String, Object> map = JSONObject.parseObject(content);
+            String jsonStr = RSA.decryptPri((String) map.get("sign"), withdrawalProperties.getPrivateKey());
+            log.info("jsonStr:{}", jsonStr);
+
+            Map<String, Object> withdrawRecord = JSONObject.parseObject(jsonStr);
+            UserWithdrawalCallback callback = JsonUtil.toJavaObject(withdrawRecord, UserWithdrawalCallback.class);
+
+            userWithdrawalService.callback(callback, jsonStr);
+        } catch (BizException e) {
+            log.error("解密失败e:{}", e.getMessage());
+            return "failed";
+        } catch (Exception e) {
+            log.error("解密失败e:{}", e);
+            return "failed";
+        }
+        return "success";
+    }
+
 }

+ 15 - 19
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/WithdrawController.java

@@ -2,17 +2,18 @@ package com.yonge.cooleshow.teacher.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
+import com.yonge.cooleshow.biz.dal.service.LingXinService;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalCallbackService;
 import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.thirdparty.lingxinpay.RSA;
-import com.yonge.toolset.thirdparty.lingxinpay.Withdraw;
+import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.toolset.utils.json.JsonUtil;
 import io.swagger.annotations.Api;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -30,8 +31,8 @@ import java.util.UUID;
 public class WithdrawController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(WithdrawController.class);
 
-    //这里需要填写商户自己生成的私钥
-    private String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANf/X1s2raYQAmY5VY929XqOIRESFlpLzWbltA08EI2i0jnJY3/kcCpo1sCHqkyWpDFGRgM1WYE90ayzEpS6EdZpyJ2/N5JFJzx4wMil5KHLdtQUmVv9si+xuYNOKfJW6Xn6zI/Wh81J1+hMlUY4WigU5Qci7DjdOjg5OD6e5DO3AgMBAAECgYEAor9ENhII3SsK48MneKWFaQZWW+po9ThQV8uT0rUDM/UOuYPIeMDC0vGTfhW6d2K57Haqohg8jGjr51g2E+HvNV+fARaBfCwy00DGcxjI6N8gEInj2AppsGV6a0ZtzGBh3BxGhEFV7x3NmTylDk3WkGnkGDqDNyrBUgK0BzCJEmECQQD+gYckYRevVfrZEHDQHRNzzMUlV9/ljA9x8dt0LoCNbd/wFvs0Ekjhas/2lUBkewEd4Kr0jaFcYzlUO/qihcpNAkEA2UP5W44yLuIo8ttPpdsfkH/8Ax64IywQHrXWq+thH7I91VwY2vomTduw8x0PafZtp8xryF3LixTZwQ7gsYbwEwJAQbb8SB5x2SogPVALcREw5qOm+/92pnTFwCws+BDRzLLkMcAdWNKn0tybmhXrrIY+QZKzUbYIRiywrtlV3AUjuQJBAJbnFnfX4NUdchGT79Mjyd2kdxZ3rK+JOD0MUWkhWFkahMX/bKgTXK1xLIr/ISiY53rHigkl1Gzqc4Aa5EeJkI8CQFlzlBOfoVnq3fPMZCCZcZSm97L12MgHho0AzoNj9sw9YYn9WPM7bw2HT8GUheiU3aiZGCyGGpYuVHMiBGa7l9U=";
+    @Value("${withdraw.privateKey}")
+    private String privateKey;//商户自己生成的私钥
 
     @Autowired
     private UserWithdrawalCallbackService callbackService;
@@ -45,6 +46,7 @@ public class WithdrawController extends BaseController {
      */
     @PostMapping("/callback")
     public String test(@RequestBody String content, HttpServletRequest request) {
+        System.out.println(privateKey);
         log.info("交易回调请求地址:{} 请求参数:{}", request.getRemoteAddr(), content);
         try {
             if (StringUtils.isBlank(content)) {
@@ -64,10 +66,14 @@ public class WithdrawController extends BaseController {
         return "success";
     }
 
+    /**
+     * 提现测试接口
+     * @param remark
+     * @return
+     */
     @GetMapping("/test")
     public String a(String remark) {
-        Withdraw withdraw = new Withdraw();
-
+        WithdrawSdk withdraw = new WithdrawSdk();
         //输入商户订单号
         String outerOrderNo = UUID.randomUUID().toString().substring(0, 12);
         System.out.println("商户订单号:" + outerOrderNo);
@@ -78,22 +84,12 @@ public class WithdrawController extends BaseController {
         //输入收款人身份证号
         String certificateNo = "130423199206192818";
         //输入转账金额(单位分)
-        String predictAmount = "1";
+        Integer predictAmount = 1;
         //输入收款人账号
         String payAccount = "6228480018864836772";
-        //输入卡类型:DC借记卡,CC信用卡(暂不支持)
-        String cardType = "DC";
-        //输入发放类型(0:工资,1:奖金,2:绩效,3:劳务,4:个人经营所得,5:其他)
-        String salaryType = "4";
-        //输入项目名称
-        String projectName = "测试";
-        //输入支付类型(1:银行卡)
-        String payType = "1";
-        //输入卡属性:(C:对私 ,B:对公)暂时不支持对公
-        String cardAttribute = "C";
 
-        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount, payAccount, cardType,
-                salaryType, projectName, payType, cardAttribute, remark);
+        String requestParam = withdraw.withdraw(outerOrderNo, name, mobile, certificateNo, predictAmount,
+                payAccount, remark);
         log.info("单笔请求返回参数:{}", requestParam);
         return requestParam;
     }

+ 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, "解析异常");
+        }
+    }
 }

+ 7 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

@@ -1422,6 +1422,13 @@ public class DateUtil {
 		return dateStr;
 	}
 
+	public static String getStrDate() {
+		Date currentTime = new Date();
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String dateStr = simpleDateFormat.format(currentTime);
+		return dateStr;
+	}
+
 	public static void main(String[] args) throws ParseException {
 		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

+ 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();
+	}
 }