Commit 81126b2b4b9923b5f56ebdfa1783e63a6e736054
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
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
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
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
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
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/package-info.java deleted
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/pay/package-info.java deleted
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/domain/refund/package-info.java deleted