diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairWayEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairWayEnum.java index 6077925f..32bba29f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairWayEnum.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairWayEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 支付修复方式 + * 支付修复方式, 包含退款的修复方式, 退款修复方式是支付修复的子集 * @author xxm * @since 2023/12/28 */ @@ -12,11 +12,13 @@ import lombok.Getter; @AllArgsConstructor public enum PayRepairWayEnum { - SUCCESS("pay_success","支付成功"), + PAY_SUCCESS("pay_success","支付成功"), CLOSE_LOCAL("pay_close_local","关闭本地支付"), PROGRESS("pay_progress","切换到支付中"), /** 同时也会关闭本地支付 */ - CLOSE_GATEWAY("pay_close_gateway","关闭网关支付"); + CLOSE_GATEWAY("pay_close_gateway","关闭网关支付"), + REFUND_SUCCESS("refund_success","退款成功"), + REFUND_FAIL("refund_fail","退款失败");; private final String code; private final String name; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/RefundRepairWayEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/RefundRepairWayEnum.java index 2af41152..00854cd2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/RefundRepairWayEnum.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/RefundRepairWayEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 退款修复方式枚举 + * 退款修复方式枚举, 支付修复方式包含退款的修复方式, 退款修复方式是支付修复的子集 * @author xxm * @since 2024/1/26 */ @@ -12,8 +12,8 @@ import lombok.Getter; @AllArgsConstructor public enum RefundRepairWayEnum { - SUCCESS("refund_success","退款成功"), - FAIL("refund_fail","退款失败"); + REFUND_SUCCESS("refund_success","退款成功"), + REFUND_FAIL("refund_fail","退款失败"); private final String code; private final String name; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayCallbackService.java index 927bb0f6..31471915 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayCallbackService.java @@ -93,8 +93,10 @@ public class PayCallbackService { callbackInfo.setCallbackStatus(PayCallbackStatusEnum.EXCEPTION).setMsg("支付单不是待支付状态,记录回调记录"); return; } + // 设置支付成功时间 + PaymentContextLocal.get().getRepairInfo().setFinishTime(callbackInfo.getFinishTime()); // 执行支付完成修复逻辑 - PayRepairResult repair = payRepairService.repair(payOrder, PayRepairWayEnum.SUCCESS); + PayRepairResult repair = payRepairService.repair(payOrder, PayRepairWayEnum.PAY_SUCCESS); callbackInfo.setPayRepairNo(repair.getRepairNo()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayRefundCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayRefundCallbackService.java index 2aa3ce1b..a8c04049 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayRefundCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayRefundCallbackService.java @@ -56,14 +56,17 @@ public class PayRefundCallbackService { // 退款单已经被处理, 记录回调记录 if (!Objects.equals(RefundStatusEnum.PROGRESS.getCode(), refundOrder.getStatus())) { callbackInfo.setCallbackStatus(PayCallbackStatusEnum.IGNORE).setMsg("退款单状态已处理,记录回调记录"); + return; } // 退款成功还是失败 if (Objects.equals(RefundStatusEnum.SUCCESS.getCode(), callbackInfo.getGatewayStatus())) { - RefundRepairResult repair = reflectionService.repair(refundOrder, RefundRepairWayEnum.SUCCESS); + PaymentContextLocal.get().getRepairInfo().setFinishTime(callbackInfo.getFinishTime()); + RefundRepairResult repair = reflectionService.repair(refundOrder, RefundRepairWayEnum.REFUND_SUCCESS); callbackInfo.setPayRepairNo(repair.getRepairNo()); } else { - RefundRepairResult repair = reflectionService.repair(refundOrder, RefundRepairWayEnum.FAIL); + // 设置退款订单完成时间 + RefundRepairResult repair = reflectionService.repair(refundOrder, RefundRepairWayEnum.REFUND_FAIL); callbackInfo.setPayRepairNo(repair.getRepairNo()); } @@ -71,5 +74,4 @@ public class PayRefundCallbackService { lockTemplate.releaseLock(lock); } } - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java index 2776d3df..27938f69 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java @@ -2,6 +2,7 @@ package cn.bootx.platform.daxpay.service.core.payment.repair.service; import cn.bootx.platform.common.core.function.CollectorsFunction; import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.PaymentTypeEnum; import cn.bootx.platform.daxpay.service.code.PayRepairWayEnum; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; @@ -67,7 +68,7 @@ public class PayRepairService { // 3. 根据不同的类型执行对应的修复逻辑 PayRepairResult repairResult = new PayRepairResult().setBeforeStatus(PayStatusEnum.findByCode(order.getStatus())); switch (repairType) { - case SUCCESS: + case PAY_SUCCESS: this.success(order, repairStrategies); repairResult.setAfterPayStatus(PayStatusEnum.SUCCESS); break; @@ -85,6 +86,7 @@ public class PayRepairService { break; default: log.error("走到了理论上讲不会走到的分支"); + throw new PayFailureException("走到了理论上讲不会走到的分支"); } // 设置修复iD repairResult.setRepairNo(IdUtil.getSnowflakeNextIdStr()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java index a41c323a..8f579782 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/RefundRepairService.java @@ -82,9 +82,9 @@ public class RefundRepairService { // 根据不同的类型执行对应的修复逻辑 RefundRepairResult repairResult = new RefundRepairResult(); - if (Objects.requireNonNull(repairType) == RefundRepairWayEnum.SUCCESS) { + if (Objects.requireNonNull(repairType) == RefundRepairWayEnum.REFUND_SUCCESS) { repairResult = this.success(refundOrder,payOrder,repairStrategies); - } else if (repairType == RefundRepairWayEnum.FAIL) { + } else if (repairType == RefundRepairWayEnum.REFUND_FAIL) { repairResult = this.close(refundOrder,payOrder,repairStrategies); } else { log.error("走到了理论上讲不会走到的分支"); @@ -92,7 +92,9 @@ public class RefundRepairService { // 设置修复ID并保存修复记录 repairResult.setRepairNo(IdUtil.getSnowflakeNextIdStr()); + // 支付修复记录 PayRepairRecord payRepairRecord = this.payRepairRecord(payOrder, repairType, repairResult); + // 退款修复记录 PayRepairRecord refundRepairRecord = this.refundRepairRecord(refundOrder, repairType, repairResult); recordService.saveAllRecord(Arrays.asList(payRepairRecord, refundRepairRecord)); @@ -105,7 +107,7 @@ public class RefundRepairService { private RefundRepairResult success(PayRefundOrder refundOrder, PayOrder payOrder, List repairStrategies) { RepairLocal repairInfo = PaymentContextLocal.get().getRepairInfo(); // 订单相关状态 - PayStatusEnum beforePayStatus = PayStatusEnum.findByCode(refundOrder.getStatus()); + PayStatusEnum beforePayStatus = PayStatusEnum.findByCode(payOrder.getStatus()); PayStatusEnum afterPayRefundStatus; RefundStatusEnum beforeRefundStatus = RefundStatusEnum.findByCode(refundOrder.getStatus()); @@ -198,10 +200,11 @@ public class RefundRepairService { * 支付订单的修复记录 * 支付完成 -> 退款 * 退款 -> 全部退款 + * @param repairType 支付订单修复方式状态编码跟退款修复的状态一致, */ private PayRepairRecord payRepairRecord(PayOrder order, RefundRepairWayEnum repairType, RefundRepairResult repairResult){ - // 修复后的状态 - String afterStatus = Optional.ofNullable(repairResult.getBeforePayStatus()).map(PayStatusEnum::getCode).orElse(null); + // 修复前的状态 + String beforeStatus = Optional.ofNullable(repairResult.getBeforePayStatus()).map(PayStatusEnum::getCode).orElse(null); // 修复发起来源 String source = PaymentContextLocal.get() .getRepairInfo() @@ -214,8 +217,8 @@ public class RefundRepairService { .setRepairWay(repairType.getCode()) .setAsyncChannel(order.getAsyncChannel()) .setOrderNo(order.getBusinessNo()) - .setBeforeStatus(repairResult.getAfterPayStatus().getCode()) - .setAfterStatus(afterStatus); + .setBeforeStatus(beforeStatus) + .setAfterStatus(repairResult.getAfterPayStatus().getCode()); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PayRefundSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PayRefundSyncService.java index d451b622..a6af9f67 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PayRefundSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PayRefundSyncService.java @@ -172,14 +172,14 @@ public class PayRefundSyncService { switch (syncStatusEnum) { // 调用出错 case SUCCESS: - repair = repairService.repair(order, RefundRepairWayEnum.SUCCESS); + repair = repairService.repair(order, RefundRepairWayEnum.REFUND_SUCCESS); break; case PROGRESS: // 不进行处理 log.warn("退款状态同步接口调用出错"); break; case FAIL: { - repair = repairService.repair(order, RefundRepairWayEnum.FAIL); + repair = repairService.repair(order, RefundRepairWayEnum.REFUND_FAIL); break; } default: { diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java index 0ea788be..7b9524f5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java @@ -131,7 +131,6 @@ public class PaySyncService { // 同步失败, 返回失败响应, 同时记录失败的日志 syncResult.setSyncStatus(PaySyncStatusEnum.FAIL); this.saveRecord(payOrder, syncResult, false, null, e.getMessage()); -// return new SyncResult().setErrorMsg(e.getMessage()); throw e; } @@ -199,7 +198,7 @@ public class PaySyncService { switch (syncStatusEnum) { // 支付成功 支付宝退款时也是支付成功状态, 除非支付完成 case SUCCESS: { - repair = repairService.repair(payOrder, PayRepairWayEnum.SUCCESS); + repair = repairService.repair(payOrder, PayRepairWayEnum.PAY_SUCCESS); break; } // 待支付, 将订单状态重新设置为待支付 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java index d5808653..17f7cdab 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/timeout/task/PayExpiredTimeTask.java @@ -37,7 +37,7 @@ public class PayExpiredTimeTask { */ @Scheduled(cron = "*/5 * * * * ?") public void task(){ - log.debug("执行超时取消任务...."); +// log.debug("执行超时取消任务...."); Set expiredKeys = repository.getExpiredKeys(LocalDateTime.now()); for (String expiredKey : expiredKeys) { LockInfo lock = lockTemplate.lock("payment:expired:" + expiredKey,10000,0); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/pay/PayChannelOrderDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/pay/PayChannelOrderDto.java index 4d26b807..b5c4f88b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/pay/PayChannelOrderDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/pay/PayChannelOrderDto.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 支付订单关联通道信息 * @author xxm @@ -36,6 +38,11 @@ public class PayChannelOrderDto extends BaseDto { @Schema(description = "关联网关支付号") private String gatewayOrderNo; + @Schema(description = "金额") + private Integer amount; + + @Schema(description = "可退款金额") + private Integer refundableBalance; /** * 支付状态 * @see PayStatusEnum @@ -43,9 +50,6 @@ public class PayChannelOrderDto extends BaseDto { @Schema(description = "支付状态") private String status; - @Schema(description = "金额") - private Integer amount; - - @Schema(description = "可退款金额") - private Integer refundableBalance; + @Schema(description = "支付时间") + private LocalDateTime payTime; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsCallbackStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsCallbackStrategy.java index 807bf233..2cc266c6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsCallbackStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsCallbackStrategy.java @@ -54,7 +54,6 @@ public abstract class AbsCallbackStrategy implements PayStrategy { // 提前设置订单修复的来源 PaymentContextLocal.get().getRepairInfo().setSource(PayRepairSourceEnum.CALLBACK); - if (callbackType == PaymentTypeEnum.PAY){ // 解析支付数据并放处理 this.resolvePayData();