Commit 81126b2b4b9923b5f56ebdfa1783e63a6e736054

Authored by YunaiV
1 parent 711a0740

1. 引入 IJPay 组件

2. 增加创建支付单的 Service 实现
Showing 36 changed files with 586 additions and 84 deletions
yudao-admin-server/pom.xml
@@ -122,11 +122,11 @@ @@ -122,11 +122,11 @@
122 <artifactId>screw-core</artifactId> <!-- 实现数据库文档 --> 122 <artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
123 </dependency> 123 </dependency>
124 124
125 - <!-- TODO 后续看情况,进行调整 --> 125 + <!-- 三方云服务相关 -->
  126 +
126 <dependency> 127 <dependency>
127 <groupId>com.xkcoding.justauth</groupId> 128 <groupId>com.xkcoding.justauth</groupId>
128 <artifactId>justauth-spring-boot-starter</artifactId> 129 <artifactId>justauth-spring-boot-starter</artifactId>
129 - <version>1.4.0</version>  
130 </dependency> 130 </dependency>
131 </dependencies> 131 </dependencies>
132 132
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/package-info.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject;  
yudao-core-service/pom.xml
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 <groupId>cn.iocoder.boot</groupId> 32 <groupId>cn.iocoder.boot</groupId>
33 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId> 33 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
34 </dependency> 34 </dependency>
  35 + <dependency>
  36 + <groupId>cn.iocoder.boot</groupId>
  37 + <artifactId>yudao-spring-boot-starter-biz-pay</artifactId>
  38 + </dependency>
