From dd1d70dcfb9c2ddec100f256bd2dea743023a435 Mon Sep 17 00:00:00 2001 From: bootx Date: Thu, 1 Feb 2024 22:18:05 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E4=B8=80=E4=BA=9B=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E6=9B=B4=E6=94=B9,=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 7 +++-- .../daxpay/code/PayRefundSyncStatusEnum.java | 6 ++-- .../daxpay/code/PaySyncStatusEnum.java | 16 +++++------ .../service/code/PayRepairSourceEnum.java | 3 +- .../daxpay/service/code/PayRepairWayEnum.java | 8 +++--- .../service/code/RefundRepairWayEnum.java | 4 +-- .../alipay/service/AliPaySyncService.java | 22 ++++++--------- .../wechat/service/WeChatPayService.java | 4 +-- .../wechat/service/WeChatPaySyncService.java | 8 +++--- .../core/payment/pay/service/PayService.java | 2 +- .../payment/pay/strategy/AliPayStrategy.java | 1 + .../pay/strategy/WeChatPayStrategy.java | 1 + .../repair/service/PayRepairService.java | 2 +- .../sync/result/RefundGatewaySyncResult.java | 4 +-- .../sync/service/PayRefundSyncService.java | 6 ++-- .../payment/sync/service/PaySyncService.java | 12 ++++---- .../core/timeout/task/PayExpiredTimeTask.java | 4 +++ .../param/record/PayCallbackRecordQuery.java | 7 +++-- .../param/record/PayRepairRecordQuery.java | 28 +++++++++++++------ .../param/record/PaySyncRecordQuery.java | 17 +++++++++-- 20 files changed, 94 insertions(+), 68 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 0cdd0e65..b953e13e 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -97,10 +97,11 @@ - 2024-01-31: - [x] 微信退款同步策略 - [x] 支付和退款同步时, 填充完成时间和网关订单号 - - [ ] 调整订单页面查询条件 - - [ ] 支付切换异步方式时, 订单未更换 - 2024-02-01: - - [ ] + - [x] 支付切换异步方式时, 订单未更换 + - [ ] 支付同步时, 支付宝未支付订单无法自动关闭 + - [ ] 调整订单页面查询条件 + - - 2.0.1 版本内容 - [ ] 退款操作支持重试 diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayRefundSyncStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayRefundSyncStatusEnum.java index a9ac042b..9d6dcb3a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayRefundSyncStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayRefundSyncStatusEnum.java @@ -11,9 +11,9 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum PayRefundSyncStatusEnum { - SUCCESS("success","成功"), - FAIL("fail","失败"), - REFUNDING("refunding","退款中"); + SUCCESS("refund_success","退款成功"), + FAIL("refund_fail","退款失败"), + PROGRESS("refund_progress","退款中"); /** 编码 */ private final String code; diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java index 1ae4751c..ac325d7e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java @@ -16,20 +16,20 @@ import java.util.Objects; @Getter @AllArgsConstructor public enum PaySyncStatusEnum { - FAIL("fail", "查询失败"), - PAY_SUCCESS("pay_success", "支付成功"), - PAY_WAIT("pay_wait", "待支付"), - CLOSED("closed", "已关闭"), - REFUND("refund", "退款"), - NOT_FOUND("not_found", "交易不存在"), + FAIL("pay_fail", "支付查询失败"), + SUCCESS("pay_success", "支付成功"), + PROGRESS("pay_progress", "支付中"), + CLOSED("pay_closed", "支付已关闭"), + REFUND("pay_refund", "支付退款"), + NOT_FOUND("pay_not_found", "交易不存在"), /** * 未查询到订单(具体类型未知) * 区别于上面的未查询到订单,有些支付方式如支付宝,发起支付后并不能查询到订单,需要用户进行操作后才能查询到订单, * 所以查询为了区分,增加一个未知的状态, 用于处理这种特殊情况, 然后根据业务需要,关闭订单或者进行其他操作 */ - NOT_FOUND_UNKNOWN("not_found_unknown","交易不存在(特殊)"), + NOT_FOUND_UNKNOWN("pay_not_found_unknown","交易不存在(特殊)"), /** 不属于网关同步过来的状态, 需要手动设置, 处理本地订单到了超时时间, 但是网关和本地都未关闭, 需要触发关闭相关处理 */ - TIMEOUT("timeout", "超时未关闭"); + TIMEOUT("pay_timeout", "支付超时"); /** 编码 */ private final String code; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairSourceEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairSourceEnum.java index ce290599..886e408b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairSourceEnum.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairSourceEnum.java @@ -14,7 +14,8 @@ public enum PayRepairSourceEnum{ SYNC("sync","同步"), CALLBACK("callback","回调"), - RECONCILE("reconcile","对账"),; + TASK("task","定时任务"), + RECONCILE("reconcile","对账"); 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/PayRepairWayEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/PayRepairWayEnum.java index 6cf50d7d..6077925f 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 @@ -12,11 +12,11 @@ import lombok.Getter; @AllArgsConstructor public enum PayRepairWayEnum { - SUCCESS("success","支付成功"), - CLOSE_LOCAL("close_local","关闭本地支付"), - WAIT_PAY("wait_pay","待支付"), + SUCCESS("pay_success","支付成功"), + CLOSE_LOCAL("pay_close_local","关闭本地支付"), + PROGRESS("pay_progress","切换到支付中"), /** 同时也会关闭本地支付 */ - CLOSE_GATEWAY("close_gateway","关闭网关支付"); + CLOSE_GATEWAY("pay_close_gateway","关闭网关支付"); 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 a735f2bd..2af41152 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 @@ -12,8 +12,8 @@ import lombok.Getter; @AllArgsConstructor public enum RefundRepairWayEnum { - SUCCESS("success","退款成功"), - FAIL("fail","退款失败"); + SUCCESS("refund_success","退款成功"), + 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/channel/alipay/service/AliPaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPaySyncService.java index 4d772546..04fbf114 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPaySyncService.java @@ -4,8 +4,6 @@ import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.daxpay.code.PayRefundSyncStatusEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; import cn.bootx.platform.daxpay.service.code.AliPayCode; -import cn.bootx.platform.daxpay.service.common.context.PaySyncLocal; -import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; import cn.bootx.platform.daxpay.service.core.payment.sync.result.PayGatewaySyncResult; @@ -46,34 +44,25 @@ public class AliPaySyncService { * 5 查询失败 */ public PayGatewaySyncResult syncPayStatus(PayOrder payOrder) { - PaySyncLocal paySyncLocal = PaymentContextLocal.get().getPaySyncInfo(); PayGatewaySyncResult syncResult = new PayGatewaySyncResult().setSyncStatus(PaySyncStatusEnum.FAIL); // 查询 try { AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel(); queryModel.setOutTradeNo(String.valueOf(payOrder.getId())); -// queryModel.setQueryOptions(Collections.singletonList("trade_settle_info")); AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(queryModel); String tradeStatus = response.getTradeStatus(); syncResult.setSyncInfo(JSONUtil.toJsonStr(response)); - // 失败 - if (!Objects.equals(AliPayCode.SUCCESS, response.getCode())) { - syncResult.setSyncStatus(PaySyncStatusEnum.FAIL); - syncResult.setErrorCode(response.getSubCode()); - syncResult.setErrorMsg(response.getSubMsg()); - return syncResult; - } // 设置网关订单号 syncResult.setGatewayOrderNo(response.getTradeNo()); // 支付完成 TODO 部分退款也在这个地方, 但无法进行区分, 需要借助对账进行处理 if (Objects.equals(tradeStatus, AliPayCode.NOTIFY_TRADE_SUCCESS) || Objects.equals(tradeStatus, AliPayCode.NOTIFY_TRADE_FINISHED)) { // 支付完成时间 LocalDateTime payTime = LocalDateTimeUtil.of(response.getSendPayDate()); - return syncResult.setSyncStatus(PaySyncStatusEnum.PAY_SUCCESS).setPayTime(payTime); + return syncResult.setSyncStatus(PaySyncStatusEnum.SUCCESS).setPayTime(payTime); } // 待支付 if (Objects.equals(tradeStatus, AliPayCode.NOTIFY_WAIT_BUYER_PAY)) { - return syncResult.setSyncStatus(PaySyncStatusEnum.PAY_WAIT); + return syncResult.setSyncStatus(PaySyncStatusEnum.PROGRESS); } // 已关闭或支付完成后全额退款 if (Objects.equals(tradeStatus, AliPayCode.NOTIFY_TRADE_CLOSED)) { @@ -88,6 +77,13 @@ public class AliPaySyncService { if (Objects.equals(response.getSubCode(), AliPayCode.ACQ_TRADE_NOT_EXIST)) { return syncResult.setSyncStatus(PaySyncStatusEnum.NOT_FOUND_UNKNOWN); } + // 查询失败 + if (!Objects.equals(AliPayCode.SUCCESS, response.getCode())) { + syncResult.setSyncStatus(PaySyncStatusEnum.FAIL); + syncResult.setErrorCode(response.getSubCode()); + syncResult.setErrorMsg(response.getSubMsg()); + return syncResult; + } } catch (AlipayApiException e) { log.error("支付订单同步失败:", e); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayService.java index bd0e149c..56c2cf1b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayService.java @@ -39,7 +39,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import static cn.bootx.platform.daxpay.code.PaySyncStatusEnum.PAY_WAIT; +import static cn.bootx.platform.daxpay.code.PaySyncStatusEnum.PROGRESS; import static com.ijpay.wxpay.model.UnifiedOrderModel.UnifiedOrderModelBuilder; import static com.ijpay.wxpay.model.UnifiedOrderModel.builder; @@ -270,7 +270,7 @@ public class WeChatPayService { public void rotationSync(PayOrder payOrder) { SyncResult syncResult = paySyncService.syncPayOrder(payOrder); // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 - if (Objects.equals(PAY_WAIT.getCode(), syncResult.getGatewayStatus())) { + if (Objects.equals(PROGRESS.getCode(), syncResult.getGatewayStatus())) { throw new RetryableException(); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java index 047ee133..48859750 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java @@ -73,12 +73,12 @@ public class WeChatPaySyncService { if (Objects.equals(tradeStatus, WeChatPayCode.PAY_SUCCESS) || Objects.equals(tradeStatus, WeChatPayCode.PAY_ACCEPT)) { String timeEnd = result.get(WeChatPayCode.TIME_END); LocalDateTime time = LocalDateTimeUtil.parse(timeEnd, DatePattern.PURE_DATETIME_PATTERN); - return syncResult.setPayTime(time).setSyncStatus(PaySyncStatusEnum.PAY_SUCCESS); + return syncResult.setPayTime(time).setSyncStatus(PaySyncStatusEnum.SUCCESS); } // 待支付 if (Objects.equals(tradeStatus, WeChatPayCode.PAY_NOTPAY) || Objects.equals(tradeStatus, WeChatPayCode.PAY_USERPAYING)) { - return syncResult.setSyncStatus(PaySyncStatusEnum.PAY_WAIT); + return syncResult.setSyncStatus(PaySyncStatusEnum.PROGRESS); } // 已退款/退款中 @@ -130,12 +130,12 @@ public class WeChatPaySyncService { } // 退款中 if (Objects.equals(tradeStatus, WeChatPayCode.REFUND_PROCESSING)) { - return syncResult.setSyncStatus(PayRefundSyncStatusEnum.REFUNDING); + return syncResult.setSyncStatus(PayRefundSyncStatusEnum.PROGRESS); } return syncResult.setSyncStatus(PayRefundSyncStatusEnum.FAIL); } catch (Exception e) { log.error("查询退款订单失败:", e); - syncResult.setSyncStatus(PayRefundSyncStatusEnum.REFUNDING).setErrorMsg(e.getMessage()); + syncResult.setSyncStatus(PayRefundSyncStatusEnum.PROGRESS).setErrorMsg(e.getMessage()); } return syncResult; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayService.java index 1866c6ef..93d356a9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayService.java @@ -213,7 +213,7 @@ public class PayService { payStrategyList.forEach(AbsPayStrategy::doSuccessHandler); // 6. 更新支付订单和扩展参数 -// payOrderService.updateById(payOrder); + payOrderService.updateById(payOrder); payAssistService.updatePayOrderExtra(payParam,payOrder.getId()); // 7. 组装返回参数 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/AliPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/AliPayStrategy.java index 7a42ef95..707cf1d3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/AliPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/AliPayStrategy.java @@ -87,6 +87,7 @@ public class AliPayStrategy extends AbsPayStrategy { @Override public void doSuccessHandler() { channelOrderService.switchAsyncPayChannel(this.getOrder(), this.getPayChannelParam()); + this.getOrder().setAsyncChannel(this.getChannel().getCode()); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/WeChatPayStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/WeChatPayStrategy.java index 5be68366..0f7c17e5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/WeChatPayStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/strategy/WeChatPayStrategy.java @@ -92,6 +92,7 @@ public class WeChatPayStrategy extends AbsPayStrategy { @Override public void doSuccessHandler() { channelOrderService.switchAsyncPayChannel(this.getOrder(), this.getPayChannelParam()); + this.getOrder().setAsyncChannel(this.getChannel().getCode()); } /** 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 5a1ee12f..2776d3df 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 @@ -75,7 +75,7 @@ public class PayRepairService { this.closeLocal(order, repairStrategies); repairResult.setAfterPayStatus(PayStatusEnum.CLOSE); break; - case WAIT_PAY: + case PROGRESS: this.waitPay(order, repairStrategies); repairResult.setAfterPayStatus(PayStatusEnum.PROGRESS); break; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/result/RefundGatewaySyncResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/result/RefundGatewaySyncResult.java index fd546bb4..e8ac4856 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/result/RefundGatewaySyncResult.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/result/RefundGatewaySyncResult.java @@ -6,7 +6,7 @@ import lombok.experimental.Accessors; import java.time.LocalDateTime; -import static cn.bootx.platform.daxpay.code.PayRefundSyncStatusEnum.REFUNDING; +import static cn.bootx.platform.daxpay.code.PayRefundSyncStatusEnum.PROGRESS; /** * 支付退款同步结果 @@ -21,7 +21,7 @@ public class RefundGatewaySyncResult { * 支付网关订单状态, 默认为退款中 * @see PayRefundSyncStatusEnum */ - private PayRefundSyncStatusEnum syncStatus = REFUNDING; + private PayRefundSyncStatusEnum syncStatus = PROGRESS; /** 同步时网关返回的对象, 序列化为json字符串 */ private String syncInfo; 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 d0ea87e4..340bc0da 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 @@ -98,7 +98,7 @@ public class PayRefundSyncService { return new SyncResult().setErrorMsg(syncResult.getErrorMsg()); } // 支付订单的网关订单号是否一致, 不一致进行更新 - if (!Objects.equals(syncResult.getGatewayOrderNo(), refundOrder.getGatewayOrderNo())){ + if (Objects.nonNull(syncResult.getGatewayOrderNo()) && !Objects.equals(syncResult.getGatewayOrderNo(), refundOrder.getGatewayOrderNo())){ refundOrder.setGatewayOrderNo(syncResult.getGatewayOrderNo()); refundOrderManager.updateById(refundOrder); } @@ -155,7 +155,7 @@ public class PayRefundSyncService { return true; } // 退款中 - if (Objects.equals(syncStatus, PayRefundSyncStatusEnum.REFUNDING)&& + if (Objects.equals(syncStatus, PayRefundSyncStatusEnum.PROGRESS)&& Objects.equals(orderStatus, PayRefundStatusEnum.PROGRESS.getCode())) { return true; } @@ -174,7 +174,7 @@ public class PayRefundSyncService { case SUCCESS: repair = repairService.repair(order, RefundRepairWayEnum.SUCCESS); break; - case REFUNDING: + case PROGRESS: // 不进行处理 TODO 添加重试 log.warn("退款状态同步接口调用出错"); break; 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 b6385857..4bb9b23a 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 @@ -106,7 +106,7 @@ public class PaySyncService { return new SyncResult().setErrorMsg(syncResult.getErrorMsg()); } // 支付订单的网关订单号是否一致, 不一致进行更新 - if (!Objects.equals(syncResult.getGatewayOrderNo(), payOrder.getGatewayOrderNo())){ + if (Objects.nonNull(syncResult.getGatewayOrderNo()) && !Objects.equals(syncResult.getGatewayOrderNo(), payOrder.getGatewayOrderNo())){ payOrder.setGatewayOrderNo(syncResult.getGatewayOrderNo()); payOrderService.updateById(payOrder); } @@ -151,7 +151,7 @@ public class PaySyncService { PaySyncStatusEnum syncStatus = syncResult.getSyncStatus(); String orderStatus = order.getStatus(); // 本地支付成功/网关支付成功 - if (orderStatus.equals(PayStatusEnum.SUCCESS.getCode()) && syncStatus.equals(PAY_SUCCESS)){ + if (orderStatus.equals(PayStatusEnum.SUCCESS.getCode()) && syncStatus.equals(SUCCESS)){ return true; } @@ -159,7 +159,7 @@ public class PaySyncService { 本地支付中/网关支付中或者订单未找到(未知) 支付宝特殊情况,未找到订单可能是发起支付用户未操作、支付已关闭、交易未找到三种情况 所以需要根据本地订单不同的状态进行特殊处理 */ - List syncWaitEnums = Arrays.asList(PAY_WAIT, NOT_FOUND_UNKNOWN); + List syncWaitEnums = Arrays.asList(PROGRESS, NOT_FOUND_UNKNOWN); if (orderStatus.equals(PayStatusEnum.PROGRESS.getCode()) && syncWaitEnums.contains(syncStatus)){ // 判断支付单是否支付超时, 如果待支付状态下触发超时 if (LocalDateTimeUtil.le(order.getExpiredTime(), LocalDateTime.now())){ @@ -196,13 +196,13 @@ public class PaySyncService { // 对支付网关同步的结果进行处理 switch (syncStatusEnum) { // 支付成功 支付宝退款时也是支付成功状态, 除非支付完成 - case PAY_SUCCESS: { + case SUCCESS: { repair = repairService.repair(payOrder, PayRepairWayEnum.SUCCESS); break; } // 待支付, 将订单状态重新设置为待支付 - case PAY_WAIT: { - repair = repairService.repair(payOrder, PayRepairWayEnum.WAIT_PAY); + case PROGRESS: { + repair = repairService.repair(payOrder, PayRepairWayEnum.PROGRESS); break; } case REFUND: 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 5b62ffb3..26b6489d 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 @@ -1,6 +1,8 @@ package cn.bootx.platform.daxpay.service.core.timeout.task; import cn.bootx.platform.daxpay.param.pay.PaySyncParam; +import cn.bootx.platform.daxpay.service.code.PayRepairSourceEnum; +import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.payment.sync.service.PaySyncService; import cn.bootx.platform.daxpay.service.core.timeout.dao.PayExpiredTimeRepository; import com.baomidou.lock.LockInfo; @@ -44,6 +46,8 @@ public class PayExpiredTimeTask { continue; } try { + // 设置补偿来源为定时任务 + PaymentContextLocal.get().getRepairInfo().setSource(PayRepairSourceEnum.TASK); // 执行同步操作, 网关同步时会对支付的进行状态的处理 Long paymentId = Long.parseLong(expiredKey); PaySyncParam paySyncParam = new PaySyncParam(); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayCallbackRecordQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayCallbackRecordQuery.java index c4311d2b..e97c5dff 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayCallbackRecordQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayCallbackRecordQuery.java @@ -21,9 +21,9 @@ import lombok.experimental.Accessors; @Schema(title = "支付回调信息记录") public class PayCallbackRecordQuery extends QueryOrder { - /** 支付记录id */ - @Schema(description = "支付记录id") - private Long paymentId; + /** 本地订单ID */ + @Schema(description = "本地订单ID") + private Long orderId; /** * 支付通道 @@ -36,6 +36,7 @@ public class PayCallbackRecordQuery extends QueryOrder { /** * 回调处理状态 * @see PayCallbackStatusEnum + * @see RefundCallbackStatusEnum */ @Schema(description = "回调处理状态") private String status; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayRepairRecordQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayRepairRecordQuery.java index 1ca30b97..00c4475c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayRepairRecordQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PayRepairRecordQuery.java @@ -4,6 +4,7 @@ import cn.bootx.platform.common.core.annotation.QueryParam; import cn.bootx.platform.daxpay.code.PayStatusEnum; import cn.bootx.platform.daxpay.service.code.PayRepairSourceEnum; import cn.bootx.platform.daxpay.service.code.PayRepairWayEnum; +import cn.bootx.platform.daxpay.service.code.PaymentTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -19,14 +20,23 @@ import lombok.experimental.Accessors; @Schema(title = "支付修复记录查询参数") public class PayRepairRecordQuery { - /** 支付ID */ - @Schema(description = "支付ID") - private Long paymentId; + /** 本地订单ID */ + @Schema(description = "本地订单ID") + private Long orderId; - /** 业务号 */ - @Schema(description = "业务号") - private String businessNo; + /** 本地订单号 */ + @Schema(description = "本地订单号") + private String orderNo; + @Schema(description = "修复单号") + private String repairNo; + + /** + * 修复类型 + * @see PaymentTypeEnum + */ + @Schema(description = "修复类型") + private String repairType; /** * 修复来源 * @see PayRepairSourceEnum @@ -35,11 +45,11 @@ public class PayRepairRecordQuery { private String repairSource; /** - * 修复类型 + * 修复方式 * @see PayRepairWayEnum */ - @Schema(description = "修复类型") - private String repairType; + @Schema(description = "修复方式") + private String repairWay; /** 修复的异步通道 */ @Schema(description = "修复的异步通道") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PaySyncRecordQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PaySyncRecordQuery.java index 5cc904ce..4515bc14 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PaySyncRecordQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/record/PaySyncRecordQuery.java @@ -19,9 +19,20 @@ import lombok.experimental.Accessors; @Schema(title = "支付同步记录查询参数") public class PaySyncRecordQuery { - /** 支付记录id */ - @Schema(description = "支付记录id") - private Long paymentId; + /** 本地订单id */ + @Schema(description = "本地订单id") + private Long orderId; + + @Schema(description = "本地订单号") + private String orderNo; + + /** 网关订单号 */ + @Schema(description = "网关订单号") + private String gatewayOrderNo; + + /** 同步类型 */ + @Schema(description = "同步类型") + private String syncType; /** * 支付通道