From 722f8a08f42c1f0373fa91139250152a07947c17 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 2 Jan 2024 00:03:19 +0800 Subject: [PATCH] =?UTF-8?q?ref=20=E6=94=AF=E4=BB=98=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8D=E6=9E=84,=20=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=AE=A2=E5=8D=95=E4=BF=AE=E5=A4=8D=E9=80=BB?= =?UTF-8?q?=E8=BE=91,=20=E8=B6=85=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91,=20=E5=AE=9A=E6=97=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=94=AF=E4=BB=98=E4=B8=AD=E8=AE=A2=E5=8D=95=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 37 +--- dax-pay-sdk/pom.xml | 2 +- .../platform/daxpay/param/pay/PayParam.java | 2 +- daxpay-single/daxpay-single-service/pom.xml | 18 -- .../daxpay/code/PayNotifyStatusEnum.java | 8 +- .../daxpay/common/context/AsyncPayLocal.java | 2 +- .../daxpay/common/context/PaymentContext.java | 2 +- .../convert/CallbackNotifyMConvert.java | 14 -- .../callback/dao/CallbackNotifyMapper.java | 14 -- .../alipay/service/AliPayCallbackService.java | 37 +++- .../alipay/service/AliPayCloseService.java | 2 +- .../alipay/service/AliPayOrderService.java | 7 +- .../alipay/service/AliPayRefundService.java | 2 +- .../channel/alipay/service/AliPayService.java | 48 +++-- .../alipay/service/AliPaySyncService.java | 2 +- .../channel/cash/service/CashService.java | 2 +- .../service/VoucherPayOrderService.java | 2 +- .../voucher/service/VoucherPayService.java | 2 +- .../wallet/service/WalletPayOrderService.java | 2 +- .../wallet/service/WalletPayService.java | 2 +- .../service/WeChatPayCallbackService.java | 21 ++- .../wechat/service/WeChatPayCloseService.java | 2 +- .../wechat/service/WeChatPayOrderService.java | 10 +- .../wechat/service/WeChatPayService.java | 13 +- .../wechat/service/WechatRefundService.java | 2 +- .../order/pay/service/PayOrderService.java | 120 ------------ .../sync/convert/PaySyncOrderConvert.java | 19 -- .../order/sync/dao/PaySyncOrderMapper.java | 14 -- .../callback/service/PayCallbackService.java | 172 ++++-------------- .../close/service/PayCloseService.java | 12 +- .../payment/pay/service/PayAssistService.java | 106 ++++++++++- .../core/payment/pay/service/PayService.java | 125 ++----------- .../payment/pay/strategy/AliPayStrategy.java | 27 +-- .../payment/pay/strategy/CashPayStrategy.java | 2 +- .../pay/strategy/WeChatPayStrategy.java | 22 --- .../service/PayRefundAssistService.java | 14 +- .../refund/service/PayRefundService.java | 10 +- .../refund/strategy/AliPayRefundStrategy.java | 2 +- .../strategy/CashPayRefundStrategy.java | 2 +- .../strategy/VoucherPayRefundStrategy.java | 2 +- .../strategy/WalletPayRefundStrategy.java | 2 +- .../strategy/WeChatPayRefundStrategy.java | 2 +- .../repair/service/PayRepairService.java | 14 +- .../repair/strategy/AliPayRepairStrategy.java | 5 +- .../payment/sync/service/PaySyncService.java | 12 +- .../sync/task/PayOrderSyncTaskService.java | 40 ++++ .../convert/CallbackRecordMConvert.java | 14 ++ .../callback/dao/CallbackRecordManager.java} | 6 +- .../callback/dao/CallbackRecordMapper.java | 14 ++ .../callback/entity/CallbackRecord.java} | 4 +- .../service/CallbackRecordService.java} | 4 +- .../pay/builder/PaymentBuilder.java | 14 +- .../pay/dao/PayOrderChannelManager.java | 4 +- .../pay/dao/PayOrderChannelMapper.java | 4 +- .../pay/dao/PayOrderExtraManager.java | 4 +- .../pay/dao/PayOrderExtraMapper.java | 4 +- .../pay/dao/PayOrderManager.java | 4 +- .../pay/dao/PayOrderMapper.java | 4 +- .../pay/entity/PayOrder.java | 2 +- .../pay/entity/PayOrderChannel.java | 2 +- .../pay/entity/PayOrderExtra.java | 2 +- .../pay/service/PayOrderChannelService.java | 8 +- .../record/pay/service/PayOrderService.java | 86 +++++++++ .../refund/convert/RefundConvert.java | 4 +- .../refund/dao/PayRefundOrderManager.java | 4 +- .../refund/dao/PayRefundOrderMapper.java | 4 +- .../refund/entity/PayRefundOrder.java | 4 +- .../service/PayRefundRecordService.java | 6 +- .../sync/convert/PaySyncRecordConvert.java | 19 ++ .../sync/dao/PaySyncRecordManager.java} | 18 +- .../record/sync/dao/PaySyncRecordMapper.java | 14 ++ .../sync/entity/PaySyncRecord.java} | 14 +- .../sync/service/PaySyncOrderService.java | 24 +-- .../system/entity/OrderTimeoutConfig.java | 35 ++++ .../dao/PayExpiredTimeRepository.java | 18 +- .../service/PayExpiredTimeService.java | 57 ++++++ ...yncOrderDto.java => PaySyncRecordDto.java} | 2 +- .../daxpay/func/AbsPayCallbackStrategy.java | 27 +-- .../daxpay/func/AbsPayCloseStrategy.java | 2 +- .../daxpay/func/AbsPayRefundStrategy.java | 2 +- .../daxpay/func/AbsPayRepairStrategy.java | 2 +- .../platform/daxpay/func/AbsPayStrategy.java | 21 +-- .../daxpay/func/AbsPaySyncStrategy.java | 2 +- .../daxpay/func/PayStrategyConsumer.java | 2 +- 84 files changed, 697 insertions(+), 743 deletions(-) delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/convert/CallbackNotifyMConvert.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyMapper.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderService.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/convert/PaySyncOrderConvert.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderMapper.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/task/PayOrderSyncTaskService.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/convert/CallbackRecordMConvert.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{callback/dao/CallbackNotifyManager.java => record/callback/dao/CallbackRecordManager.java} (50%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordMapper.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{callback/entity/CallbackNotify.java => record/callback/entity/CallbackRecord.java} (92%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{callback/service/CallbackNotifyService.java => record/callback/service/CallbackRecordService.java} (70%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/builder/PaymentBuilder.java (91%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderChannelManager.java (89%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderChannelMapper.java (68%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderExtraManager.java (76%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderExtraMapper.java (67%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderManager.java (81%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/dao/PayOrderMapper.java (66%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/entity/PayOrder.java (97%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/entity/PayOrderChannel.java (96%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/entity/PayOrderExtra.java (96%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/pay/service/PayOrderChannelService.java (86%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderService.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/refund/convert/RefundConvert.java (71%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/refund/dao/PayRefundOrderManager.java (90%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/refund/dao/PayRefundOrderMapper.java (63%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/refund/entity/PayRefundOrder.java (93%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/refund/service/PayRefundRecordService.java (84%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/convert/PaySyncRecordConvert.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order/sync/dao/PaySyncOrderManager.java => record/sync/dao/PaySyncRecordManager.java} (54%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordMapper.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order/sync/entity/PaySyncOrder.java => record/sync/entity/PaySyncRecord.java} (79%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order => record}/sync/service/PaySyncOrderService.java (64%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/system/entity/OrderTimeoutConfig.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/{order/pay => timeout}/dao/PayExpiredTimeRepository.java (67%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/service/PayExpiredTimeService.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/{PaySyncOrderDto.java => PaySyncRecordDto.java} (96%) diff --git a/_doc/Task.md b/_doc/Task.md index b15fc03c..c898ac22 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -4,38 +4,17 @@ - 增加回调机制 - 增加消息通知机制 - 支付超时取消支付单 -- 支付单回调处理实现 -- 支付同步相关逻辑 - 新增支付单预警功能, 处理支付单与网关状态不一致且无法自动修复的情况 - 记录支付修复单的情况, 主要分为自动修复, 人工介入 - 2023-12-31: - 支付关闭相关逻辑 - 各支付通道补充相关未实现的逻辑 - 支付订单修复逻辑, 用于回调和支付同步后不一致的情况处理 - -1.0.1 -- x 钱包支持多商户和多应用 -- x 储值卡支持多商户和多应用 -- x 拆分网关同步相关代码 -- x 记录网关同步记录 -- x 重构支付消息通知结构, 支持多种消息中间件 -- x 保存各渠道的支付单 -- x 钱包支持设置开通时的默认金额 -- x 储值卡多卡支付和退款演示 -- x 储值卡批量导入 -- x 储值卡多卡退款到单卡, 不传卡号自动设置为默认卡 -1.0.2 -- 微信V3支付接口 -- 钱包设置支持配置是否创建用户时自动开通 -- 支付超时逻辑重构 -- 支付单增加类型记录, 如是否单渠道支付/单渠道支付类型等信息 -- 各种子支付单记录商户号和应用号等信息, 后期进行统计时使用 -- 增加手续费配置管理 -- 各种支付方式配置可以记录手续费比例, 支持简易模式和关联支付配置模式 -- 储值卡支持多卡合一 -- 储值卡信息调整 -- 删除应用或商户是做校验, 级联删除对应的支付配置 -- 用户体系调整 - - 拆分出来用户和顾客 -- 增加可同时用于多商户的钱包 -- 增加类似京东E卡的支付工具 +- 2024-01-01: + - 支付订单修复逻辑, 用于回调和支付同步后不一致的情况处理 +- 2024-01-02: + - 支付配置支持数据库配置和配置文件配置 + - 支付订单的各类操作接入订单超时任务处理 + - 超时任务处理支持轮训表+Redis过期事件 + - 支持定时同步支付中订单状态, 借助订单超时任务 + - 订单取消/修复/取消/同步添加分布式锁, 防止操作订单时出现重复操作 diff --git a/dax-pay-sdk/pom.xml b/dax-pay-sdk/pom.xml index 494afe45..5ca3b939 100644 --- a/dax-pay-sdk/pom.xml +++ b/dax-pay-sdk/pom.xml @@ -20,7 +20,7 @@ cn.hutool hutool-all - 5.8.18 + 5.8.24 diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java index b58aa213..27acd1e8 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java @@ -34,7 +34,7 @@ public class PayParam extends PayCommonParam{ @Schema(description = "支付描述") private String description; - @Schema(description = "过期时间") + @Schema(description = "过期时间, 多次传输以第一次为准") @JsonDeserialize(using = TimestampToLocalDateTimeDeserializer.class) private LocalDateTime expiredTime; diff --git a/daxpay-single/daxpay-single-service/pom.xml b/daxpay-single/daxpay-single-service/pom.xml index 41a58f68..64767ce6 100644 --- a/daxpay-single/daxpay-single-service/pom.xml +++ b/daxpay-single/daxpay-single-service/pom.xml @@ -12,24 +12,6 @@ daxpay-single-service - - - org.projectlombok - lombok - provided - - - - org.projectlombok - lombok-mapstruct-binding - provided - - - - org.mapstruct - mapstruct-processor - provided - org.mapstruct diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/code/PayNotifyStatusEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/code/PayNotifyStatusEnum.java index b8229330..595c6fc5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/code/PayNotifyStatusEnum.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/code/PayNotifyStatusEnum.java @@ -20,7 +20,13 @@ public enum PayNotifyStatusEnum { SUCCESS("success","成功"), /** 忽略 */ - IGNORE("ignore","忽略"); + IGNORE("ignore","忽略"), + + /** 超时 */ + TIMEOUT("timeout","超时"), + + /** 未找到本地订单 需要行进订单撤销 */ + NOT_FOUND("not_found","未找到"); /** 状态 */ private final String code; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/AsyncPayLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/AsyncPayLocal.java index 5822f7df..980cf36b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/AsyncPayLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/AsyncPayLocal.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; import java.time.LocalDateTime; /** - * 异步支付信息 + * 异步支付信息,不只局限在支付流程,同步、退款、回调中都会用到 * @author xxm * @since 2021/2/28 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/PaymentContext.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/PaymentContext.java index 2ded8f06..775b8195 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/PaymentContext.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/PaymentContext.java @@ -21,7 +21,7 @@ public class PaymentContext { /** 平台全局配置 */ private final PlatformLocal platform = new PlatformLocal(); - /** 异步支付相关信息 */ + /** 异步支付相关信息, 不只局限在支付流程,同步、退款、回调中都会用到 */ private final AsyncPayLocal asyncPayInfo = new AsyncPayLocal(); /** 异步退款相关信息 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/convert/CallbackNotifyMConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/convert/CallbackNotifyMConvert.java deleted file mode 100644 index c5ef6785..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/convert/CallbackNotifyMConvert.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.callback.convert; - -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 回调通知转换 - * @author xxm - * @since 2023/12/18 - */ -@Mapper -public interface CallbackNotifyMConvert { - CallbackNotifyMConvert CONVERT = Mappers.getMapper(CallbackNotifyMConvert.class); -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyMapper.java deleted file mode 100644 index 17ffa6cd..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.callback.dao; - -import cn.bootx.platform.daxpay.core.callback.entity.CallbackNotify; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2023/12/18 - */ -@Mapper -public interface CallbackNotifyMapper extends BaseMapper { -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java index 24da1f9f..577154c7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java @@ -6,7 +6,7 @@ import cn.bootx.platform.daxpay.code.AliPayCode; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.callback.dao.CallbackNotifyManager; +import cn.bootx.platform.daxpay.core.record.callback.dao.CallbackRecordManager; import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.core.payment.callback.service.PayCallbackService; import cn.bootx.platform.daxpay.func.AbsPayCallbackStrategy; @@ -35,17 +35,23 @@ public class AliPayCallbackService extends AbsPayCallbackStrategy { private final AliPayConfigService aliasConfigService; - public AliPayCallbackService(RedisClient redisClient, CallbackNotifyManager callbackNotifyManager, + public AliPayCallbackService(RedisClient redisClient, CallbackRecordManager callbackRecordManager, PayCallbackService payCallbackService, AliPayConfigService aliasConfigService) { - super(redisClient, callbackNotifyManager, payCallbackService); + super(redisClient, callbackRecordManager, payCallbackService); this.aliasConfigService = aliasConfigService; } + /** + * 获取支付通道 + */ @Override public PayChannelEnum getPayChannel() { return PayChannelEnum.ALI; } + /** + * 获取交易状态 + */ @Override public String getTradeStatus() { Map params = PaymentContextLocal.get().getCallbackParam(); @@ -74,29 +80,40 @@ public class AliPayCallbackService extends AbsPayCallbackStrategy { log.error("支付宝支付配置不存在: {}", callReq); return false; } - try { if (Objects.equals(alipayConfig.getAuthType(), AliPayCode.AUTH_TYPE_KEY)) { - return AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), CharsetUtil.UTF_8, - AlipayConstants.SIGN_TYPE_RSA2); + return AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); } else { - return AlipaySignature.verifyV1(params, CertUtil.getCertByContent(alipayConfig.getAlipayCert()), - CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); + return AlipaySignature.verifyV1(params, CertUtil.getCertByContent(alipayConfig.getAlipayCert()), CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); } - } - catch (AlipayApiException e) { + } catch (AlipayApiException e) { log.error("支付宝验签失败", e); return false; } } + /** + * 分通道特殊处理, 如将解析的数据放到上下文中 + */ + @Override + public void initContext() { + Map callbackParam = PaymentContextLocal.get().getCallbackParam(); + PaymentContextLocal.get().getAsyncPayInfo().setTradeNo(callbackParam.get(AliPayCode.TRADE_NO)); + } + + /** + * 获取支付id + */ @Override public Long getPaymentId() { Map params = PaymentContextLocal.get().getCallbackParam(); return Long.valueOf(params.get(AliPayCode.OUT_TRADE_NO)); } + /** + * 获取返回信息 + */ @Override public String getReturnMsg() { return "success"; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCloseService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCloseService.java index a7e35b5b..2cdf759f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCloseService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCloseService.java @@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.core.channel.alipay.service; import cn.bootx.platform.common.spring.exception.RetryableException; import cn.bootx.platform.daxpay.code.AliPayCode; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeCloseModel; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayOrderService.java index d6acb066..5a60b049 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayOrderService.java @@ -6,9 +6,8 @@ import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.alipay.dao.AliPayOrderManager; import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayOrder; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderChannelService; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderChannelService; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,8 +34,6 @@ public class AliPayOrderService { private final AliPayOrderManager aliPayOrderManager; - private final PayOrderManager payOrderManager; - private final PayOrderChannelService payOrderChannelService; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayRefundService.java index 2dba0173..4e0de7ff 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayRefundService.java @@ -3,7 +3,7 @@ package cn.bootx.platform.daxpay.core.channel.alipay.service; import cn.bootx.platform.daxpay.code.AliPayCode; import cn.bootx.platform.daxpay.common.context.AsyncRefundLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.hutool.core.util.IdUtil; import com.alipay.api.AlipayApiException; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java index a53a4b20..373a2894 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java @@ -8,7 +8,7 @@ import cn.bootx.platform.daxpay.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.common.context.NoticeLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayConfig; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.channel.AliPayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; @@ -97,15 +97,15 @@ public class AliPayService { /** * wap支付 */ - public String wapPay(int amount, PayOrder payment, AliPayConfig alipayConfig) { + public String wapPay(int amount, PayOrder payOrder, AliPayConfig alipayConfig) { NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); + model.setSubject(payOrder.getTitle()); + model.setOutTradeNo(String.valueOf(payOrder.getId())); model.setTotalAmount(String.valueOf(amount*0.01)); // 过期时间 - model.setTimeExpire(PayUtil.getAliTimeExpire(asyncPayInfo.getExpiredTime())); + model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime())); model.setProductCode(AliPayCode.QUICK_WAP_PAY); // 中途退出地址 model.setQuitUrl(noticeInfo.getQuitUrl()); @@ -131,15 +131,14 @@ public class AliPayService { /** * app支付 */ - public String appPay(int amount, PayOrder payment, AliPayConfig alipayConfig) { - AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); + public String appPay(int amount, PayOrder payOrder, AliPayConfig alipayConfig) { AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); - model.setSubject(payment.getTitle()); + model.setSubject(payOrder.getTitle()); model.setProductCode(QUICK_MSECURITY_PAY); - model.setOutTradeNo(String.valueOf(payment.getId())); + model.setOutTradeNo(String.valueOf(payOrder.getId())); // 过期时间 - model.setTimeExpire(PayUtil.getAliTimeExpire(asyncPayInfo.getExpiredTime())); + model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime())); model.setTotalAmount(String.valueOf(amount*0.01)); try { @@ -156,15 +155,14 @@ public class AliPayService { /** * PC支付 */ - public String webPay(int amount, PayOrder payment, AliPayConfig alipayConfig) { + public String webPay(int amount, PayOrder payOrder, AliPayConfig alipayConfig) { NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); - AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); AlipayTradePagePayModel model = new AlipayTradePagePayModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); + model.setSubject(payOrder.getTitle()); + model.setOutTradeNo(String.valueOf(payOrder.getId())); // 过期时间 - model.setTimeExpire(PayUtil.getAliTimeExpire(asyncPayInfo.getExpiredTime())); + model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime())); model.setTotalAmount(String.valueOf(amount*0.01)); // 目前仅支持FAST_INSTANT_TRADE_PAY model.setProductCode(AliPayCode.FAST_INSTANT_TRADE_PAY); @@ -189,15 +187,14 @@ public class AliPayService { /** * 二维码支付(扫码支付) */ - public String qrCodePay(int amount, PayOrder payment, AliPayConfig alipayConfig) { - AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); + public String qrCodePay(int amount, PayOrder payOrder, AliPayConfig alipayConfig) { AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); + model.setSubject(payOrder.getTitle()); + model.setOutTradeNo(String.valueOf(payOrder.getId())); model.setTotalAmount(String.valueOf(amount*0.01)); // 过期时间 - model.setTimeExpire(PayUtil.getAliTimeExpire(asyncPayInfo.getExpiredTime())); + model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime())); try { AlipayTradePrecreateResponse response = AliPayApi.tradePrecreatePayToResponse(model, alipayConfig.getNotifyUrl()); @@ -213,24 +210,23 @@ public class AliPayService { /** * 付款码支付 */ - public String barCode(int amount, PayOrder payment, AliPayParam aliPayParam, AliPayConfig alipayConfig) { - AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); + public String barCode(int amount, PayOrder payOrder, AliPayParam aliPayParam, AliPayConfig alipayConfig) { AlipayTradePayModel model = new AlipayTradePayModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); + model.setSubject(payOrder.getTitle()); + model.setOutTradeNo(String.valueOf(payOrder.getId())); model.setScene(AliPayCode.BAR_CODE); model.setAuthCode(aliPayParam.getAuthCode()); // 过期时间 - model.setTimeExpire(PayUtil.getAliTimeExpire(asyncPayInfo.getExpiredTime())); + model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime())); model.setTotalAmount(String.valueOf(amount*0.01)); try { AlipayTradePayResponse response = AliPayApi.tradePayToResponse(model, alipayConfig.getNotifyUrl()); // 支付成功处理 金额2000以下免密支付 if (Objects.equals(response.getCode(), AliPayCode.SUCCESS)) { - payment.setStatus(PayStatusEnum.SUCCESS.getCode()).setPayTime(LocalDateTime.now()); + payOrder.setStatus(PayStatusEnum.SUCCESS.getCode()).setPayTime(LocalDateTime.now()); return response.getTradeNo(); } // 非支付中响应码, 进行错误处理 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaySyncService.java index b07375a4..40a7973e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaySyncService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.alipay.dao.AliPayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.sync.result.GatewaySyncResult; import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayApiException; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java index 684f9010..86f25f51 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java @@ -3,7 +3,7 @@ package cn.bootx.platform.daxpay.core.channel.cash.service; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.core.channel.cash.dao.CashPayOrderManager; import cn.bootx.platform.daxpay.core.channel.cash.entity.CashPayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayOrderService.java index e0ca32d5..1aadb3da 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayOrderService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherPaymentManager; import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayOrder; import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherRecord; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java index 3f76ba5e..38732a28 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java @@ -8,7 +8,7 @@ import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayOrder; import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherRecord; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.channel.VoucherPayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayOrderService.java index c44505b9..9399704a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayOrderService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletPaymentManager; import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java index a6889aa7..b2f23a58 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java @@ -9,7 +9,7 @@ import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletPaymentManager; import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.waller.WalletLackOfBalanceException; import cn.bootx.platform.daxpay.exception.waller.WalletNotExistsException; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java index 0c454404..38c93778 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.code.WeChatPayCode; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.callback.dao.CallbackNotifyManager; +import cn.bootx.platform.daxpay.core.record.callback.dao.CallbackRecordManager; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.core.payment.callback.service.PayCallbackService; import cn.bootx.platform.daxpay.func.AbsPayCallbackStrategy; @@ -34,12 +34,15 @@ import static cn.bootx.platform.daxpay.code.WeChatPayCode.APPID; public class WeChatPayCallbackService extends AbsPayCallbackStrategy { private final WeChatPayConfigService weChatPayConfigService; - public WeChatPayCallbackService(RedisClient redisClient, CallbackNotifyManager callbackNotifyManager, + public WeChatPayCallbackService(RedisClient redisClient, CallbackRecordManager callbackRecordManager, PayCallbackService payCallbackService, WeChatPayConfigService weChatPayConfigService) { - super(redisClient, callbackNotifyManager, payCallbackService); + super(redisClient, callbackRecordManager, payCallbackService); this.weChatPayConfigService = weChatPayConfigService; } + /** + * 支付通道 + */ @Override public PayChannelEnum getPayChannel() { return PayChannelEnum.WECHAT; @@ -92,6 +95,18 @@ public class WeChatPayCallbackService extends AbsPayCallbackStrategy { return WxPayKit.verifyNotify(params, weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256, null); } + /** + * 分通道特殊处理, 如将解析的数据放到上下文中 + */ + @Override + public void initContext() { + Map callbackParam = PaymentContextLocal.get().getCallbackParam(); + PaymentContextLocal.get().getAsyncPayInfo().setTradeNo(callbackParam.get(WeChatPayCode.TRANSACTION_ID)); + } + + /** + * 返回响应结果 + */ @Override public String getReturnMsg() { Map xml = new HashMap<>(4); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCloseService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCloseService.java index 09ffd530..7392581d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCloseService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCloseService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.WeChatPayCode; import cn.bootx.platform.daxpay.common.context.AsyncRefundLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.hutool.core.util.StrUtil; import com.ijpay.core.enums.SignType; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayOrderService.java index cb2377e0..e428d23e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayOrderService.java @@ -8,9 +8,9 @@ import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayOrderManager; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayOrder; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderChannelService; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderChannelService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,7 +32,7 @@ import java.util.Optional; @RequiredArgsConstructor public class WeChatPayOrderService { - private final PayOrderManager paymentService; + private final PayOrderService payOrderService; private final PayOrderChannelService payOrderChannelService; @@ -65,7 +65,7 @@ public class WeChatPayOrderService { * 异步支付成功, 更新支付记录成功状态, 并创建微信支付记录 */ public void updateAsyncSuccess(Long id, PayWayParam payWayParam) { - PayOrder payOrder = paymentService.findById(id).orElseThrow(() -> new BizException("支付记录不存在")); + PayOrder payOrder = payOrderService.findById(id).orElseThrow(() -> new BizException("支付记录不存在")); this.createWeChatOrder(payOrder, payWayParam.getAmount()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java index e1189103..6de7d934 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java @@ -11,7 +11,7 @@ import cn.bootx.platform.daxpay.code.WeChatPayWay; import cn.bootx.platform.daxpay.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.sync.service.PaySyncService; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam; @@ -231,20 +231,17 @@ public class WeChatPayService { /** * 构建参数 */ - private UnifiedOrderModelBuilder buildParams(String amount, PayOrder payment, WeChatPayConfig weChatPayConfig, String tradeType) { + private UnifiedOrderModelBuilder buildParams(String amount, PayOrder payOrder, WeChatPayConfig weChatPayConfig, String tradeType) { - LocalDateTime expiredTime = PaymentContextLocal.get() - .getAsyncPayInfo() - .getExpiredTime(); return builder() .appid(weChatPayConfig.getWxAppId()) .mch_id(weChatPayConfig.getWxMchId()) .nonce_str(WxPayKit.generateStr()) .time_start(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN)) // 反正v2版本的超时时间无效 - .time_expire(PayUtil.getWxExpiredTime(expiredTime)) - .body(payment.getTitle()) - .out_trade_no(String.valueOf(payment.getId())) + .time_expire(PayUtil.getWxExpiredTime(payOrder.getExpiredTime())) + .body(payOrder.getTitle()) + .out_trade_no(String.valueOf(payOrder.getId())) .total_fee(amount) .spbill_create_ip(NetUtil.getLocalhostStr()) .notify_url(weChatPayConfig.getNotifyUrl()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WechatRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WechatRefundService.java index 2677e47e..005e6b47 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WechatRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WechatRefundService.java @@ -7,7 +7,7 @@ import cn.bootx.platform.daxpay.common.context.AsyncRefundLocal; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.IdUtil; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderService.java deleted file mode 100644 index e173c238..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderService.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.bootx.platform.daxpay.core.order.pay.service; - -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.code.PayStatusEnum; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayExpiredTimeRepository; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderChannelManager; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderExtraManager; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; -import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; -import cn.bootx.platform.daxpay.exception.pay.PayFailureException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * 支付订单服务 - * @author xxm - * @since 2023/12/18 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayOrderService { - - private final PayOrderManager orderManager; - - private final PayOrderChannelManager orderChannelManager; - - private final PayOrderExtraManager orderExtraManager; - - private final PayExpiredTimeRepository expiredTimeRepository; - - /** - * 保存 - */ - public PayOrder saveOder(PayOrder payment) { - return orderManager.save(payment); - } - - /** - * 保存支付通道信息列表 - */ - public void saveOrderChannels(List payOrderChannels){ - orderChannelManager.saveAll(payOrderChannels); - } - - /** - * 更新支付记录 - */ - public PayOrder updateById(PayOrder payment) { - // 超时注册 - this.registerExpiredTime(payment); - return orderManager.updateById(payment); - } - - - /** - * 根据id查询 - */ - public Optional findById(Serializable id) { - return orderManager.findById(id); - } - - /** - * 根据BusinessId查询 - */ - public Optional findByBusinessId(String businessNo) { - return orderManager.findByBusinessNo(businessNo); - } - - /** - * 退款成功处理, 更新可退款信息 不要进行持久化 - */ - public void updateRefundSuccess(PayOrder payment, int amount, PayChannelEnum payChannelEnum) { - // 删除旧有的退款记录, 替换退款完的新的 - List refundableInfos = payment.getRefundableInfos(); - OrderRefundableInfo refundableInfo = refundableInfos.stream() - .filter(o -> Objects.equals(o.getChannel(), payChannelEnum.getCode())) - .findFirst() - .orElseThrow(() -> new PayFailureException("退款数据不存在")); - refundableInfos.remove(refundableInfo); - refundableInfo.setAmount(refundableInfo.getAmount() - amount); - refundableInfos.add(refundableInfo); - payment.setRefundableInfos(refundableInfos); - } - - /** - * 支付单超时关闭事件注册, 失败重试3次, 间隔一秒 - */ - @Async("bigExecutor") - @Retryable(value = RetryableException.class) - public void registerExpiredTime(PayOrder payOrder) { - LocalDateTime expiredTime = payOrder.getExpiredTime(); - // 支付中且有超时时间才会注册超时关闭时间 - if (Objects.equals(payOrder.getStatus(), PayStatusEnum.PROGRESS.getCode()) && Objects.nonNull(expiredTime)) { - try { - // 将过期时间添加到redis中, 往后延时一分钟 - expiredTime = LocalDateTimeUtil.offset(expiredTime, 1, ChronoUnit.MINUTES); - expiredTimeRepository.store(payOrder.getId(), expiredTime); - } - catch (Exception e) { - log.error("注册支付单超时关闭失败"); - throw new RetryableException(); - } - } - } -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/convert/PaySyncOrderConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/convert/PaySyncOrderConvert.java deleted file mode 100644 index 94891d0d..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/convert/PaySyncOrderConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.order.sync.convert; - -import cn.bootx.platform.daxpay.core.order.sync.entity.PaySyncOrder; -import cn.bootx.platform.daxpay.dto.order.sync.PaySyncOrderDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付同步记录同步 - * @author xxm - * @since 2023/7/14 - */ -@Mapper -public interface PaySyncOrderConvert { - PaySyncOrderConvert CONVERT = Mappers.getMapper(PaySyncOrderConvert.class); - - PaySyncOrderDto convert(PaySyncOrder in); - -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderMapper.java deleted file mode 100644 index ef67dcf3..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.order.sync.dao; - -import cn.bootx.platform.daxpay.core.order.sync.entity.PaySyncOrder; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付同步记录 - * @author xxm - * @since 2023/7/14 - */ -@Mapper -public interface PaySyncOrderMapper extends BaseMapper { -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/callback/service/PayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/callback/service/PayCallbackService.java index 7adf6a60..126a1937 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/callback/service/PayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/callback/service/PayCallbackService.java @@ -1,27 +1,21 @@ package cn.bootx.platform.daxpay.core.payment.callback.service; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayNotifyStatusEnum; +import cn.bootx.platform.daxpay.code.PayRepairSourceEnum; +import cn.bootx.platform.daxpay.code.PayRepairTypeEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; -import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.callback.result.PayCallbackResult; -import cn.bootx.platform.daxpay.core.payment.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.func.PayStrategyConsumer; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.hutool.core.collection.CollectionUtil; +import cn.bootx.platform.daxpay.core.payment.repair.param.PayRepairParam; +import cn.bootx.platform.daxpay.core.payment.repair.service.PayRepairService; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * 支付回调处理 @@ -34,184 +28,86 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class PayCallbackService { - private final PayOrderManager payOrderService; + private final PayOrderService payOrderService; + + private final PayRepairService payRepairService; /** * 统一回调处理 * @param tradeStatus 支付状态 */ - public PayCallbackResult callback(Long paymentId, String tradeStatus, Map map) { + public PayCallbackResult callback(Long paymentId, String tradeStatus) { // 获取支付单 PayOrder payOrder = payOrderService.findById(paymentId).orElse(null); - // 支付单不存在,记录回调记录 + // 支付单不存在,记录回调记录, TODO 取消支付网关的订单支付情况 if (Objects.isNull(payOrder)) { - return new PayCallbackResult().setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("支付单不存在,记录回调记录"); + return new PayCallbackResult().setStatus(PayNotifyStatusEnum.NOT_FOUND.getCode()).setMsg("支付单不存在,记录回调记录"); } - // 回调时间超出了支付单超时时间, 记录一下, 不做处理 TODO 这块应该把订单给正常处理了, + // 回调时间超出了支付单超时时间, 记录一下, 不做处理 TODO 这块应该把订单给当成正常结束给处理了, if (Objects.nonNull(payOrder.getExpiredTime()) && LocalDateTimeUtil.ge(LocalDateTime.now(), payOrder.getExpiredTime())) { - return new PayCallbackResult().setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("回调时间超出了支付单支付有效时间"); + return new PayCallbackResult().setStatus(PayNotifyStatusEnum.TIMEOUT.getCode()).setMsg("回调时间超出了支付单支付有效时间"); } // 成功状态 if (Objects.equals(PayNotifyStatusEnum.SUCCESS.getCode(), tradeStatus)) { - return this.success(payOrder, map); + return this.success(payOrder); } else { // 失败状态 - return this.fail(payOrder, map); + return this.fail(payOrder); } } /** - * 成功处理 + * 成功处理 使用补偿 */ - private PayCallbackResult success(PayOrder payOrder, Map map) { + private PayCallbackResult success(PayOrder payOrder) { PayCallbackResult result = new PayCallbackResult().setStatus(PayNotifyStatusEnum.SUCCESS.getCode()); - // payment已经被支付,不需要重复处理 + // 支付单已经被支付,不需要重复处理 if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())) { return result.setStatus(PayNotifyStatusEnum.IGNORE.getCode()).setMsg("支付单已经是支付成功状态,不进行处理"); } - // payment已被取消,记录回调记录 + // 支付单已被取消,记录回调记录 TODO 考虑不全, 需要做支付订单的取消处理 if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.PROGRESS.getCode())) { return result.setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("支付单不是待支付状态,记录回调记录"); } - // 2.通过工厂生成对应的策略组 - PayParam payParam = null; - - List paymentStrategyList = PayStrategyFactory.createAsyncFront(payParam.getPayWays()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - return result.setStatus(PayStatusEnum.FAIL.getCode()).setMsg("支付单数据非法,未找到对应的支付方式"); - } - - // 3.初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payOrder, payParam); - } - // 4.处理方法, 支付时只有一种payModel(异步支付), 失败时payment的所有payModel都会生效 - boolean handlerFlag = this.doHandler(payOrder, paymentStrategyList, (strategyList, paymentObj) -> { - // 执行异步支付方式的成功回调(不会有同步payModel) - strategyList.forEach(absPaymentStrategy -> absPaymentStrategy.doAsyncSuccessHandler(map)); - - // 修改payment支付状态为成功 - paymentObj.setStatus(PayStatusEnum.SUCCESS.getCode()); - paymentObj.setPayTime(LocalDateTime.now()); - payOrderService.updateById(paymentObj); - }); - - if (handlerFlag) { - // 5. 发送成功事件 -// eventSender.sendPayComplete(PayEventBuilder.buildPayComplete(payOrder)); - } - else { - return result.setStatus(PayStatusEnum.FAIL.getCode()).setMsg("回调处理过程报错"); - } + // 执行支付完成修复逻辑 + PayRepairParam payRepairParam = new PayRepairParam() + .setRepairSource(PayRepairSourceEnum.CALLBACK) + .setRepairType(PayRepairTypeEnum.SUCCESS); + payRepairService.repair(payOrder, payRepairParam); return result; } /** - * 失败处理, 关闭并退款 按说这块不会发生 + * 失败处理, 关闭并退款 */ - private PayCallbackResult fail(PayOrder payOrder, Map map) { + private PayCallbackResult fail(PayOrder payOrder) { PayCallbackResult result = new PayCallbackResult().setStatus(PayStatusEnum.SUCCESS.getCode()); - // payment已被取消,记录回调记录,后期处理 + // payment已被取消,记录回调记录,后期处理 TODO 考虑不完善, 后续优化 if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.PROGRESS.getCode())) { return result.setStatus(PayNotifyStatusEnum.IGNORE.getCode()).setMsg("支付单已经取消,记录回调记录"); } - // payment支付成功, 状态非法 + // payment支付成功, 状态非法 TODO 考虑不完善, 后续优化 if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())) { return result.setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("支付单状态非法,支付网关状态为失败,但支付单状态为已完成"); } - // 2.通过工厂生成对应的策略组 - PayParam payParam = null; - List paymentStrategyList = PayStrategyFactory.createAsyncFront(payParam.getPayWays()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - return result.setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("支付单数据非法,未找到对应的支付方式"); - } - // 3.初始化支付关闭的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payOrder, payParam); - } - // 4.处理方法, 支付时只有一种payModel(异步支付), 失败时payment的所有payModel都会生效 - boolean handlerFlag = this.doHandler(payOrder, paymentStrategyList, (strategyList, paymentObj) -> { - // 执行异步支付方式的失败回调(不会有同步payModel) - strategyList.forEach(AbsPayStrategy::doCloseHandler); - - // 修改payment支付状态为撤销 - paymentObj.setStatus(PayStatusEnum.CLOSE.getCode()); - payOrderService.updateById(paymentObj); - }); - - if (handlerFlag) { - // 5. 发送退款事件 -// eventSender.sendPayRefund(PayEventBuilder.buildPayRefund(payOrder)); - } - else { - return result.setStatus(PayNotifyStatusEnum.FAIL.getCode()).setMsg("回调处理过程报错"); - } - + // 执行支付关闭修复逻辑 + PayRepairParam payRepairParam = new PayRepairParam() + .setRepairSource(PayRepairSourceEnum.CALLBACK) + .setRepairType(PayRepairTypeEnum.CLOSE); + payRepairService.repair(payOrder, payRepairParam); return result; } - /** - * 处理方法 - * @param payOrder 支付订单 - * @param strategyList 支付策略 - * @param successCallback 成功操作 - */ - private boolean doHandler(PayOrder payOrder, List strategyList, - PayStrategyConsumer, PayOrder> successCallback) { - - try { - // 1.获取异步支付方式,通过工厂生成对应的策略组 - List syncPaymentStrategyList = strategyList.stream() - .filter(paymentStrategy -> PayChannelEnum.ASYNC_TYPE.contains(paymentStrategy.getType())) - .collect(Collectors.toList()); - // 执行成功方法 - successCallback.accept(syncPaymentStrategyList, payOrder); - } - catch (Exception e) { - // error事件的处理 - this.asyncErrorHandler(payOrder, strategyList, e); - return false; - } - return true; - } - - /** - * 对Error的处理 - */ - private void asyncErrorHandler(PayOrder payOrder, List strategyList, Exception e) { - - // 默认的错误信息 - ExceptionInfo exceptionInfo = new ExceptionInfo(PayStatusEnum.FAIL.getCode(), e.getMessage()); -// if (e instanceof BaseException) { -// exceptionInfo = ((BaseException) e).getExceptionInfo(); -// } -// else if (e instanceof ErrorCodeRuntimeException) { -// ErrorCodeRuntimeException ex = (ErrorCodeRuntimeException) e; -// exceptionInfo = new ExceptionInfo(String.valueOf(ex.getCode()), ex.getMessage()); -// } - - // 更新Payment的状态 -// payOrder.setErrorCode(String.valueOf(exceptionInfo.getErrorCode())); -// payOrder.setErrorMsg(String.valueOf(exceptionInfo.getErrorMsg())); -// payOrder.setPayStatus(PayStatusCode.TRADE_FAIL); - payOrderService.updateById(payOrder); - - // 调用失败处理 - for (AbsPayStrategy paymentStrategy : strategyList) { - paymentStrategy.doAsyncErrorHandler(exceptionInfo); - } - } - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/close/service/PayCloseService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/close/service/PayCloseService.java index 4d675954..0d52d817 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/close/service/PayCloseService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/close/service/PayCloseService.java @@ -2,9 +2,9 @@ package cn.bootx.platform.daxpay.core.payment.close.service; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.close.factory.PayCloseStrategyFactory; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.exception.pay.PayUnsupportedMethodException; import cn.bootx.platform.daxpay.func.AbsPayCloseStrategy; @@ -28,7 +28,7 @@ import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class PayCloseService { - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; /** * 关闭支付 @@ -37,11 +37,11 @@ public class PayCloseService { public void close(PayCloseParam param){ PayOrder payOrder = null; if (Objects.nonNull(param.getPaymentId())){ - payOrder = payOrderManager.findById(param.getPaymentId()) + payOrder = payOrderService.findById(param.getPaymentId()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } if (Objects.isNull(payOrder)){ - payOrder = payOrderManager.findByBusinessNo(param.getBusinessNo()) + payOrder = payOrderService.findByBusinessNo(param.getBusinessNo()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } this.close(payOrder); @@ -91,6 +91,6 @@ public class PayCloseService { private void successHandler(PayOrder payOrder){ // 取消订单 payOrder.setStatus(PayStatusEnum.CLOSE.getCode()); - payOrderManager.updateById(payOrder); + payOrderService.updateById(payOrder); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java index 3b3dd7d6..33f20601 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java @@ -1,11 +1,23 @@ package cn.bootx.platform.daxpay.core.payment.pay.service; +import cn.bootx.platform.common.core.exception.DataNotExistException; +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.common.context.NoticeLocal; import cn.bootx.platform.daxpay.common.context.PlatformLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.builder.PaymentBuilder; +import cn.bootx.platform.daxpay.core.record.pay.dao.PayOrderChannelManager; +import cn.bootx.platform.daxpay.core.record.pay.dao.PayOrderExtraManager; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderExtra; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.pay.PayParam; +import cn.bootx.platform.daxpay.param.pay.PayWayParam; import cn.bootx.platform.daxpay.util.PayUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -13,7 +25,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * 支付支持服务 @@ -25,6 +40,10 @@ import java.util.Objects; @RequiredArgsConstructor public class PayAssistService { + private final PayOrderService payOrderService; + private final PayOrderExtraManager payOrderExtraManager; + private final PayOrderChannelManager payOrderChannelManager; + /** * 初始化支付相关上下文 */ @@ -83,4 +102,89 @@ public class PayAssistService { noticeInfo.setQuitUrl(payParam.getQuitUrl()); } + + /** + * 获取异步支付参数 + */ + public PayWayParam getAsyncPayParam(PayParam payParam, PayOrder payOrder) { + // 查询之前的支付方式 + String asyncPayChannel = payOrder.getAsyncPayChannel(); + PayOrderChannel payOrderChannel = payOrderChannelManager.findByPaymentIdAndChannel(payOrder.getId(), asyncPayChannel) + .orElseThrow(() -> new PayFailureException("支付方式数据异常")); + + // 新的异步支付方式 + PayWayParam payWayParam = payParam.getPayWays() + .stream() + .filter(payMode -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payMode.getChannel())) + .findFirst() + .orElseThrow(() -> new PayFailureException("支付方式数据异常")); + // 新传入的金额是否一致 + if (!Objects.equals(payOrderChannel.getAmount(), payWayParam.getAmount())){ + throw new PayFailureException("传入的支付金额非法!与订单金额不一致"); + } + return payWayParam; + } + + /** + * 创建支付订单/附加表/支付通道表并保存,返回支付订单 + */ + public PayOrder createPayOrder(PayParam payParam) { + // 构建支付订单并保存 + PayOrder payOrder = PaymentBuilder.buildPayOrder(payParam); + payOrderService.save(payOrder); + // 构建支付订单扩展表并保存 + PayOrderExtra payOrderExtra = PaymentBuilder.buildPayOrderExtra(payParam, payOrder.getId()); + payOrderExtraManager.save(payOrderExtra); + // 构建支付通道表并保存 + List payOrderChannels = PaymentBuilder.buildPayChannel(payParam.getPayWays()) + .stream() + .peek(o -> o.setPaymentId(payOrder.getId())) + .collect(Collectors.toList()); + payOrderChannelManager.saveAll(payOrderChannels); + return payOrder; + } + + /** + * 更新支付订单扩展参数 + * @param payParam 支付参数 + * @param paymentId 支付订单id + */ + public void updatePayOrderExtra(PayParam payParam,Long paymentId){ + PayOrderExtra payOrderExtra = payOrderExtraManager.findById(paymentId) + .orElseThrow(() -> new DataNotExistException("支付订单不存在")); + payOrderExtra.setReqTime(payParam.getReqTime()) + .setSign(payParam.getSign()) + .setNotNotify(payParam.isNotNotify()) + .setNotifyUrl(payParam.getNotifyUrl()) + .setClientIp(payParam.getClientIp()); + payOrderExtraManager.updateById(payOrderExtra); + } + + /** + * 校验支付状态,支付成功则返回,支付失败则抛出对应的异常 + */ + public PayOrder getOrderAndCheck(String businessNo) { + // 根据订单查询支付记录 + PayOrder payOrder = payOrderService.findByBusinessNo(businessNo).orElse(null); + if (Objects.nonNull(payOrder)) { + // 支付失败类型状态 + List tradesStatus = Arrays.asList(PayStatusEnum.FAIL.getCode(), PayStatusEnum.CANCEL.getCode(), + PayStatusEnum.CLOSE.getCode()); + if (tradesStatus.contains(payOrder.getStatus())) { + throw new PayFailureException("支付失败或已经被撤销"); + } + // 退款类型状态 + tradesStatus = Arrays.asList(PayStatusEnum.REFUNDED.getCode(), PayStatusEnum.PARTIAL_REFUND.getCode()); + if (tradesStatus.contains(payOrder.getStatus())) { + throw new PayFailureException("支付失败或已经被撤销"); + } + // 支付超时状态 + if (Objects.nonNull(payOrder.getExpiredTime()) + && LocalDateTimeUtil.ge(LocalDateTime.now(), payOrder.getExpiredTime())) { + throw new PayFailureException("支付已超时"); + } + } + return payOrder; + } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayService.java index c4fce085..8482265a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayService.java @@ -1,18 +1,10 @@ package cn.bootx.platform.daxpay.core.payment.pay.service; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; -import cn.bootx.platform.daxpay.core.order.pay.builder.PaymentBuilder; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderChannelManager; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderExtraManager; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderExtra; import cn.bootx.platform.daxpay.core.payment.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import cn.bootx.platform.daxpay.core.record.pay.builder.PaymentBuilder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.exception.pay.PayUnsupportedMethodException; import cn.bootx.platform.daxpay.func.AbsPayStrategy; import cn.bootx.platform.daxpay.func.PayStrategyConsumer; @@ -32,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; import java.util.function.Consumer; -import java.util.stream.Collectors; /** @@ -46,13 +37,9 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class PayService { - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; - private final PayAssistService payAssistService;; - - private final PayOrderExtraManager payOrderExtraManager; - - private final PayOrderChannelManager payOrderChannelManager; + private final PayAssistService payAssistService; /** * 支付下单接口(同步/异步/组合支付) @@ -69,7 +56,7 @@ public class PayService { PayUtil.validationAsyncPayMode(payParam); // 获取并校验支付订单状态 - PayOrder payOrder = this.getAndCheckByBusinessNo(payParam.getBusinessNo()); + PayOrder payOrder = payAssistService.getOrderAndCheck(payParam.getBusinessNo()); // 初始化上下文 payAssistService.initPayContext(payOrder, payParam); @@ -114,7 +101,7 @@ public class PayService { PayUtil.validationAmount(payParam.getPayWays()); // 3. 创建支付相关的记录并返回支付订单对象 - payOrder = this.createPayOrder(payParam); + payOrder = payAssistService.createPayOrder(payParam); // 4. 调用支付方法进行发起支付 this.firstPayHandler(payParam, payOrder); @@ -152,7 +139,7 @@ public class PayService { payOrderObj.setStatus(PayStatusEnum.SUCCESS.getCode()); payOrderObj.setPayTime(LocalDateTime.now()); } - payOrderManager.updateById(payOrderObj); + payOrderService.updateById(payOrderObj); }); } @@ -162,14 +149,14 @@ public class PayService { private PayResult paySyncNotFirst(PayParam payParam, PayOrder payOrder) { // 1. 处理支付完成情况(完成/退款) - List trades = Arrays.asList(PayStatusEnum.SUCCESS.getCode(), PayStatusEnum.CANCEL.getCode(),PayStatusEnum.CLOSE.getCode(), + List trades = Arrays.asList(PayStatusEnum.SUCCESS.getCode(), PayStatusEnum.CLOSE.getCode(), PayStatusEnum.PARTIAL_REFUND.getCode(), PayStatusEnum.REFUNDED.getCode()); if (trades.contains(payOrder.getStatus())) { return PaymentBuilder.buildPayResultByPayOrder(payOrder); } // 2.获取 异步支付通道,通过工厂生成对应的策略组(只包含异步支付的策略, 同步支付相关逻辑不再进行执行) - PayWayParam payWayParam = this.getAsyncPayParam(payParam, payOrder); + PayWayParam payWayParam = payAssistService.getAsyncPayParam(payParam, payOrder); List asyncStrategyList = PayStrategyFactory.createAsyncLast(Collections.singletonList(payWayParam)); // 3.初始化支付的参数 @@ -183,13 +170,16 @@ public class PayService { this.doHandler(payOrder, asyncStrategyList, AbsPayStrategy::doPayHandler, (strategyList, paymentObj) -> { // 发起支付成功进行的执行方法 strategyList.forEach(AbsPayStrategy::doSuccessHandler); - payOrderManager.updateById(paymentObj); + payOrderService.updateById(paymentObj); }); // 6. 更新支付订单扩展参数 - updatePayOrderExtra(payParam,payOrder.getId()); + payAssistService.updatePayOrderExtra(payParam,payOrder.getId()); - // 7. 组装返回参数 + // 7. 更新订单过期时间 + + + // 8. 组装返回参数 return PaymentBuilder.buildPayResultByPayOrder(payOrder); } @@ -210,87 +200,4 @@ public class PayService { Optional.ofNullable(successMethod).ifPresent(fun -> fun.accept(strategyList, payment)); } - /** - * 获取异步支付参数 - */ - private PayWayParam getAsyncPayParam(PayParam payParam, PayOrder payOrder) { - // 查询之前的支付方式 - String asyncPayChannel = payOrder.getAsyncPayChannel(); - PayOrderChannel payOrderChannel = payOrderChannelManager.findByPaymentIdAndChannel(payOrder.getId(), asyncPayChannel) - .orElseThrow(() -> new PayFailureException("支付方式数据异常")); - - // 新的异步支付方式 - PayWayParam payWayParam = payParam.getPayWays() - .stream() - .filter(payMode -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payMode.getChannel())) - .findFirst() - .orElseThrow(() -> new PayFailureException("支付方式数据异常")); - // 新传入的金额是否一致 - if (!Objects.equals(payOrderChannel.getAmount(), payWayParam.getAmount())){ - throw new PayFailureException("传入的支付金额非法!与订单金额不一致"); - } - return payWayParam; - } - - /** - * 创建支付订单/附加表/支付通道表并保存,返回支付订单 - */ - private PayOrder createPayOrder(PayParam payParam) { - // 构建支付订单并保存 - PayOrder payOrder = PaymentBuilder.buildPayOrder(payParam); - payOrderManager.save(payOrder); - // 构建支付订单扩展表并保存 - PayOrderExtra payOrderExtra = PaymentBuilder.buildPayOrderExtra(payParam, payOrder.getId()); - payOrderExtraManager.save(payOrderExtra); - // 构建支付通道表并保存 - List payOrderChannels = PaymentBuilder.buildPayChannel(payParam.getPayWays()) - .stream() - .peek(o -> o.setPaymentId(payOrder.getId())) - .collect(Collectors.toList()); - payOrderChannelManager.saveAll(payOrderChannels); - return payOrder; - } - - /** - * 更新支付订单扩展参数 - * @param payParam 支付参数 - * @param paymentId 支付订单id - */ - private void updatePayOrderExtra(PayParam payParam,Long paymentId){ - PayOrderExtra payOrderExtra = payOrderExtraManager.findById(paymentId) - .orElseThrow(() -> new DataNotExistException("支付订单不存在")); - payOrderExtra.setReqTime(payParam.getReqTime()) - .setSign(payParam.getSign()) - .setNotNotify(payParam.isNotNotify()) - .setNotifyUrl(payParam.getNotifyUrl()) - .setClientIp(payParam.getClientIp()); - payOrderExtraManager.updateById(payOrderExtra); - } - - /** - * 校验支付状态,支付成功则返回,支付失败则抛出对应的异常 - */ - private PayOrder getAndCheckByBusinessNo(String businessNo) { - // 根据订单查询支付记录 - PayOrder payment = payOrderManager.findByBusinessNo(businessNo).orElse(null); - if (Objects.nonNull(payment)) { - // 支付失败类型状态 - List tradesStatus = Arrays.asList(PayStatusEnum.FAIL.getCode(), PayStatusEnum.CANCEL.getCode(), - PayStatusEnum.CLOSE.getCode()); - if (tradesStatus.contains(payment.getStatus())) { - throw new PayFailureException("支付失败或已经被撤销"); - } - // 退款类型状态 - tradesStatus = Arrays.asList(PayStatusEnum.REFUNDED.getCode(), PayStatusEnum.PARTIAL_REFUND.getCode()); - if (tradesStatus.contains(payment.getStatus())) { - throw new PayFailureException("支付失败或已经被撤销"); - } - // 支付超时状态 - if (Objects.nonNull(payment.getExpiredTime()) - && LocalDateTimeUtil.ge(LocalDateTime.now(), payment.getExpiredTime())) { - throw new PayFailureException("支付已超时"); - } - } - return payment; - } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/AliPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/AliPayStrategy.java index 1cae232a..e2a82fb5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/AliPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/AliPayStrategy.java @@ -1,11 +1,12 @@ package cn.bootx.platform.daxpay.core.payment.pay.strategy; -import cn.bootx.platform.daxpay.code.AliPayCode; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayConfig; -import cn.bootx.platform.daxpay.core.channel.alipay.service.*; +import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayCloseService; +import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayConfigService; +import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayOrderService; +import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayService; import cn.bootx.platform.daxpay.exception.pay.PayAmountAbnormalException; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.func.AbsPayStrategy; @@ -18,8 +19,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.Map; - import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -102,24 +101,6 @@ public class AliPayStrategy extends AbsPayStrategy { this.doCloseHandler(); } - /** - * 异步支付成功 - */ - @Override - public void doAsyncSuccessHandler(Map map) { - PaymentContextLocal.get().getAsyncPayInfo().setTradeNo(map.get(AliPayCode.TRADE_NO)); - aliPaymentService.updateAsyncSuccess(this.getOrder(), this.getPayWayParam().getAmount()); - } - - /** - * 异步支付失败 - */ - @Override - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - // 调用撤销支付 - this.doCloseHandler(); - } - /** * 关闭支付记录 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/CashPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/CashPayStrategy.java index bdd0886b..13f9af83 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/CashPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/CashPayStrategy.java @@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.core.payment.pay.strategy; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.core.channel.cash.service.CashService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.exception.pay.PayAmountAbnormalException; import cn.bootx.platform.daxpay.func.AbsPayStrategy; import cn.bootx.platform.daxpay.param.pay.PayWayParam; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/WeChatPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/WeChatPayStrategy.java index d26c283e..e4f8c158 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/WeChatPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/strategy/WeChatPayStrategy.java @@ -1,9 +1,7 @@ package cn.bootx.platform.daxpay.core.payment.pay.strategy; import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.code.WeChatPayCode; import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayCloseService; @@ -22,8 +20,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.Map; - import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -113,24 +109,6 @@ public class WeChatPayStrategy extends AbsPayStrategy { this.doCloseHandler(); } - /** - * 异步支付成功 - */ - @Override - public void doAsyncSuccessHandler(Map map) { - PaymentContextLocal.get().getAsyncPayInfo().setTradeNo(map.get(WeChatPayCode.TRANSACTION_ID)); - weChatPayOrderService.updateAsyncSuccess(this.getOrder().getId(), this.getPayWayParam()); - } - - /** - * 异步支付失败 - */ - @Override - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - // 调用关闭支付 - this.doCloseHandler(); - } - /** * 关闭本地支付记录 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java index 665e7ba3..cdbb0cef 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java @@ -8,10 +8,10 @@ import cn.bootx.platform.daxpay.common.context.AsyncRefundLocal; import cn.bootx.platform.daxpay.common.context.NoticeLocal; import cn.bootx.platform.daxpay.common.context.PlatformLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.refund.dao.PayRefundOrderManager; +import cn.bootx.platform.daxpay.core.record.refund.entity.PayRefundOrder; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.pay.RefundChannelParam; import cn.bootx.platform.daxpay.param.pay.RefundParam; @@ -36,7 +36,7 @@ import java.util.Objects; @Service @RequiredArgsConstructor public class PayRefundAssistService { - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; private final PayRefundOrderManager payRefundOrderManager; @@ -79,11 +79,11 @@ public class PayRefundAssistService { PayOrder payOrder = null; if (Objects.nonNull(param.getPaymentId())){ - payOrder = payOrderManager.findById(param.getPaymentId()) + payOrder = payOrderService.findById(param.getPaymentId()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } if (Objects.isNull(payOrder)){ - payOrder = payOrderManager.findByBusinessNo(param.getBusinessNo()) + payOrder = payOrderService.findByBusinessNo(param.getBusinessNo()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java index 895e115b..e672caff 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java @@ -2,11 +2,11 @@ package cn.bootx.platform.daxpay.core.payment.refund.service; import cn.bootx.platform.common.core.util.ValidationUtil; import cn.bootx.platform.daxpay.code.PayStatusEnum; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.refund.factory.PayRefundStrategyFactory; -import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.exception.pay.PayUnsupportedMethodException; +import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import cn.bootx.platform.daxpay.param.pay.RefundChannelParam; import cn.bootx.platform.daxpay.param.pay.RefundParam; import cn.bootx.platform.daxpay.param.pay.SimpleRefundParam; @@ -34,7 +34,7 @@ public class PayRefundService { private final PayRefundAssistService payRefundAssistService;; - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; /** * 支付退款 */ @@ -136,7 +136,7 @@ public class PayRefundService { payOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode()); } payOrder.setRefundableBalance(refundableBalance); - payOrderManager.updateById(payOrder); + payOrderService.updateById(payOrder); payRefundAssistService.saveRefundOrder(refundParam,payOrder); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/AliPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/AliPayRefundStrategy.java index 4cbc3668..ae4df642 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/AliPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/AliPayRefundStrategy.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayOrderService; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayRefundService; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayConfigService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/CashPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/CashPayRefundStrategy.java index 22375f8e..96c1ed0f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/CashPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/CashPayRefundStrategy.java @@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.core.payment.refund.strategy; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.core.channel.cash.service.CashService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/VoucherPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/VoucherPayRefundStrategy.java index 41e3f3ee..4ffb3e68 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/VoucherPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/VoucherPayRefundStrategy.java @@ -3,7 +3,7 @@ package cn.bootx.platform.daxpay.core.payment.refund.strategy; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPayService; import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPayOrderService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WalletPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WalletPayRefundStrategy.java index afb086b7..8cec8277 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WalletPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WalletPayRefundStrategy.java @@ -3,7 +3,7 @@ package cn.bootx.platform.daxpay.core.payment.refund.strategy; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPayService; import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPayOrderService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WeChatPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WeChatPayRefundStrategy.java index e2f7f00f..de4c2964 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WeChatPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/strategy/WeChatPayRefundStrategy.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayConfigService; import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayOrderService; import cn.bootx.platform.daxpay.core.channel.wechat.service.WechatRefundService; -import cn.bootx.platform.daxpay.core.order.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/service/PayRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/service/PayRepairService.java index a66acce1..1258e4bd 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/service/PayRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/service/PayRepairService.java @@ -2,10 +2,10 @@ package cn.bootx.platform.daxpay.core.payment.repair.service; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.repair.factory.PayRepairStrategyFactory; import cn.bootx.platform.daxpay.core.payment.repair.param.PayRepairParam; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; import cn.bootx.platform.daxpay.func.AbsPayRepairStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,7 +26,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class PayRepairService { - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; /** * 修复支付单 @@ -40,9 +40,7 @@ public class PayRepairService { .collect(Collectors.toList()); // 初始化修复参数 List repairStrategies = PayRepairStrategyFactory.createAsyncLast(channels); - for (AbsPayRepairStrategy repairStrategy : repairStrategies) { - repairStrategy.initRepairParam(order, repairParam.getRepairSource()); - } + repairStrategies.forEach(repairStrategy -> repairStrategy.initRepairParam(order, repairParam.getRepairSource())); // 根据不同的类型执行对应的修复逻辑 switch (repairParam.getRepairType()) { case SUCCESS: @@ -72,7 +70,7 @@ public class PayRepairService { // 修改订单支付状态为成功 payment.setStatus(PayStatusEnum.SUCCESS.getCode()); payment.setPayTime(LocalDateTime.now()); - payOrderManager.updateById(payment); + payOrderService.updateById(payment); } /** @@ -84,7 +82,7 @@ public class PayRepairService { // 执行策略的关闭方法 absPayStrategies.forEach(AbsPayRepairStrategy::doCloseHandler); payOrder.setStatus(PayStatusEnum.CLOSE.getCode()); - payOrderManager.updateById(payOrder); + payOrderService.updateById(payOrder); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/strategy/AliPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/strategy/AliPayRepairStrategy.java index db4eead6..c86d06ff 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/strategy/AliPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/repair/strategy/AliPayRepairStrategy.java @@ -6,8 +6,8 @@ import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayCloseService; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayOrderService; import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayConfigService; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderChannelManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.dao.PayOrderChannelManager; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.func.AbsPayRepairStrategy; import lombok.RequiredArgsConstructor; @@ -40,7 +40,6 @@ public class AliPayRepairStrategy extends AbsPayRepairStrategy { public void doBeforeHandler() { AliPayConfig config = aliPayConfigService.getConfig(); aliPayConfigService.initConfig(config); - } /** * 支付成功处理 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/service/PaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/service/PaySyncService.java index c9cf4b50..1dca026e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/service/PaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/service/PaySyncService.java @@ -5,13 +5,13 @@ import cn.bootx.platform.daxpay.code.PayRepairSourceEnum; import cn.bootx.platform.daxpay.code.PayRepairTypeEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.sync.service.PaySyncOrderService; import cn.bootx.platform.daxpay.core.payment.repair.param.PayRepairParam; import cn.bootx.platform.daxpay.core.payment.repair.service.PayRepairService; import cn.bootx.platform.daxpay.core.payment.sync.factory.PaySyncStrategyFactory; import cn.bootx.platform.daxpay.core.payment.sync.result.GatewaySyncResult; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.service.PayOrderService; +import cn.bootx.platform.daxpay.core.record.sync.service.PaySyncOrderService; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.func.AbsPaySyncStrategy; import cn.bootx.platform.daxpay.param.pay.PaySyncParam; @@ -31,7 +31,7 @@ import java.util.Objects; @Service @RequiredArgsConstructor public class PaySyncService { - private final PayOrderManager payOrderManager; + private final PayOrderService payOrderService; private final PaySyncOrderService syncOrderService; @@ -43,11 +43,11 @@ public class PaySyncService { public PaySyncResult sync(PaySyncParam param) { PayOrder payOrder = null; if (Objects.nonNull(param.getPaymentId())){ - payOrder = payOrderManager.findById(param.getPaymentId()) + payOrder = payOrderService.findById(param.getPaymentId()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } if (Objects.isNull(payOrder)){ - payOrder = payOrderManager.findByBusinessNo(param.getBusinessNo()) + payOrder = payOrderService.findByBusinessNo(param.getBusinessNo()) .orElseThrow(() -> new PayFailureException("未查询到支付订单")); } // 如果不是异步支付, 直接返回返回 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/task/PayOrderSyncTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/task/PayOrderSyncTaskService.java new file mode 100644 index 00000000..c8e5f8c2 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/sync/task/PayOrderSyncTaskService.java @@ -0,0 +1,40 @@ +package cn.bootx.platform.daxpay.core.payment.sync.task; + +import cn.bootx.platform.daxpay.core.payment.sync.service.PaySyncService; +import cn.bootx.platform.daxpay.core.timeout.dao.PayExpiredTimeRepository; +import cn.bootx.platform.daxpay.param.pay.PaySyncParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 对未过期的支付中订单进行状态同步 + * @author xxm + * @since 2024/1/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayOrderSyncTaskService { + private final PayExpiredTimeRepository PayExpiredTimeRepository; + + private final PaySyncService paySyncService; + + /** + * 同步支付订单任务 + */ + public void syncTask() { + log.info("开始同步支付订单"); + // 1. 从超时订单列表中获取到未超时的订单号 + for (String s : PayExpiredTimeRepository.getNormalKeysBy7Day()) { + try { + Long paymentId = Long.parseLong(s); + PaySyncParam paySyncParam = new PaySyncParam(); + paySyncParam.setPaymentId(paymentId); + paySyncService.sync(paySyncParam); + } catch (Exception e) { + log.error("同步支付订单异常", e); + } + } + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/convert/CallbackRecordMConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/convert/CallbackRecordMConvert.java new file mode 100644 index 00000000..99225347 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/convert/CallbackRecordMConvert.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.core.record.callback.convert; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 回调通知转换 + * @author xxm + * @since 2023/12/18 + */ +@Mapper +public interface CallbackRecordMConvert { + CallbackRecordMConvert CONVERT = Mappers.getMapper(CallbackRecordMConvert.class); +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordManager.java similarity index 50% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordManager.java index f03670b3..2016a7d3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/dao/CallbackNotifyManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordManager.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.core.callback.dao; +package cn.bootx.platform.daxpay.core.record.callback.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.callback.entity.CallbackNotify; +import cn.bootx.platform.daxpay.core.record.callback.entity.CallbackRecord; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -12,5 +12,5 @@ import org.springframework.stereotype.Repository; */ @Slf4j @Repository -public class CallbackNotifyManager extends BaseManager { +public class CallbackRecordManager extends BaseManager { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordMapper.java new file mode 100644 index 00000000..58dae43f --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/dao/CallbackRecordMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.core.record.callback.dao; + +import cn.bootx.platform.daxpay.core.record.callback.entity.CallbackRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2023/12/18 + */ +@Mapper +public interface CallbackRecordMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/entity/CallbackNotify.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/entity/CallbackRecord.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/entity/CallbackNotify.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/entity/CallbackRecord.java index 9f933202..4fa65aed 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/entity/CallbackNotify.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/entity/CallbackRecord.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.callback.entity; +package cn.bootx.platform.daxpay.core.record.callback.entity; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.daxpay.code.PayChannelEnum; @@ -20,7 +20,7 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -public class CallbackNotify extends MpCreateEntity { +public class CallbackRecord extends MpCreateEntity { /** 支付记录id */ @DbComment("支付记录id") private Long paymentId; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/service/CallbackNotifyService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/service/CallbackRecordService.java similarity index 70% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/service/CallbackNotifyService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/service/CallbackRecordService.java index 65e8ed08..e11dca6a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/callback/service/CallbackNotifyService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/callback/service/CallbackRecordService.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.callback.service; +package cn.bootx.platform.daxpay.core.record.callback.service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,5 +12,5 @@ import org.springframework.stereotype.Service; @Slf4j @Service @RequiredArgsConstructor -public class CallbackNotifyService { +public class CallbackRecordService { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/builder/PaymentBuilder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/builder/PaymentBuilder.java similarity index 91% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/builder/PaymentBuilder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/builder/PaymentBuilder.java index e571a76c..2db776c6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/builder/PaymentBuilder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/builder/PaymentBuilder.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.order.pay.builder; +package cn.bootx.platform.daxpay.core.record.pay.builder; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; @@ -6,9 +6,9 @@ import cn.bootx.platform.daxpay.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.common.context.NoticeLocal; import cn.bootx.platform.daxpay.common.context.PlatformLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderExtra; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderExtra; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; @@ -17,6 +17,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import lombok.experimental.UtilityClass; +import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -36,6 +37,10 @@ public class PaymentBuilder { * 构建payment记录 */ public PayOrder buildPayOrder(PayParam payParam) { + // 订单超时时间 + LocalDateTime expiredTime = PaymentContextLocal.get() + .getAsyncPayInfo() + .getExpiredTime(); // 可退款信息 List refundableInfos = buildRefundableInfo(payParam.getPayWays()); // 计算总价 @@ -56,6 +61,7 @@ public class PaymentBuilder { .setRefundableInfos(refundableInfos) .setStatus(PayStatusEnum.PROGRESS.getCode()) .setAmount(sumAmount) + .setExpiredTime(expiredTime) .setCombinationPay(payParam.getPayWays().size() > 1) .setAsyncPay(asyncPayMode.isPresent()) .setAsyncPayChannel(asyncPayMode.orElse(null)) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelManager.java similarity index 89% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelManager.java index 5262f3ce..c21b4a68 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelManager.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelMapper.java similarity index 68% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelMapper.java index 8787e01c..dfb618a4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderChannelMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderChannelMapper.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraManager.java similarity index 76% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraManager.java index 683941c8..a04d3000 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraManager.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderExtra; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderExtra; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraMapper.java similarity index 67% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraMapper.java index c8665fce..322f4bc7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderExtraMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderExtraMapper.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderExtra; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderExtra; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderManager.java similarity index 81% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderManager.java index 7fa36b39..ffe14b73 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderManager.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderMapper.java similarity index 66% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderMapper.java index 87fb7514..2cc0cdf1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/dao/PayOrderMapper.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.record.pay.dao; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrder.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrder.java index 539d81b4..66074933 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrder.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.order.pay.entity; +package cn.bootx.platform.daxpay.core.record.pay.entity; import cn.bootx.platform.common.core.annotation.BigField; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderChannel.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderChannel.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderChannel.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderChannel.java index e3fff1f2..b5541bb5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderChannel.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderChannel.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.order.pay.entity; +package cn.bootx.platform.daxpay.core.record.pay.entity; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.daxpay.param.channel.AliPayParam; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderExtra.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderExtra.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderExtra.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderExtra.java index 10864ba7..8b54eb3b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/entity/PayOrderExtra.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/entity/PayOrderExtra.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.order.pay.entity; +package cn.bootx.platform.daxpay.core.record.pay.entity; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderChannelService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderChannelService.java similarity index 86% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderChannelService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderChannelService.java index 1e13ea2e..20eb50ba 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/service/PayOrderChannelService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderChannelService.java @@ -1,9 +1,9 @@ -package cn.bootx.platform.daxpay.core.order.pay.service; +package cn.bootx.platform.daxpay.core.record.pay.service; import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderChannelManager; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.core.record.pay.dao.PayOrderChannelManager; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrderChannel; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderService.java new file mode 100644 index 00000000..af8ffa9a --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/pay/service/PayOrderService.java @@ -0,0 +1,86 @@ +package cn.bootx.platform.daxpay.core.record.pay.service; + +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; +import cn.bootx.platform.daxpay.core.record.pay.dao.PayOrderManager; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.timeout.service.PayExpiredTimeService; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * 支付订单服务 + * @author xxm + * @since 2023/12/18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayOrderService { + private final PayOrderManager payOrderManager; + + private final PayExpiredTimeService expiredTimeService; + + private final List ORDER_FINISH = Arrays.asList(PayStatusEnum.CLOSE.getCode(),PayStatusEnum.TIMEOUT.getCode(), PayStatusEnum.SUCCESS.getCode()); + + /** + * 根据id查询 + */ + public Optional findById(Long paymentId) { + return payOrderManager.findById(paymentId); + } + + /** + * 根据业务号查询 + */ + public Optional findByBusinessNo(String businessNo) { + return payOrderManager.findByBusinessNo(businessNo); + } + + /** + * 新增 + */ + public void save(PayOrder payOrder){ + // 异步支付需要添加订单超时任务记录 + if (payOrder.isAsyncPay()){ + expiredTimeService.registerExpiredTime(payOrder); + } + + payOrderManager.save(payOrder); + } + + /** + * 更新 + */ + public void updateById(PayOrder payOrder){ + // 如果是异步支付且支付订单完成, 需要删除订单超时任务记录 + if (payOrder.isAsyncPay() && ORDER_FINISH.contains(payOrder.getStatus())){ + expiredTimeService.cancelExpiredTime(payOrder.getId()); + } + payOrderManager.updateById(payOrder); + } + + /** + * 退款成功处理, 更新可退款信息 不要进行持久化 + */ + public void updateRefundSuccess(PayOrder payment, int amount, PayChannelEnum payChannelEnum) { + // 删除旧有的退款记录, 替换退款完的新的 + List refundableInfos = payment.getRefundableInfos(); + OrderRefundableInfo refundableInfo = refundableInfos.stream() + .filter(o -> Objects.equals(o.getChannel(), payChannelEnum.getCode())) + .findFirst() + .orElseThrow(() -> new PayFailureException("退款数据不存在")); + refundableInfos.remove(refundableInfo); + refundableInfo.setAmount(refundableInfo.getAmount() - amount); + refundableInfos.add(refundableInfo); + payment.setRefundableInfos(refundableInfos); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/convert/RefundConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/convert/RefundConvert.java similarity index 71% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/convert/RefundConvert.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/convert/RefundConvert.java index 21aa96d7..95f16168 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/convert/RefundConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/convert/RefundConvert.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.core.order.refund.convert; +package cn.bootx.platform.daxpay.core.record.refund.convert; -import cn.bootx.platform.daxpay.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.core.record.refund.entity.PayRefundOrder; import cn.bootx.platform.daxpay.dto.order.refund.PayRefundOrderDto; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderManager.java similarity index 90% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderManager.java index 9b0f1893..3368ad05 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderManager.java @@ -1,10 +1,10 @@ -package cn.bootx.platform.daxpay.core.order.refund.dao; +package cn.bootx.platform.daxpay.core.record.refund.dao; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.core.record.refund.entity.PayRefundOrder; import cn.bootx.platform.daxpay.dto.order.refund.PayRefundOrderDto; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderMapper.java similarity index 63% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderMapper.java index 720c89ae..5622fd61 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/dao/PayRefundOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/dao/PayRefundOrderMapper.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.core.order.refund.dao; +package cn.bootx.platform.daxpay.core.record.refund.dao; -import cn.bootx.platform.daxpay.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.core.record.refund.entity.PayRefundOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/entity/PayRefundOrder.java similarity index 93% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/entity/PayRefundOrder.java index 0a83b5b9..5be7d0cf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/entity/PayRefundOrder.java @@ -1,11 +1,11 @@ -package cn.bootx.platform.daxpay.core.order.refund.entity; +package cn.bootx.platform.daxpay.core.record.refund.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler; import cn.bootx.platform.daxpay.code.PayRefundStatusEnum; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; -import cn.bootx.platform.daxpay.core.order.refund.convert.RefundConvert; +import cn.bootx.platform.daxpay.core.record.refund.convert.RefundConvert; import cn.bootx.platform.daxpay.dto.order.refund.PayRefundOrderDto; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/service/PayRefundRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/service/PayRefundRecordService.java similarity index 84% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/service/PayRefundRecordService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/service/PayRefundRecordService.java index b955782b..94f975b1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/service/PayRefundRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/refund/service/PayRefundRecordService.java @@ -1,11 +1,11 @@ -package cn.bootx.platform.daxpay.core.order.refund.service; +package cn.bootx.platform.daxpay.core.record.refund.service; import cn.bootx.platform.common.core.exception.DataNotExistException; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.core.record.refund.dao.PayRefundOrderManager; +import cn.bootx.platform.daxpay.core.record.refund.entity.PayRefundOrder; import cn.bootx.platform.daxpay.dto.order.refund.PayRefundOrderDto; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/convert/PaySyncRecordConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/convert/PaySyncRecordConvert.java new file mode 100644 index 00000000..cad5721b --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/convert/PaySyncRecordConvert.java @@ -0,0 +1,19 @@ +package cn.bootx.platform.daxpay.core.record.sync.convert; + +import cn.bootx.platform.daxpay.core.record.sync.entity.PaySyncRecord; +import cn.bootx.platform.daxpay.dto.order.sync.PaySyncRecordDto; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 支付同步记录同步 + * @author xxm + * @since 2023/7/14 + */ +@Mapper +public interface PaySyncRecordConvert { + PaySyncRecordConvert CONVERT = Mappers.getMapper(PaySyncRecordConvert.class); + + PaySyncRecordDto convert(PaySyncRecord in); + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordManager.java similarity index 54% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordManager.java index bdc3a9a4..ed34df8a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/dao/PaySyncOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordManager.java @@ -1,11 +1,11 @@ -package cn.bootx.platform.daxpay.core.order.sync.dao; +package cn.bootx.platform.daxpay.core.record.sync.dao; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.order.sync.entity.PaySyncOrder; -import cn.bootx.platform.daxpay.dto.order.sync.PaySyncOrderDto; +import cn.bootx.platform.daxpay.core.record.sync.entity.PaySyncRecord; +import cn.bootx.platform.daxpay.dto.order.sync.PaySyncRecordDto; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,14 +21,14 @@ import java.util.Objects; @Slf4j @Repository @RequiredArgsConstructor -public class PaySyncOrderManager extends BaseManager { +public class PaySyncRecordManager extends BaseManager { - public Page page(PageParam pageParam, PaySyncOrderDto param) { - Page mpPage = MpUtil.getMpPage(pageParam, PaySyncOrder.class); + public Page page(PageParam pageParam, PaySyncRecordDto param) { + Page mpPage = MpUtil.getMpPage(pageParam, PaySyncRecord.class); return lambdaQuery().orderByDesc(MpIdEntity::getId) - .like(Objects.nonNull(param.getPaymentId()), PaySyncOrder::getPaymentId, param.getPaymentId()) - .eq(Objects.nonNull(param.getChannel()), PaySyncOrder::getChannel, param.getChannel()) - .eq(Objects.nonNull(param.getStatus()), PaySyncOrder::getStatus, param.getStatus()) + .like(Objects.nonNull(param.getPaymentId()), PaySyncRecord::getPaymentId, param.getPaymentId()) + .eq(Objects.nonNull(param.getChannel()), PaySyncRecord::getChannel, param.getChannel()) + .eq(Objects.nonNull(param.getStatus()), PaySyncRecord::getStatus, param.getStatus()) .page(mpPage); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordMapper.java new file mode 100644 index 00000000..3096ac8c --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/dao/PaySyncRecordMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.core.record.sync.dao; + +import cn.bootx.platform.daxpay.core.record.sync.entity.PaySyncRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 支付同步记录 + * @author xxm + * @since 2023/7/14 + */ +@Mapper +public interface PaySyncRecordMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/entity/PaySyncOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/entity/PaySyncRecord.java similarity index 79% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/entity/PaySyncOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/entity/PaySyncRecord.java index a9d2317c..a9eca40e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/sync/entity/PaySyncOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/record/sync/entity/PaySyncRecord.java @@ -1,11 +1,11 @@ -package cn.bootx.platform.daxpay.core.order.sync.entity; +package cn.bootx.platform.daxpay.core.record.sync.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; -import cn.bootx.platform.daxpay.core.order.sync.convert.PaySyncOrderConvert; -import cn.bootx.platform.daxpay.dto.order.sync.PaySyncOrderDto; +import cn.bootx.platform.daxpay.core.record.sync.convert.PaySyncRecordConvert; +import cn.bootx.platform.daxpay.dto.order.sync.PaySyncRecordDto; import cn.bootx.table.modify.annotation.DbComment; import cn.bootx.table.modify.annotation.DbTable; import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; @@ -26,8 +26,8 @@ import java.time.LocalDateTime; @Data @DbTable(comment = "支付同步订单") @Accessors(chain = true) -@TableName("pay_sync_order") -public class PaySyncOrder extends MpCreateEntity implements EntityBaseFunction { +@TableName("pay_sync_record") +public class PaySyncRecord extends MpCreateEntity implements EntityBaseFunction { /** 支付记录id */ @DbComment("支付记录id") @@ -69,7 +69,7 @@ public class PaySyncOrder extends MpCreateEntity implements EntityBaseFunction

page(PageParam pageParam, PaySyncOrderDto param) { - Page page = orderManager.page(pageParam, param); + public PageResult page(PageParam pageParam, PaySyncRecordDto param) { + Page page = orderManager.page(pageParam, param); return MpUtil.convert2DtoPageResult(page); } /** * 根据id查询 */ - public PaySyncOrderDto findById(Long id) { - return orderManager.findById(id).map(PaySyncOrder::toDto).orElseThrow(DataNotExistException::new); + public PaySyncRecordDto findById(Long id) { + return orderManager.findById(id).map(PaySyncRecord::toDto).orElseThrow(DataNotExistException::new); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/system/entity/OrderTimeoutConfig.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/system/entity/OrderTimeoutConfig.java new file mode 100644 index 00000000..9665a72f --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/system/entity/OrderTimeoutConfig.java @@ -0,0 +1,35 @@ +package cn.bootx.platform.daxpay.core.system.entity; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.table.modify.annotation.DbTable; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 订单超时配置 + * @author xxm + * @since 2024/1/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@DbTable(comment = "订单超时配置") +@TableName("pay_order_timeout_config") +public class OrderTimeoutConfig extends MpBaseEntity { + + /** + * 超时时间 + */ + private Integer timeout; + + /** + * 是否开启定时任务 + */ + private boolean cron; + + /** + * + */ +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayExpiredTimeRepository.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/dao/PayExpiredTimeRepository.java similarity index 67% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayExpiredTimeRepository.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/dao/PayExpiredTimeRepository.java index 15a98249..92fa324d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/pay/dao/PayExpiredTimeRepository.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/dao/PayExpiredTimeRepository.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.core.order.pay.dao; +package cn.bootx.platform.daxpay.core.timeout.dao; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.redis.RedisClient; @@ -33,15 +33,25 @@ public class PayExpiredTimeRepository { } /** - * 获取所有已过期的ExpiredTokenKey + * 获取所有已过期的订单ID */ - public Set retrieveExpiredKeys(LocalDateTime expiredTime) { + public Set getExpiredKeys(LocalDateTime expiredTime) { long time = LocalDateTimeUtil.timestamp(expiredTime); return redisClient.zrangeByScore(KEY, 0L, time); } /** - * 删除指定的ExpiredTokenKey + * 获取所有未过期的订单ID. (7天内的订单) + */ + public Set getNormalKeysBy7Day(){ + LocalDateTime now = LocalDateTime.now(); + long start = LocalDateTimeUtil.timestamp(now); + long end = LocalDateTimeUtil.timestamp(now.plusDays(7)); + return redisClient.zrangeByScore(KEY, start, end); + } + + /** + * 支付完成或者取消支付后, 需要调用这个方法来清除列表里的订单ID */ public void removeKeys(String... keys) { if (keys != null && keys.length > 0) { diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/service/PayExpiredTimeService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/service/PayExpiredTimeService.java new file mode 100644 index 00000000..880e9983 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/timeout/service/PayExpiredTimeService.java @@ -0,0 +1,57 @@ +package cn.bootx.platform.daxpay.core.timeout.service; + +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.common.spring.exception.RetryableException; +import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.timeout.dao.PayExpiredTimeRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.retry.annotation.Retryable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Objects; + +/** + * 支付超时处理 + * @author xxm + * @since 2024/1/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayExpiredTimeService { + private final PayExpiredTimeRepository repository; + + /** + * 支付单超时关闭事件注册, 失败重试3次, 间隔一秒 + */ + @Async("bigExecutor") + @Retryable(value = RetryableException.class) + public void registerExpiredTime(PayOrder payOrder) { + LocalDateTime expiredTime = payOrder.getExpiredTime(); + // 支付中且有超时时间才会注册超时关闭时间 + if (Objects.equals(payOrder.getStatus(), PayStatusEnum.PROGRESS.getCode()) && Objects.nonNull(expiredTime)) { + try { + // 将过期时间添加到redis中, 往后延时一分钟 + expiredTime = LocalDateTimeUtil.offset(expiredTime, 1, ChronoUnit.MINUTES); + repository.store(payOrder.getId(), expiredTime); + } + catch (Exception e) { + log.error("注册支付单超时关闭失败"); + throw new RetryableException(); + } + } + } + + /** + * 取消支付单超时关闭事件 + */ + public void cancelExpiredTime(Long paymentId) { + repository.removeKeys(String.valueOf(paymentId)); + } + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncOrderDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncRecordDto.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncOrderDto.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncRecordDto.java index 1c80068e..d5b17c5e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncOrderDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/sync/PaySyncRecordDto.java @@ -19,7 +19,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @Schema(title = "支付同步订单") -public class PaySyncOrderDto extends BaseDto { +public class PaySyncRecordDto extends BaseDto { /** 支付记录id */ @Schema(description = "支付记录id") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCallbackStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCallbackStrategy.java index c6247612..46ebf130 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCallbackStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCallbackStrategy.java @@ -3,12 +3,11 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.common.redis.RedisClient; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.core.callback.dao.CallbackNotifyManager; -import cn.bootx.platform.daxpay.core.callback.entity.CallbackNotify; +import cn.bootx.platform.daxpay.core.record.callback.dao.CallbackRecordManager; +import cn.bootx.platform.daxpay.core.record.callback.entity.CallbackRecord; import cn.bootx.platform.daxpay.core.payment.callback.result.PayCallbackResult; import cn.bootx.platform.daxpay.core.payment.callback.service.PayCallbackService; import cn.hutool.json.JSONUtil; -import com.alibaba.ttl.TransmittableThreadLocal; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,11 +24,9 @@ import java.util.Map; @RequiredArgsConstructor public abstract class AbsPayCallbackStrategy implements PayStrategy { - protected static final ThreadLocal> PARAMS = new TransmittableThreadLocal<>(); - private final RedisClient redisClient; - private final CallbackNotifyManager callbackNotifyManager; + private final CallbackRecordManager callbackRecordManager; private final PayCallbackService payCallbackService; @@ -47,15 +44,18 @@ public abstract class AbsPayCallbackStrategy implements PayStrategy { if (!this.duplicateChecker()) { return this.getReturnMsg(); } + // 分通道特殊处理, 如将解析的数据放到上下文中 + this.initContext(); + // 调用统一回调处理 - PayCallbackResult result = payCallbackService.callback(this.getPaymentId(), this.getTradeStatus(), params); + PayCallbackResult result = payCallbackService.callback(this.getPaymentId(), this.getTradeStatus()); // 记录回调记录 this.saveNotifyRecord(result); return this.getReturnMsg(); } /** - * 支付类型 + * 支付通道 * @see PayChannelEnum */ public abstract PayChannelEnum getPayChannel(); @@ -75,7 +75,12 @@ public abstract class AbsPayCallbackStrategy implements PayStrategy { public abstract boolean verifyNotify(); /** - * 获取paymentId + * 分通道特殊处理, 如将解析的数据放到上下文中 + */ + public abstract void initContext(); + + /** + * 获取支付单Id */ public abstract Long getPaymentId(); @@ -95,14 +100,14 @@ public abstract class AbsPayCallbackStrategy implements PayStrategy { */ public void saveNotifyRecord(PayCallbackResult result) { Map callbackParam = PaymentContextLocal.get().getCallbackParam(); - CallbackNotify payNotifyRecord = new CallbackNotify() + CallbackRecord payNotifyRecord = new CallbackRecord() .setNotifyInfo(JSONUtil.toJsonStr(callbackParam)) .setNotifyTime(LocalDateTime.now()) .setPaymentId(this.getPaymentId()) .setPayChannel(this.getPayChannel().getCode()) .setPayStatus(result.getStatus()) .setMsg(result.getMsg()); - callbackNotifyManager.save(payNotifyRecord); + callbackRecordManager.save(payNotifyRecord); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCloseStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCloseStrategy.java index d380ba2f..c3e7b8ca 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCloseStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayCloseStrategy.java @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRefundStrategy.java index 6d65769f..c592c89a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRefundStrategy.java @@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.param.pay.RefundChannelParam; import cn.bootx.platform.daxpay.param.pay.RefundParam; import lombok.Getter; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRepairStrategy.java index 85f74b5f..840db52a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayRepairStrategy.java @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.daxpay.code.PayRepairSourceEnum; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayStrategy.java index f37c289f..6e3be18d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPayStrategy.java @@ -2,14 +2,12 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.common.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.param.pay.PayWayParam; import lombok.Getter; import lombok.Setter; -import java.util.Map; - /** * 抽象支付策略基类 同步支付 异步支付 错误处理 关闭支付 撤销支付 支付网关同步 退款 * @@ -63,26 +61,11 @@ public abstract class AbsPayStrategy implements PayStrategy{ } /** - * 支付失败的处理方式 + * 支付失败的处理方式 TODO 后期考虑如何进行错误处理 */ public void doErrorHandler(ExceptionInfo exceptionInfo) { } - /** - * 异步支付成功的处理方式 - */ - @Deprecated - public void doAsyncSuccessHandler(Map map) { - } - - /** - * 异步支付失败的处理方式, 默认使用支付失败的处理方式 同步支付方式调用时同 this#doErrorHandler - */ - @Deprecated - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - this.doErrorHandler(exceptionInfo); - } - /** * 关闭支付. 支付交易返回失败或支付系统超时调通该接口关闭支付 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPaySyncStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPaySyncStrategy.java index d6bf7603..93953b72 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPaySyncStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/AbsPaySyncStrategy.java @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.func; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import cn.bootx.platform.daxpay.core.payment.sync.result.GatewaySyncResult; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/PayStrategyConsumer.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/PayStrategyConsumer.java index 22bdd7c0..1e04194e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/PayStrategyConsumer.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/func/PayStrategyConsumer.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.func; -import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.record.pay.entity.PayOrder; import java.util.List;