35 39
36 <!-- Web 相关 --> 40 <!-- Web 相关 -->
37 <dependency> 41 <dependency>
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/config/InfConfigDO.java
@@ -11,7 +11,7 @@ import lombok.ToString; @@ -11,7 +11,7 @@ import lombok.ToString;
11 /** 11 /**
12 * 参数配置表 12 * 参数配置表
13 * 13 *
14 - * @author ruoyi 14 + * @author 芋道源码
15 */ 15 */
16 @TableName("inf_config") 16 @TableName("inf_config")
17 @Data 17 @Data
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/order/PayOrderCoreServiceConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.convert.order;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface PayOrderCoreServiceConvert {
  10 +
  11 + PayOrderCoreServiceConvert INSTANCE = Mappers.getMapper(PayOrderCoreServiceConvert.class);
  12 +
  13 + PayOrderDO convert(PayOrderCreateReqDTO bean);
  14 +
  15 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
  6 +package cn.iocoder.yudao.coreservice.modules.pay.convert;
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayAppDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayAppDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
@@ -23,11 +23,6 @@ public class PayAppDO extends BaseDO { @@ -23,11 +23,6 @@ public class PayAppDO extends BaseDO {
23 @TableId 23 @TableId
24 private Long id; 24 private Long id;
25 /** 25 /**
26 - * 应用号  
27 - * 例如说,60cc81e0e4b06afc4d3f0cfq  
28 - */  
29 - private String no;  
30 - /**  
31 * 应用名 26 * 应用名
32 */ 27 */
33 private String name; 28 private String name;
@@ -46,6 +41,14 @@ public class PayAppDO extends BaseDO { @@ -46,6 +41,14 @@ public class PayAppDO extends BaseDO {
46 * TODO 芋艿:用途 41 * TODO 芋艿:用途
47 */ 42 */
48 private String secret; 43 private String secret;
  44 + /**
  45 + * 支付结果的回调地址
  46 + */
  47 + private String payNotifyUrl;
  48 + /**
  49 + * 退款结果的回调地址
  50 + */
  51 + private String refundNotifyUrl;
49 52
50 /** 53 /**
51 * 商户编号 54 * 商户编号
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayChannelDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; 3 +import cn.iocoder.yudao.coreservice.modules.pay.enums.merchant.PayChannelCodeEnum;
4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 import lombok.Data; 6 import lombok.Data;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayMerchantDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayMerchantDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayNotifyDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayNotifyDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import lombok.Data; 4 import lombok.Data;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayOrderDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayAppDO;  
4 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayChannelDO;  
5 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayMerchantDO;  
6 -import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; 3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO;
  5 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  6 +import cn.iocoder.yudao.coreservice.modules.pay.enums.merchant.PayChannelCodeEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum;
7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 8 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  9 +import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.Data; 10 import lombok.Data;
  11 +import lombok.EqualsAndHashCode;
  12 +import lombok.ToString;
9 13
10 import java.util.Date; 14 import java.util.Date;
11 15
@@ -14,19 +18,22 @@ import java.util.Date; @@ -14,19 +18,22 @@ import java.util.Date;
14 * 18 *
15 * @author 芋道源码 19 * @author 芋道源码
16 */ 20 */
  21 +@TableName("pay_order")
17 @Data 22 @Data
  23 +@EqualsAndHashCode(callSuper = true)
  24 +@ToString(callSuper = true)
18 public class PayOrderDO extends BaseDO { 25 public class PayOrderDO extends BaseDO {
19 26
20 /** 27 /**
21 * 订单编号,数据库自增 28 * 订单编号,数据库自增
22 */ 29 */
23 private Long id; 30 private Long id;
24 - /**  
25 - * 订单号,根据规则生成  
26 - *  
27 - * 例如说,P202110132239124200055  
28 - */  
29 - private String no; 31 +// /**
  32 +// * 订单号,根据规则生成
  33 +// *
  34 +// * 例如说,P202110132239124200055
  35 +// */
  36 +// private String no;
30 /** 37 /**
31 * 商户编号 38 * 商户编号
32 * 39 *
@@ -42,7 +49,7 @@ public class PayOrderDO extends BaseDO { @@ -42,7 +49,7 @@ public class PayOrderDO extends BaseDO {
42 /** 49 /**
43 * 渠道编号 50 * 渠道编号
44 * 51 *
45 - * 关联 {@link PayChannelDO#getMerchantId()} 52 + * 关联 {@link PayChannelDO#getId()}
46 */ 53 */
47 private Long channelId; 54 private Long channelId;
48 /** 55 /**
@@ -55,10 +62,10 @@ public class PayOrderDO extends BaseDO { @@ -55,10 +62,10 @@ public class PayOrderDO extends BaseDO {
55 // ========== 商户相关字段 ========== 62 // ========== 商户相关字段 ==========
56 63
57 /** 64 /**
58 - * 商户订单号 65 + * 商户订单编号
59 * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一 TODO 芋艿:需要在测试下 66 * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一 TODO 芋艿:需要在测试下
60 */ 67 */
61 - private String merchantOrderNo; 68 + private String merchantOrderId;
62 /** 69 /**
63 * 商品标题 70 * 商品标题
64 */ 71 */
@@ -71,11 +78,6 @@ public class PayOrderDO extends BaseDO { @@ -71,11 +78,6 @@ public class PayOrderDO extends BaseDO {
71 * 商户拓展参数 78 * 商户拓展参数
72 */ 79 */
73 private String merchantExtra; 80 private String merchantExtra;
74 - /**  
75 - * 通知商户支付结果的回调状态  
76 - * TODO 芋艿:0 未发送 1 已发送  
77 - */  
78 - private Integer notifyStatus;  
79 81
80 // ========== 订单相关字段 ========== 82 // ========== 订单相关字段 ==========
81 83
@@ -96,10 +98,15 @@ public class PayOrderDO extends BaseDO { @@ -96,10 +98,15 @@ public class PayOrderDO extends BaseDO {
96 /** 98 /**
97 * 支付状态 99 * 支付状态
98 * 100 *
99 - * TODO 芋艿:状态枚举 101 + * 枚举 {@link PayOrderStatusEnum}
100 */ 102 */
101 private Integer status; 103 private Integer status;
102 /** 104 /**
  105 + * 通知商户支付结果的回调状态
  106 + * TODO 芋艿:0 未发送 1 已发送
  107 + */
  108 + private Integer notifyStatus;
  109 + /**
103 * 客户端 IP 110 * 客户端 IP
104 */ 111 */
105 private String clientIp; 112 private String clientIp;
@@ -110,7 +117,7 @@ public class PayOrderDO extends BaseDO { @@ -110,7 +117,7 @@ public class PayOrderDO extends BaseDO {
110 /** 117 /**
111 * 订单失效时间 118 * 订单失效时间
112 */ 119 */
113 - private Date expiredTime; 120 + private Date expireTime;
114 /** 121 /**
115 * 支付渠道的额外参数 122 * 支付渠道的额外参数
116 * 123 *
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderExtensionDO.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.TableName;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.experimental.Accessors;
  8 +
  9 +/**
  10 + * 交易扩展表
  11 + */
  12 +@TableName("pay_transaction_extension")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@Accessors(chain = true)
  16 +public class PayOrderExtensionDO extends BaseDO {
  17 +
  18 + /**
  19 + * 编号,自增
  20 + */
  21 + private Integer id;
  22 + /**
  23 + * 交易编号 {@link PayTransactionDO#getId()}
  24 + */
  25 + private Integer transactionId;
  26 + /**
  27 + * 选择的支付渠道
  28 + */
  29 + private Integer payChannel;
  30 + /**
  31 + * 生成传输给第三方的订单号
  32 + *
  33 + * 唯一索引
  34 + */
  35 + private String transactionCode;
  36 + /**
  37 + * 扩展内容
  38 + *
  39 + * 异步通知的时候填充回调的数据
  40 + */
  41 + private String extensionData;
  42 + /**
  43 + * 发起交易的 IP
  44 + */
  45 + private String createIp;
  46 + /**
  47 + * 状态
  48 + *
  49 + * @see cn.iocoder.mall.payservice.enums.transaction.PayTransactionStatusEnum
  50 + * 注意,只包含上述枚举的 WAITING 和 SUCCESS
  51 + */
  52 + private Integer status;
  53 +
  54 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayRefundDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayRefundDO.java
1 -package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; 1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayAppDO;  
4 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayChannelDO;  
5 -import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayMerchantDO;  
6 -import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; 3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO;
  5 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  6 +import cn.iocoder.yudao.coreservice.modules.pay.enums.merchant.PayChannelCodeEnum;
7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
8 import lombok.Data; 8 import lombok.Data;
9 9
@@ -45,7 +45,7 @@ public class PayRefundDO extends BaseDO { @@ -45,7 +45,7 @@ public class PayRefundDO extends BaseDO {
45 /** 45 /**
46 * 渠道编号 46 * 渠道编号
47 * 47 *
48 - * 关联 {@link PayChannelDO#getMerchantId()} 48 + * 关联 {@link PayChannelDO#getId()}
49 */ 49 */
50 private Long channelId; 50 private Long channelId;
51 /** 51 /**
@@ -80,6 +80,11 @@ public class PayRefundDO extends BaseDO { @@ -80,6 +80,11 @@ public class PayRefundDO extends BaseDO {
80 */ 80 */
81 private Integer status; 81 private Integer status;
82 /** 82 /**
  83 + * 通知商户退款结果的回调状态
  84 + * TODO 芋艿:0 未发送 1 已发送
  85 + */
  86 + private Integer notifyStatus;
  87 + /**
83 * 客户端 IP 88 * 客户端 IP
84 */ 89 */
85 private String clientIp; 90 private String clientIp;
@@ -98,7 +103,7 @@ public class PayRefundDO extends BaseDO { @@ -98,7 +103,7 @@ public class PayRefundDO extends BaseDO {
98 /** 103 /**
99 * 退款失效时间 104 * 退款失效时间
100 */ 105 */
101 - private Date expiredTime; 106 + private Date expireTime;
102 /** 107 /**
103 * 支付渠道的额外参数 108 * 支付渠道的额外参数
104 * 109 *
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject;
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayAppCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface PayAppCoreMapper extends BaseMapperX<PayAppDO> {
  9 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +@Mapper
  9 +public interface PayOrderCoreMapper extends BaseMapperX<PayOrderDO> {
  10 +
  11 + default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) {
  12 + return selectOne(new QueryWrapper<PayOrderDO>().eq("app_id", appId)
  13 + .eq("merchant_order_id", merchantOrderId));
  14 + }
  15 +
  16 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * Pay 错误码枚举类
  7 + *
  8 + * pay 系统,使用 1-007-000-000 段
  9 + */
  10 +public interface PayErrorCodeConstants {
  11 +
  12 + // ========== APP 模块 1-007-000-000 ==========
  13 + ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在");
  14 + ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用");
  15 +
  16 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/merchant/PayChannelCodeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.enums.merchant;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 支付渠道的编码的枚举
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum PayChannelCodeEnum {
  14 +
  15 + wx_pub("wx_pub", "微信 JSAPI 支付");
  16 +
  17 + /**
  18 + * 编码
  19 + *
  20 + * 参考 https://www.pingxx.com/api/支付渠道属性值.html
  21 + */
  22 + private String code;
  23 + /**
  24 + * 名字
  25 + */
  26 + private String name;
  27 +
  28 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/order/PayOrderStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.enums.order;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +/**
  8 + * 支付订单的状态枚举
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Getter
  13 +@AllArgsConstructor
  14 +public enum PayOrderStatusEnum implements IntArrayValuable {
  15 +
  16 + WAITING(0, "未支付"),
  17 + SUCCESS(10, "支付成功"),
  18 + CLOSED(20, "支付关闭"), // 未付款交易超时关闭,或支付完成后全额退款 TODO 芋艿:需要优化下
  19 + ;
  20 +
  21 + private final Integer status;
  22 + private final String name;
  23 +
  24 + @Override
  25 + public int[] array() {
  26 + return new int[0];
  27 + }
  28 +
  29 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/package-info.java 0 → 100644
  1 +/**
  2 + * pay 包下,我们放支付业务,提供业务的支付能力。
  3 + * 例如说:商户、应用、支付、退款等等
  4 + *
  5 + * 缩写:pay
  6 + */
  7 +package cn.iocoder.yudao.coreservice.modules.pay;
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/PayAppCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.merchant;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  4 +import cn.iocoder.yudao.framework.common.exception.ServiceException;
  5 +
  6 +/**
  7 + * 支付应用 Core Service 接口
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +public interface PayAppCoreService {
  12 +
  13 + /**
  14 + * 支付应用的合法性
  15 + *
  16 + * 如果不合法,抛出 {@link ServiceException} 业务异常
  17 + *
  18 + * @param id 应用编号
  19 + * @return 应用信息
  20 + */
  21 + PayAppDO validPayApp(Long id);
  22 +
  23 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/merchant/impl/PayAppCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.merchant.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.merchant.PayAppCoreMapper;
  5 +import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayAppCoreService;
  6 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.springframework.stereotype.Service;
  9 +
  10 +import javax.annotation.Resource;
  11 +import javax.validation.Valid;
  12 +
  13 +import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeConstants.*;
  14 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  15 +
  16 +/**
  17 + * 支付应用 Core Service 实现类
  18 + *
  19 + * @author 芋道源码
  20 + */
  21 +@Service
  22 +@Valid
  23 +@Slf4j
  24 +public class PayAppCoreServiceImpl implements PayAppCoreService {
  25 +
  26 + @Resource
  27 + private PayAppCoreMapper payAppCoreMapper;
  28 +
  29 + @Override
  30 + public PayAppDO validPayApp(Long id) {
  31 + PayAppDO app = payAppCoreMapper.selectById(id);
  32 + // 校验是否存在
  33 + if (app == null) {
  34 + throw exception(PAY_APP_NOT_FOUND);
  35 + }
  36 + // 校验是否禁用
  37 + if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) {
  38 + throw exception(PAY_APP_IS_DISABLE);
  39 + }
  40 + return app;
  41 + }
  42 +
  43 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.order;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
  5 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
  6 +
  7 +import javax.validation.Valid;
  8 +
  9 +/**
  10 + * 支付订单 Core Service
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface PayOrderCoreService {
  15 +
  16 + /**
  17 + * 创建支付单
  18 + *
  19 + * @param reqDTO 创建请求
  20 + * @return 支付单编号
  21 + */
  22 + Long createPayOrder(@Valid PayOrderCreateReqDTO reqDTO);
  23 +
  24 + /**
  25 + * 提交支付
  26 + * 此时,会发起支付渠道的调用
  27 + *
  28 + * @param reqDTO 提交请求
  29 + * @return 提交结果
  30 + */
  31 + PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO);
  32 +
  33 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderCreateReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto;
  2 +
  3 +import lombok.Data;
  4 +import org.hibernate.validator.constraints.Length;
  5 +
  6 +import javax.validation.constraints.DecimalMin;
  7 +import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
  9 +import java.io.Serializable;
  10 +import java.util.Date;
  11 +
  12 +/**
  13 + * 支付单创建 Request DTO
  14 + */
  15 +@Data
  16 +public class PayOrderCreateReqDTO implements Serializable {
  17 +
  18 + /**
  19 + * 应用编号
  20 + */
  21 + @NotEmpty(message = "应用编号不能为空")
  22 + private Long appId;
  23 + /**
  24 + * 客户端 IP
  25 + */
  26 + @NotEmpty(message = "客户端 IP 不能为空")
  27 + private String clientIp;
  28 +
  29 + // ========== 商户相关字段 ==========
  30 +
  31 + /**
  32 + * 商户订单编号
  33 + */
  34 + @NotEmpty(message = "商户订单编号不能为空")
  35 + private String merchantOrderId;
  36 + /**
  37 + * 商品标题
  38 + */
  39 + @NotEmpty(message = "商品标题不能为空")
  40 + @Length(max = 32, message = "商品标题不能超过 32")
  41 + private String subject;
  42 + /**
  43 + * 商品描述信息
  44 + */
  45 + @NotEmpty(message = "商品描述信息不能为空")
  46 + @Length(max = 128, message = "商品描述信息长度不能超过128")
  47 + private String body;
  48 +
  49 + // ========== 订单相关字段 ==========
  50 +
  51 + /**
  52 + * 支付金额,单位:分
  53 + */
  54 + @NotNull(message = "支付金额不能为空")
  55 + @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
  56 + private Integer amount;
  57 +
  58 + /**
  59 + * 支付过期时间
  60 + */
  61 + @NotNull(message = "支付过期时间不能为空")
  62 + private Date expireTime;
  63 +
  64 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto;
  2 +
  3 +import lombok.Data;
  4 +import lombok.experimental.Accessors;
  5 +
  6 +import javax.validation.constraints.NotEmpty;
  7 +import javax.validation.constraints.NotNull;
  8 +import java.io.Serializable;
  9 +
  10 +/**
  11 + * 支付单提交 Request DTO
  12 + */
  13 +@Data
  14 +@Accessors(chain = true)
  15 +public class PayOrderSubmitReqDTO implements Serializable {
  16 +
  17 + /**
  18 + * 应用编号
  19 + */
  20 + @NotEmpty(message = "应用编号不能为空")
  21 + private String appId;
  22 +
  23 + /**
  24 + * 支付单编号
  25 + */
  26 + @NotNull(message = "支付单编号不能为空")
  27 + private Long id;
  28 +
  29 + /**
  30 + * 支付渠道
  31 + */
  32 + @NotNull(message = "支付渠道")
  33 + private String channelCode;
  34 +
  35 + /**
  36 + * 客户端 IP
  37 + */
  38 + @NotEmpty(message = "客户端 IP 不能为空")
  39 + private String clientIp;
  40 +
  41 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/dto/PayOrderSubmitRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.order.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.io.Serializable;
  6 +
  7 +/**
  8 + * 支付单提交 Response DTO
  9 + */
  10 +@Data
  11 +public class PayOrderSubmitRespDTO implements Serializable {
  12 +
  13 + /**
  14 + * 支付拓展单的编号
  15 + */
  16 + private Long extensionId;
  17 +
  18 + /**
  19 + * 调用支付渠道的响应结果
  20 + */
  21 + private String invokeResponse;
  22 +
  23 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service.order.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.pay.convert.order.PayOrderCoreServiceConvert;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
  5 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
  6 +import cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order.PayOrderCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum;
  8 +import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayAppCoreService;
  9 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService;
  10 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
  11 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
  12 +import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
  13 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  14 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  15 +import lombok.extern.slf4j.Slf4j;
  16 +import org.springframework.stereotype.Service;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.validation.Valid;
  20 +
  21 +/**
  22 + * 支付订单 Core Service 实现类
  23 + */
  24 +@Service
  25 +@Valid
  26 +@Slf4j
  27 +public class PayOrderCoreServiceImpl implements PayOrderCoreService {
  28 +
  29 + @Resource
  30 + private PayAppCoreService payAppCoreService;
  31 +
  32 + @Resource
  33 + private PayOrderCoreMapper payOrderCoreMapper;
  34 +
  35 + @Override
  36 + public Long createPayOrder(PayOrderCreateReqDTO reqDTO) {
  37 + // 校验 App
  38 + PayAppDO app = payAppCoreService.validPayApp(reqDTO.getAppId());
  39 +
  40 + // 查询对应的支付交易单是否已经存在。如果是,则直接返回
  41 + PayOrderDO order = payOrderCoreMapper.selectByAppIdAndMerchantOrderId(
  42 + reqDTO.getAppId(), reqDTO.getMerchantOrderId());
  43 + if (order != null) {
  44 + log.warn("[createPayOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(),
  45 + order.getMerchantOrderId(), JsonUtils.toJsonString(order)); // 理论来说,不会出现这个情况
  46 + return app.getId();
  47 + }
  48 +
  49 + // 创建支付交易单
  50 + order = PayOrderCoreServiceConvert.INSTANCE.convert(reqDTO)
  51 + .setStatus(PayOrderStatusEnum.WAITING.getStatus())
  52 + .setNotifyUrl(app.getPayNotifyUrl());
  53 + payOrderCoreMapper.insert(order);
  54 + // 最终返回
  55 + return order.getId();
  56 + }
  57 +
  58 + @Override
  59 + public PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO) {
  60 + // 校验 App
  61 + PayAppDO app = payAppCoreService.validPayApp(reqDTO.getId());
  62 + // TODO 校验支付渠道是否有效
  63 +
  64 + // 获得 PayOrderDO ,并校验其是否存在
  65 + PayOrderDO order = payOrderCoreMapper.selectById(reqDTO.getId());
  66 + if (order == null) { // 是否存在
  67 + throw exception(PAY_TRANSACTION_NOT_FOUND);
  68 + }
  69 + if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
  70 + throw exception(PAY_TRANSACTION_STATUS_IS_NOT_WAITING);
  71 + }
  72 +
  73 + // 插入 PayTransactionExtensionDO
  74 + PayTransactionExtensionDO payTransactionExtensionDO = PayTransactionConvert.INSTANCE.convert(submitReqDTO)
  75 + .setTransactionId(payTransaction.getId()).setTransactionCode(generateTransactionCode())
  76 + .setStatus(PayTransactionStatusEnum.WAITING.getStatus());
  77 + payTransactionExtensionMapper.insert(payTransactionExtensionDO);
  78 +
  79 + // 调用三方接口
  80 + AbstractThirdPayClient thirdPayClient = ThirdPayClientFactory.getThirdPayClient(submitReqDTO.getPayChannel());
  81 + CommonResult<String> invokeResult = thirdPayClient.submitTransaction(payTransaction, payTransactionExtensionDO, null); // TODO 暂时传入 extra = null
  82 + invokeResult.checkError();
  83 +
  84 + // TODO 轮询三方接口,是否已经支付的任务
  85 + // 返回成功
  86 + return new PayTransactionSubmitRespDTO().setId(payTransactionExtensionDO.getId()).setInvokeResponse(invokeResult.getData());
  87 + }
  88 +
  89 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.pay.service;
yudao-dependencies/pom.xml
@@ -52,6 +52,7 @@ @@ -52,6 +52,7 @@
52 <aliyun-java-sdk-core.version>4.5.25</aliyun-java-sdk-core.version> 52 <aliyun-java-sdk-core.version>4.5.25</aliyun-java-sdk-core.version>
53 <aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version> 53 <aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
54 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version> 54 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
  55 + <justauth.version>1.4.0</justauth.version>
55 </properties> 56 </properties>
56 57
57 <dependencyManagement> 58 <dependencyManagement>
@@ -92,6 +93,11 @@ @@ -92,6 +93,11 @@
92 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId> 93 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
93 <version>${revision}</version> 94 <version>${revision}</version>
94 </dependency> 95 </dependency>
  96 + <dependency>
  97 + <groupId>cn.iocoder.boot</groupId>
  98 + <artifactId>yudao-spring-boot-starter-biz-pay</artifactId>
  99 + <version>${revision}</version>
  100 + </dependency>
95 101
96 <!-- Spring 核心 --> 102 <!-- Spring 核心 -->
97 <dependency> 103 <dependency>
@@ -421,6 +427,13 @@ @@ -421,6 +427,13 @@
421 <version>${aliyun-java-sdk-dysmsapi.version}</version> 427 <version>${aliyun-java-sdk-dysmsapi.version}</version>
422 </dependency> 428 </dependency>
423 <!-- SMS SDK end --> 429 <!-- SMS SDK end -->
  430 +
  431 + <dependency>
  432 + <groupId>com.xkcoding.justauth</groupId>
  433 + <artifactId>justauth-spring-boot-starter</artifactId>
  434 + <version>${justauth.version}</version>
  435 + </dependency>
  436 +
424 </dependencies> 437 </dependencies>
425 </dependencyManagement> 438 </dependencyManagement>
426 439
yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
@@ -11,23 +11,24 @@ @@ -11,23 +11,24 @@
11 11
12 <artifactId>yudao-spring-boot-starter-biz-pay</artifactId> 12 <artifactId>yudao-spring-boot-starter-biz-pay</artifactId>
13 <name>${artifactId}</name> 13 <name>${artifactId}</name>
14 - <description>支付核心业务</description> 14 + <description>支付拓展,基于 IJPay 简单封装,支持微信、支付宝等常见支付渠道</description>
15 15
16 <dependencies> 16 <dependencies>
17 <dependency> 17 <dependency>
18 <groupId>cn.iocoder.boot</groupId> 18 <groupId>cn.iocoder.boot</groupId>
19 - <artifactId>yudao-spring-boot-starter-extension</artifactId>  
20 - <version>${revision}</version> 19 + <artifactId>yudao-common</artifactId>
21 </dependency> 20 </dependency>
22 21
  22 + <!-- 三方云服务相关 -->
23 <dependency> 23 <dependency>
24 - <groupId>cn.iocoder.boot</groupId>  
25 - <artifactId>yudao-common</artifactId> 24 + <groupId>com.github.javen205</groupId>
  25 + <artifactId>IJPay-AliPay</artifactId>
  26 + <version>2.7.8</version>
26 </dependency> 27 </dependency>
27 -  
28 <dependency> 28 <dependency>
29 - <groupId>cn.iocoder.boot</groupId>  
30 - <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> 29 + <groupId>com.github.javen205</groupId>
  30 + <artifactId>IJPay-WxPay</artifactId>
  31 + <version>2.7.8</version>
31 </dependency> 32 </dependency>
32 </dependencies> 33 </dependencies>
33 -</project>  
34 \ No newline at end of file 34 \ No newline at end of file
  35 +</project>
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/merchant/package-info.java deleted
1 -/**  
2 - * @description  
3 - * @author Qingchen  
4 - * @version 1.0.0  
5 - * @date 2021-10-12 10:42  
6 - * @class cn.iocoder.yudao.framework.pay.core.domain.merchant.package-info.java  
7 - */  
8 -package cn.iocoder.yudao.framework.pay.core.domain.merchant;  
9 \ No newline at end of file 0 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/package-info.java deleted
1 -/**  
2 - * @description  
3 - * @author Qingchen  
4 - * @version 1.0.0  
5 - * @date 2021-09-29 14:44  
6 - * @class cn.iocoder.yudao.framework.pay.core.domain.package-info.java  
7 - */  
8 -package cn.iocoder.yudao.framework.pay.core.domain;  
9 \ No newline at end of file 0 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/pay/package-info.java deleted
1 -/**  
2 - * @description  
3 - * @author Qingchen  
4 - * @version 1.0.0  
5 - * @date 2021-10-12 10:42  
6 - * @class cn.iocoder.yudao.framework.pay.core.domain.pay.package-info.java  
7 - */  
8 -package cn.iocoder.yudao.framework.pay.core.domain.pay;  
9 \ No newline at end of file 0 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/refund/package-info.java deleted
1 -/**  
2 - * @description  
3 - * @author Qingchen  
4 - * @version 1.0.0  
5 - * @date 2021-10-12 10:42  
6 - * @class cn.iocoder.yudao.framework.pay.core.domain.refund.package-info.java  
7 - */  
8 -package cn.iocoder.yudao.framework.pay.core.domain.refund;  
9 \ No newline at end of file 0 \ No newline at end of file
更新日志.md
@@ -7,10 +7,13 @@ @@ -7,10 +7,13 @@
7 7
8 * 工作流 8 * 工作流
9 9
  10 +## [v1.1.2] 待定
  11 +
  12 +* 用户前台的社交登陆
  13 +
10 ## [v1.1.1] 待定 14 ## [v1.1.1] 待定
11 15
12 * 支付 16 * 支付
13 -* 用户前台的社交登陆  
14 17
15 ## [v1.1.0] 进行中 18 ## [v1.1.0] 进行中
16 19