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 122 <artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
123 123 </dependency>
124 124  
125   - <!-- TODO 后续看情况,进行调整 -->
  125 + <!-- 三方云服务相关 -->
  126 +
126 127 <dependency>
127 128 <groupId>com.xkcoding.justauth</groupId>
128 129 <artifactId>justauth-spring-boot-starter</artifactId>
129   - <version>1.4.0</version>
130 130 </dependency>
131 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 32 <groupId>cn.iocoder.boot</groupId>
33 33 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
34 34 </dependency>
  35 + <dependency>
  36 + <groupId>cn.iocoder.boot</groupId>
  37 + <artifactId>yudao-spring-boot-starter-biz-pay</artifactId>
  38 + </dependency>
35 39  
36 40 <!-- Web 相关 -->
37 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 11 /**
12 12 * 参数配置表
13 13 *
14   - * @author ruoyi
  14 + * @author 芋道源码
15 15 */
16 16 @TableName("inf_config")
17 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 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
... ... @@ -23,11 +23,6 @@ public class PayAppDO extends BaseDO {
23 23 @TableId
24 24 private Long id;
25 25 /**
26   - * 应用号
27   - * 例如说,60cc81e0e4b06afc4d3f0cfq
28   - */
29   - private String no;
30   - /**
31 26 * 应用名
32 27 */
33 28 private String name;
... ... @@ -46,6 +41,14 @@ public class PayAppDO extends BaseDO {
46 41 * TODO 芋艿:用途
47 42 */
48 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 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 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 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 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 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 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 8 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  9 +import com.baomidou.mybatisplus.annotation.TableName;
8 10 import lombok.Data;
  11 +import lombok.EqualsAndHashCode;
  12 +import lombok.ToString;
9 13  
10 14 import java.util.Date;
11 15  
... ... @@ -14,19 +18,22 @@ import java.util.Date;
14 18 *
15 19 * @author 芋道源码
16 20 */
  21 +@TableName("pay_order")
17 22 @Data
  23 +@EqualsAndHashCode(callSuper = true)
  24 +@ToString(callSuper = true)
18 25 public class PayOrderDO extends BaseDO {
19 26  
20 27 /**
21 28 * 订单编号,数据库自增
22 29 */
23 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 49 /**
43 50 * 渠道编号
44 51 *
45   - * 关联 {@link PayChannelDO#getMerchantId()}
  52 + * 关联 {@link PayChannelDO#getId()}
46 53 */
47 54 private Long channelId;
48 55 /**
... ... @@ -55,10 +62,10 @@ public class PayOrderDO extends BaseDO {
55 62 // ========== 商户相关字段 ==========
56 63  
57 64 /**
58   - * 商户订单号
  65 + * 商户订单编号
59 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 78 * 商户拓展参数
72 79 */
73 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 98 /**
97 99 * 支付状态
98 100 *
99   - * TODO 芋艿:状态枚举
  101 + * 枚举 {@link PayOrderStatusEnum}
100 102 */
101 103 private Integer status;
102 104 /**
  105 + * 通知商户支付结果的回调状态
  106 + * TODO 芋艿:0 未发送 1 已发送
  107 + */
  108 + private Integer notifyStatus;
  109 + /**
103 110 * 客户端 IP
104 111 */
105 112 private String clientIp;
... ... @@ -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 7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
8 8 import lombok.Data;
9 9  
... ... @@ -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 50 private Long channelId;
51 51 /**
... ... @@ -80,6 +80,11 @@ public class PayRefundDO extends BaseDO {
80 80 */
81 81 private Integer status;
82 82 /**
  83 + * 通知商户退款结果的回调状态
  84 + * TODO 芋艿:0 未发送 1 已发送
  85 + */
  86 + private Integer notifyStatus;
  87 + /**
83 88 * 客户端 IP
84 89 */
85 90 private String clientIp;
... ... @@ -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 52 <aliyun-java-sdk-core.version>4.5.25</aliyun-java-sdk-core.version>
53 53 <aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
54 54 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
  55 + <justauth.version>1.4.0</justauth.version>
55 56 </properties>
56 57  
57 58 <dependencyManagement>
... ... @@ -92,6 +93,11 @@
92 93 <artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
93 94 <version>${revision}</version>
94 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 102 <!-- Spring 核心 -->
97 103 <dependency>
... ... @@ -421,6 +427,13 @@
421 427 <version>${aliyun-java-sdk-dysmsapi.version}</version>
422 428 </dependency>
423 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 437 </dependencies>
425 438 </dependencyManagement>
426 439  
... ...
yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
... ... @@ -11,23 +11,24 @@
11 11  
12 12 <artifactId>yudao-spring-boot-starter-biz-pay</artifactId>
13 13 <name>${artifactId}</name>
14   - <description>支付核心业务</description>
  14 + <description>支付拓展,基于 IJPay 简单封装,支持微信、支付宝等常见支付渠道</description>
15 15  
16 16 <dependencies>
17 17 <dependency>
18 18 <groupId>cn.iocoder.boot</groupId>
19   - <artifactId>yudao-spring-boot-starter-extension</artifactId>
20   - <version>${revision}</version>
  19 + <artifactId>yudao-common</artifactId>
21 20 </dependency>
22 21  
  22 + <!-- 三方云服务相关 -->
23 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 27 </dependency>
27   -
28 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 32 </dependency>
32 33 </dependencies>
33   -</project>
34 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 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 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 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 0 \ No newline at end of file
更新日志.md
... ... @@ -7,10 +7,13 @@
7 7  
8 8 * 工作流
9 9  
  10 +## [v1.1.2] 待定
  11 +
  12 +* 用户前台的社交登陆
  13 +
10 14 ## [v1.1.1] 待定
11 15  
12 16 * 支付
13   -* 用户前台的社交登陆
14 17  
15 18 ## [v1.1.0] 进行中
16 19  
... ...