diff --git a/README.md b/README.md index a143c006a..4eb986b89 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Dax-Pay(开源支付系统) +# Dromara Dax-Pay(开源支付系统)

star @@ -36,7 +36,7 @@ | 项目 | GITEE | GITHUB | |---------|---------------------------------------------|-------------------------------------------------| -| 后端地址 | [GITEE](https://gitee.com/bootx/dax-pay) | [GITHUB](https://github.com/xxm1995/dax-pay) | +| 后端地址 | [GITEE](https://gitee.com/dromara/dax-pay) | [GITHUB](https://github.com/dromara/dax-pay) | | Web前端地址 | [GITEE](https://gitee.com/bootx/dax-pay-ui) | [GITHUB](https://github.com/xxm1995/dax-pay-ui) | | H5前端地址 | [GITEE](https://gitee.com/bootx/dax-pay-h5) | [GITHUB](https://github.com/xxm1995/dax-pay-h5) | diff --git a/daxpay-single-sdk/src/main/java/cn/bootx/platform/daxpay/sdk/net/DaxPayRequest.java b/daxpay-single-sdk/src/main/java/cn/bootx/platform/daxpay/sdk/net/DaxPayRequest.java index 505f910e1..74e169840 100644 --- a/daxpay-single-sdk/src/main/java/cn/bootx/platform/daxpay/sdk/net/DaxPayRequest.java +++ b/daxpay-single-sdk/src/main/java/cn/bootx/platform/daxpay/sdk/net/DaxPayRequest.java @@ -21,9 +21,6 @@ public abstract class DaxPayRequest { /** 签名 */ private String sign; - /** API版本号 */ - private String version = "1.0"; - /** 请求时间,传输时间戳 */ private Long reqTime = DateUtil.currentSeconds(); diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayRefundOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/RefundOrderController.java similarity index 82% rename from daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayRefundOrderController.java rename to daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/RefundOrderController.java index b82e2d160..994c49b96 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayRefundOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/RefundOrderController.java @@ -8,13 +8,13 @@ import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.daxpay.param.pay.RefundParam; import cn.bootx.platform.daxpay.param.pay.RefundSyncParam; import cn.bootx.platform.daxpay.result.pay.SyncResult; -import cn.bootx.platform.daxpay.service.core.order.refund.service.PayRefundOrderQueryService; -import cn.bootx.platform.daxpay.service.core.payment.refund.service.PayRefundService; -import cn.bootx.platform.daxpay.service.core.payment.sync.service.PayRefundSyncService; -import cn.bootx.platform.daxpay.service.dto.order.refund.PayRefundOrderDto; +import cn.bootx.platform.daxpay.service.core.order.refund.service.RefundOrderQueryService; +import cn.bootx.platform.daxpay.service.core.payment.refund.service.RefundService; +import cn.bootx.platform.daxpay.service.core.payment.sync.service.RefundSyncService; +import cn.bootx.platform.daxpay.service.dto.order.refund.RefundOrderDto; import cn.bootx.platform.daxpay.service.dto.order.refund.RefundChannelOrderDto; import cn.bootx.platform.daxpay.service.param.order.PayOrderRefundParam; -import cn.bootx.platform.daxpay.service.param.order.PayRefundOrderQuery; +import cn.bootx.platform.daxpay.service.param.order.RefundOrderQuery; import cn.hutool.extra.servlet.ServletUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,21 +34,21 @@ import java.util.Optional; @RestController @RequestMapping("/order/refund") @RequiredArgsConstructor -public class PayRefundOrderController { - private final PayRefundOrderQueryService payRefundQueryService; - private final PayRefundService payRefundService; - private final PayRefundSyncService refundSyncService; +public class RefundOrderController { + private final RefundOrderQueryService payRefundQueryService; + private final RefundService refundService; + private final RefundSyncService refundSyncService; @Operation(summary = "分页查询") @GetMapping("/page") - public ResResult> page(PageParam pageParam, PayRefundOrderQuery query){ + public ResResult> page(PageParam pageParam, RefundOrderQuery query){ return Res.ok(payRefundQueryService.page(pageParam, query)); } @Operation(summary = "查询单条") @GetMapping("/findById") - public ResResult findById(Long id){ + public ResResult findById(Long id){ return Res.ok(payRefundQueryService.findById(id)); } @@ -77,7 +77,7 @@ public class PayRefundOrderController { refundParam.setRefundChannels(param.getRefundChannels()); refundParam.setReqTime(LocalDateTime.now()); refundParam.setClientIp(ip); - payRefundService.refund(refundParam); + refundService.refund(refundParam); return Res.ok(); } diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/PaymentCommonParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/PaymentCommonParam.java index 9848703f3..baec8136a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/PaymentCommonParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/param/PaymentCommonParam.java @@ -26,10 +26,6 @@ public abstract class PaymentCommonParam { @Schema(description = "签名") private String sign; - /** API版本号 */ - @Schema(description = "API版本号") -// @NotBlank(message = "API版本号必填") - private String version = "1.0.0"; /** 请求时间,时间戳转时间 */ @Schema(description = "请求时间,传输时间戳") diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniPayController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniPayController.java index 52f1c0c3c..0cc0701f5 100644 --- a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniPayController.java +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniPayController.java @@ -10,8 +10,8 @@ import cn.bootx.platform.daxpay.result.pay.SyncResult; import cn.bootx.platform.daxpay.service.annotation.PaymentApi; import cn.bootx.platform.daxpay.service.core.payment.close.service.PayCloseService; import cn.bootx.platform.daxpay.service.core.payment.pay.service.PayService; -import cn.bootx.platform.daxpay.service.core.payment.refund.service.PayRefundService; -import cn.bootx.platform.daxpay.service.core.payment.sync.service.PayRefundSyncService; +import cn.bootx.platform.daxpay.service.core.payment.refund.service.RefundService; +import cn.bootx.platform.daxpay.service.core.payment.sync.service.RefundSyncService; import cn.bootx.platform.daxpay.service.core.payment.sync.service.PaySyncService; import cn.bootx.platform.daxpay.util.DaxRes; import io.swagger.v3.oas.annotations.Operation; @@ -34,10 +34,10 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class UniPayController { private final PayService payService; - private final PayRefundService payRefundService; + private final RefundService refundService; private final PaySyncService paySyncService; private final PayCloseService payCloseService; - private final PayRefundSyncService payRefundSyncService; + private final RefundSyncService refundSyncService; @CountTime @@ -70,7 +70,7 @@ public class UniPayController { @Operation(summary = "统一退款接口") @PostMapping("/refund") public DaxResult refund(@RequestBody RefundParam param){ - return DaxRes.ok(payRefundService.refund(param)); + return DaxRes.ok(refundService.refund(param)); } @CountTime @@ -78,7 +78,7 @@ public class UniPayController { @Operation(summary = "简单退款接口") @PostMapping("/simpleRefund") public DaxResult simpleRefund(@RequestBody SimpleRefundParam param){ - return DaxRes.ok(payRefundService.simpleRefund(param)); + return DaxRes.ok(refundService.simpleRefund(param)); } @CountTime @@ -94,7 +94,7 @@ public class UniPayController { @Operation(summary = "退款同步接口") @PostMapping("/syncRefund") public DaxResult syncRefund(@RequestBody RefundSyncParam param){ - return DaxRes.ok(payRefundSyncService.sync(param)); + return DaxRes.ok(refundSyncService.sync(param)); } } diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniQueryController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniQueryController.java index f82cc4a29..b7196eb01 100644 --- a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniQueryController.java +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/UniQueryController.java @@ -8,7 +8,7 @@ import cn.bootx.platform.daxpay.result.DaxResult; import cn.bootx.platform.daxpay.result.order.PayOrderResult; import cn.bootx.platform.daxpay.result.order.RefundOrderResult; import cn.bootx.platform.daxpay.service.annotation.PaymentApi; -import cn.bootx.platform.daxpay.service.core.order.refund.service.PayRefundOrderQueryService; +import cn.bootx.platform.daxpay.service.core.order.refund.service.RefundOrderQueryService; import cn.bootx.platform.daxpay.util.DaxRes; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RestController; public class UniQueryController { private final cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderQueryService PayOrderQueryService; - private final PayRefundOrderQueryService payRefundQueryService; + private final RefundOrderQueryService payRefundQueryService; @CountTime @PaymentApi("queryPayOrder") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ApiInfoLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ApiInfoLocal.java index c7bf49b76..2d7330082 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ApiInfoLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ApiInfoLocal.java @@ -18,8 +18,8 @@ public class ApiInfoLocal { /** 是否开启通知 */ private boolean notice; - /** 只有异步支付才进行通知 */ - private boolean onlyAsyncNotice; + /** 回调地址 */ + private String noticeUrl; /** 请求参数是否签名 */ private boolean reqSign; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/NoticeLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/NoticeLocal.java index 688a5bee4..1de0e9612 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/NoticeLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/NoticeLocal.java @@ -12,10 +12,19 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class NoticeLocal { - /** 异步回调地址 */ + /** + * 异步回调地址 + * 如果系统关闭回调, 则通知地址为空 + * 如果传输参数中不进行回调为true, 则通知地址为空 + * 如果传输参数地址为空, 读取接口配置回调地址 + * 如果接口配置为空, 读取系统平台配置的回调地址 + */ private String notifyUrl; - /** 同步回调地址 */ + /** + * 同步回调地址, 这个一定会触发, 只有支付会触发且无法关闭 + * 如果参数中不传输, 会自动读取系统平台配置的回调地址 + */ private String returnUrl; /** 退出回调地址 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java index 35e002aed..592ca974c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java @@ -28,6 +28,9 @@ public class PlatformLocal { /** 支付通知地址 */ private String notifyUrl; + /** 支付同步跳转地址 */ + private String returnUrl; + /** 订单支付超时(分钟) */ private Integer orderTimeout; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/RequestLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/RequestLocal.java index 9425c5a77..261fbf27c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/RequestLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/RequestLocal.java @@ -14,20 +14,12 @@ import java.time.LocalDateTime; @Accessors(chain = true) public class RequestLocal { - /** 接口信息 */ - /** 客户端ip */ private String clientIp; - /** 商户扩展参数,回调时会原样返回 */ - private String attach; - /** 签名 */ private String sign; - /** API版本号 */ - private String version; - /** 请求时间,时间戳转时间 */ private LocalDateTime reqTime; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRecordService.java index 9c2ad51dc..4e42078bf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRecordService.java @@ -9,8 +9,8 @@ import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayRecordMana import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.dto.channel.alipay.AliPayRecordDto; import cn.bootx.platform.daxpay.service.param.channel.alipay.AliPayRecordQuery; import lombok.RequiredArgsConstructor; @@ -45,7 +45,7 @@ public class AliPayRecordService { /** * 退款 */ - public void refund(PayRefundOrder order, PayRefundChannelOrder channelOrder){ + public void refund(RefundOrder order, RefundChannelOrder channelOrder){ AliPayRecord aliPayRecord = new AliPayRecord() .setType(AliPayRecordTypeEnum.PAY.getCode()) .setTitle(order.getTitle()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java index 518b0bfa9..84c8e7cf5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.AliPayCode; import cn.bootx.platform.daxpay.service.common.context.RefundLocal; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeRefundModel; import com.alipay.api.response.AlipayTradeRefundResponse; @@ -29,7 +29,7 @@ public class AliPayRefundService { /** * 退款, 调用支付宝退款 */ - public void refund(PayRefundOrder refundOrder, int amount) { + public void refund(RefundOrder refundOrder, int amount) { RefundLocal refundInfo = PaymentContextLocal.get().getRefundInfo(); AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel(); refundModel.setOutTradeNo(String.valueOf(refundOrder.getPaymentId())); 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 f96ec54b9..01c3f78b8 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 @@ -5,7 +5,7 @@ import cn.bootx.platform.daxpay.code.RefundSyncStatusEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; import cn.bootx.platform.daxpay.service.code.AliPayCode; 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.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.core.payment.sync.result.PayGatewaySyncResult; import cn.bootx.platform.daxpay.service.core.payment.sync.result.RefundGatewaySyncResult; import cn.hutool.json.JSONUtil; @@ -96,7 +96,7 @@ public class AliPaySyncService { * 退款同步查询 * 注意: 支付宝退款没有网关订单号, 网关订单号是支付单的 */ - public RefundGatewaySyncResult syncRefundStatus(PayRefundOrder refundOrder) { + public RefundGatewaySyncResult syncRefundStatus(RefundOrder refundOrder) { RefundGatewaySyncResult syncResult = new RefundGatewaySyncResult().setSyncStatus(RefundSyncStatusEnum.FAIL); try { AlipayTradeFastpayRefundQueryModel queryModel = new AlipayTradeFastpayRefundQueryModel(); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/cash/service/CashRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/cash/service/CashRecordService.java index 8ab42554a..1fa94f6f4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/cash/service/CashRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/cash/service/CashRecordService.java @@ -7,7 +7,7 @@ import cn.bootx.platform.daxpay.service.code.CashRecordTypeEnum; import cn.bootx.platform.daxpay.service.core.channel.cash.dao.CashRecordManager; import cn.bootx.platform.daxpay.service.core.channel.cash.entity.CashRecord; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; import cn.bootx.platform.daxpay.service.dto.channel.cash.CashRecordDto; import cn.bootx.platform.daxpay.service.param.channel.cash.CashRecordQuery; import lombok.RequiredArgsConstructor; @@ -41,7 +41,7 @@ public class CashRecordService { /** * 退款保存 */ - public void refund(PayRefundChannelOrder channelOrder, String title){ + public void refund(RefundChannelOrder channelOrder, String title){ CashRecord record = new CashRecord() .setTitle(title) .setType(CashRecordTypeEnum.REFUND.getCode()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/voucher/service/VoucherRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/voucher/service/VoucherRecordService.java index 6e8ea0c17..08d20e6d0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/voucher/service/VoucherRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/voucher/service/VoucherRecordService.java @@ -8,7 +8,7 @@ import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherRecordMa import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher; import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.VoucherRecord; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; import cn.bootx.platform.daxpay.service.dto.channel.voucher.VoucherRecordDto; import cn.bootx.platform.daxpay.service.param.channel.voucher.VoucherRecordQuery; import lombok.RequiredArgsConstructor; @@ -59,7 +59,7 @@ public class VoucherRecordService { /** * 退款保存 */ - public void refund(PayRefundChannelOrder channelOrder, String title, Voucher voucher){ + public void refund(RefundChannelOrder channelOrder, String title, Voucher voucher){ VoucherRecord voucherRecord = new VoucherRecord() .setTitle(title) .setType(VoucherRecordTypeEnum.REFUND.getCode()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wallet/service/WalletRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wallet/service/WalletRecordService.java index fc8b551eb..0ee3ef8a8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wallet/service/WalletRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wallet/service/WalletRecordService.java @@ -9,7 +9,7 @@ import cn.bootx.platform.daxpay.service.core.channel.wallet.dao.WalletRecordMana import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet; import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.WalletRecord; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; import cn.bootx.platform.daxpay.service.dto.channel.wallet.WalletRecordDto; import cn.bootx.platform.daxpay.service.param.channel.wallet.WalletRecordQuery; import cn.hutool.core.util.StrUtil; @@ -88,7 +88,7 @@ public class WalletRecordService { /** * 退款保存 */ - public void refund(PayRefundChannelOrder channelOrder, String title, Wallet wallet){ + public void refund(RefundChannelOrder channelOrder, String title, Wallet wallet){ WalletRecord walletRecord = new WalletRecord() .setTitle(title) .setType(WalletRecordTypeEnum.REFUND.getCode()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java index 6ab8393c2..33d8b84c9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java @@ -9,8 +9,8 @@ import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WeChatPayRecordM import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayRecord; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.dto.channel.wechat.WeChatPayRecordDto; import cn.bootx.platform.daxpay.service.param.channel.wechat.WeChatPayRecordQuery; import lombok.RequiredArgsConstructor; @@ -44,7 +44,7 @@ public class WeChatPayRecordService { /** * 退款 */ - public void refund(PayRefundOrder order, PayRefundChannelOrder channelOrder){ + public void refund(RefundOrder order, RefundChannelOrder channelOrder){ WeChatPayRecord weChatPayRecord = new WeChatPayRecord() .setType(AliPayRecordTypeEnum.PAY.getCode()) .setTitle(order.getTitle()) 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 d4bf66f6b..b8d1d1b2f 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 @@ -6,7 +6,7 @@ import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; import cn.bootx.platform.daxpay.service.code.WeChatPayCode; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; 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.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.core.payment.sync.result.PayGatewaySyncResult; import cn.bootx.platform.daxpay.service.core.payment.sync.result.RefundGatewaySyncResult; import cn.hutool.core.date.DatePattern; @@ -102,7 +102,7 @@ public class WeChatPaySyncService { /** * 退款信息查询 */ - public RefundGatewaySyncResult syncRefundStatus(PayRefundOrder refundOrder, WeChatPayConfig weChatPayConfig){ + public RefundGatewaySyncResult syncRefundStatus(RefundOrder refundOrder, WeChatPayConfig weChatPayConfig){ RefundGatewaySyncResult syncResult = new RefundGatewaySyncResult(); Map params = RefundQueryModel.builder() .appid(weChatPayConfig.getWxAppId()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java index 91bb914bf..a5dc9c1e8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java @@ -8,7 +8,7 @@ import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; import com.ijpay.core.enums.SignType; @@ -39,7 +39,7 @@ public class WechatRefundService { * 退款方法 * 微信需要同时传输订单金额或退款金额 */ - public void refund(PayRefundOrder refundOrder, int amount, PayChannelOrder orderChannel, WeChatPayConfig weChatPayConfig) { + public void refund(RefundOrder refundOrder, int amount, PayChannelOrder orderChannel, WeChatPayConfig weChatPayConfig) { String refundFee = String.valueOf(amount); String totalFee = String.valueOf(orderChannel.getAmount()); // 设置退款信息 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/service/PayNoticeService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/service/PayNoticeService.java deleted file mode 100644 index 2e518d455..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/service/PayNoticeService.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.bootx.platform.daxpay.service.core.notice.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.daxpay.code.PaySignTypeEnum; -import cn.bootx.platform.daxpay.service.common.context.ApiInfoLocal; -import cn.bootx.platform.daxpay.service.common.context.PlatformLocal; -import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.service.core.notice.result.PayChannelResult; -import cn.bootx.platform.daxpay.service.core.notice.result.PayNoticeResult; -import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; -import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayOrderExtraManager; -import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrderExtra; -import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderQueryService; -import cn.bootx.platform.daxpay.util.PaySignUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.ContentType; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 支付相关消息通知 - * @author xxm - * @since 2024/1/7 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayNoticeService { - private final PayOrderQueryService payOrderQueryService; - private final PayOrderExtraManager payOrderExtraManager; - private final PayChannelOrderManager payChannelOrderManager; - - /** - * 发送支付完成回调通知 - */ - public void sendPayCallbackNotice(Long paymentId){ - try { - // 获取通知地址和内容相关的信息 - ApiInfoLocal apiInfo = PaymentContextLocal.get().getApiInfo(); - PlatformLocal platform = PaymentContextLocal.get().getPlatformInfo(); - // 首先判断接口是开启了通知回调功能 - if (apiInfo.isNotice()){ - PayOrder payOrder = payOrderQueryService.findById(paymentId).orElseThrow(DataNotExistException::new); - // 判断是否是同步支付, 并且配置不进行消息通知 - if (!payOrder.isAsyncPay() && apiInfo.isOnlyAsyncNotice()){ - return; - } - // 判断客户端发送的请求是否需要发送回调通知 - PayOrderExtra payOrderExtra = payOrderExtraManager.findById(paymentId).orElseThrow(DataNotExistException::new); - if (payOrderExtra.isNotNotify()){ - return; - } - List orderChannels = payChannelOrderManager.findAllByPaymentId(paymentId).stream() - .map(o->new PayChannelResult().setChannel(o.getChannel()).setWay(o.getPayWay()).setAmount(o.getAmount())) - .collect(Collectors.toList()); - // 组装内容 - PayNoticeResult payNoticeResult = new PayNoticeResult() - .setPaymentId(payOrder.getId()) - .setAsyncPay(payOrder.isAsyncPay()) - .setBusinessNo(payOrder.getBusinessNo()) - .setAmount(payOrder.getAmount()) - .setPayTime(payOrder.getPayTime()) - .setCreateTime(payOrder.getCreateTime()) - .setStatus(payOrder.getStatus()) - .setAttach(payOrderExtra.getAttach()) - .setPayChannels(orderChannels); - // 是否需要签名 - if (apiInfo.isNoticeSign()){ - // 签名 - if (Objects.equals(platform.getSignType(), PaySignTypeEnum.MD5.getCode())){ - payNoticeResult.setSign(PaySignUtil.md5Sign(payNoticeResult,platform.getSignSecret())); - } else { - payNoticeResult.setSign(PaySignUtil.hmacSha256Sign(payNoticeResult,platform.getSignSecret())); - } - } - // 地址 - String notifyUrl = payOrderExtra.getNotifyUrl(); - if (StrUtil.isBlank(notifyUrl)){ - throw new DataNotExistException("通知地址为空"); - } - // 发送请求数据 - HttpResponse execute = HttpUtil.createPost(notifyUrl) - .body(JSONUtil.toJsonStr(payNoticeResult), ContentType.JSON.getValue()) - .timeout(10000) - .execute(); - log.info(execute.body()); - } - - } catch (Exception e) { - log.error("发送失败",e); - // 记录错误信息, 同时配置下次通知的时间 - - } - - } -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/builder/PayBuilder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/builder/PayBuilder.java index d07f4bf7f..75929378f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/builder/PayBuilder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/builder/PayBuilder.java @@ -74,13 +74,11 @@ public class PayBuilder { PayOrderExtra payOrderExtra = new PayOrderExtra() .setClientIp(payParam.getClientIp()) .setDescription(payParam.getDescription()) - .setNotNotify(payParam.isNotNotify()) .setNotifyUrl(noticeInfo.getNotifyUrl()) .setReturnUrl(noticeInfo.getReturnUrl()) .setReqSign(payParam.getSign()) .setReqSignType(platform.getSignType()) .setAttach(payParam.getAttach()) - .setApiVersion(payParam.getVersion()) .setReqTime(payParam.getReqTime()); payOrderExtra.setId(paymentId); return payOrderExtra; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java index 71d9b630b..c8f1b0341 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrderExtra.java @@ -32,29 +32,22 @@ public class PayOrderExtra extends MpBaseEntity implements EntityBaseFunction { +public class RefundChannelOrderManager extends BaseManager { /** * 根据退款单ID查找 */ - public List findAllByRefundId(Long paymentId){ - return findAllByField(PayRefundChannelOrder::getRefundId,paymentId); + public List findAllByRefundId(Long paymentId){ + return findAllByField(RefundChannelOrder::getRefundId,paymentId); } /** * 根据退款单ID和退款通道查询 */ - public Optional findByRefundIdAndChannel(Long refundId, String channel) { + public Optional findByRefundIdAndChannel(Long refundId, String channel) { return lambdaQuery() - .eq(PayRefundChannelOrder::getRefundId,refundId) - .eq(PayRefundChannelOrder::getChannel,channel) + .eq(RefundChannelOrder::getRefundId,refundId) + .eq(RefundChannelOrder::getChannel,channel) .oneOpt(); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundChannelOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundChannelOrderMapper.java similarity index 71% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundChannelOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundChannelOrderMapper.java index 9e97f4af1..b0ef552c7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundChannelOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundChannelOrderMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.core.order.refund.dao; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -10,5 +10,5 @@ import org.apache.ibatis.annotations.Mapper; * @since 2024/1/17 */ @Mapper -public interface PayRefundChannelOrderMapper extends BaseMapper { +public interface RefundChannelOrderMapper extends BaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraManager.java new file mode 100644 index 000000000..58590010d --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraManager.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.service.core.order.refund.dao; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrderExtra; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/2/22 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class RefundOrderExtraManager extends BaseManager { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraMapper.java new file mode 100644 index 000000000..3809a1b33 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderExtraMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.service.core.order.refund.dao; + +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrderExtra; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/2/22 + */ +@Mapper +public interface RefundOrderExtraMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderManager.java similarity index 60% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderManager.java index e58d63e29..740c5b0cf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderManager.java @@ -4,8 +4,8 @@ import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; -import cn.bootx.platform.daxpay.service.param.order.PayRefundOrderQuery; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; +import cn.bootx.platform.daxpay.service.param.order.RefundOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -22,28 +22,28 @@ import java.util.Optional; @Slf4j @Repository @RequiredArgsConstructor -public class PayRefundOrderManager extends BaseManager { +public class RefundOrderManager extends BaseManager { /** * 分页 */ - public Page page(PageParam pageParam, PayRefundOrderQuery query) { - Page mpPage = MpUtil.getMpPage(pageParam, PayRefundOrder.class); - QueryWrapper generator = QueryGenerator.generator(query); + public Page page(PageParam pageParam, RefundOrderQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam, RefundOrder.class); + QueryWrapper generator = QueryGenerator.generator(query); return page(mpPage,generator); } /** * 根据退款号查询 */ - public Optional findByRefundNo(String refundNo) { - return findByField(PayRefundOrder::getRefundNo, refundNo); + public Optional findByRefundNo(String refundNo) { + return findByField(RefundOrder::getRefundNo, refundNo); } /** * 查询支付号是否重复 */ public boolean existsByRefundNo(String refundNo){ - return this.existedByField(PayRefundOrder::getRefundNo,refundNo); + return this.existedByField(RefundOrder::getRefundNo,refundNo); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderMapper.java similarity index 75% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderMapper.java index f99d2d59f..90ed49699 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/PayRefundOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/dao/RefundOrderMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.core.order.refund.dao; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2022/3/2 */ @Mapper -public interface PayRefundOrderMapper extends BaseMapper { +public interface RefundOrderMapper extends BaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundChannelOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundChannelOrder.java similarity index 94% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundChannelOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundChannelOrder.java index 9e1e348ee..312b7320a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundChannelOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundChannelOrder.java @@ -26,7 +26,7 @@ import java.time.LocalDateTime; @DbTable(comment = "支付退款通道订单") @Accessors(chain = true) @TableName("pay_refund_channel_order") -public class PayRefundChannelOrder extends MpCreateEntity implements EntityBaseFunction { +public class RefundChannelOrder extends MpCreateEntity implements EntityBaseFunction { @DbColumn(comment = "关联退款id") private Long refundId; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundOrder.java similarity index 84% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundOrder.java index 0181fd047..3d415dd8f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/PayRefundOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/refund/entity/RefundOrder.java @@ -4,8 +4,8 @@ import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.RefundStatusEnum; -import cn.bootx.platform.daxpay.service.core.order.refund.convert.PayRefundOrderConvert; -import cn.bootx.platform.daxpay.service.dto.order.refund.PayRefundOrderDto; +import cn.bootx.platform.daxpay.service.core.order.refund.convert.RefundOrderConvert; +import cn.bootx.platform.daxpay.service.dto.order.refund.RefundOrderDto; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import com.baomidou.mybatisplus.annotation.FieldStrategy; @@ -29,7 +29,7 @@ import java.time.LocalDateTime; @Accessors(chain = true) @DbTable(comment = "退款订单") @TableName(value = "pay_refund_order", autoResultMap = true) -public class PayRefundOrder extends MpBaseEntity implements EntityBaseFunction { +public class RefundOrder extends MpBaseEntity implements EntityBaseFunction { /** 关联支付id */ @DbColumn(comment = "关联支付id") @@ -77,14 +77,6 @@ public class PayRefundOrder extends MpBaseEntity implements EntityBaseFunction

page(PageParam pageParam, PayRefundOrderQuery query) { - Page page = refundOrderManager.page(pageParam, query); + public PageResult page(PageParam pageParam, RefundOrderQuery query) { + Page page = refundOrderManager.page(pageParam, query); return MpUtil.convert2DtoPageResult(page); } /** * 根据id查询 */ - public PayRefundOrderDto findById(Long id) { - return refundOrderManager.findById(id).map(PayRefundOrder::toDto) + public RefundOrderDto findById(Long id) { + return refundOrderManager.findById(id).map(RefundOrder::toDto) .orElseThrow(() -> new DataNotExistException("退款订单不存在")); } @@ -61,7 +61,7 @@ public class PayRefundOrderQueryService { * 通道退款订单列表查询 */ public List listByChannel(Long refundId){ - List refundOrderChannels = refundOrderChannelManager.findAllByRefundId(refundId); + List refundOrderChannels = refundOrderChannelManager.findAllByRefundId(refundId); return refundOrderChannels.stream() .map(RefundOrderChannelConvert.CONVERT::convert) .collect(Collectors.toList()); @@ -72,7 +72,7 @@ public class PayRefundOrderQueryService { */ public RefundChannelOrderDto findChannelById(Long id) { return refundOrderChannelManager.findById(id) - .map(PayRefundChannelOrder::toDto) + .map(RefundChannelOrder::toDto) .orElseThrow(() -> new DataNotExistException("通道退款订单不存在")); } @@ -86,7 +86,7 @@ public class PayRefundOrderQueryService { } // 查询退款单 - PayRefundOrder refundOrder = null; + RefundOrder refundOrder = null; if (Objects.nonNull(param.getRefundId())){ refundOrder = refundOrderManager.findById(param.getRefundId()) .orElseThrow(() -> new DataNotExistException("未查询到支付订单")); @@ -96,12 +96,12 @@ public class PayRefundOrderQueryService { .orElseThrow(() -> new DataNotExistException("未查询到支付订单")); } // 查询退款明细 - List refundOrderChannels = refundOrderChannelManager.findAllByRefundId(refundOrder.getId()); + List refundOrderChannels = refundOrderChannelManager.findAllByRefundId(refundOrder.getId()); List channels = refundOrderChannels.stream() .map(RefundOrderChannelConvert.CONVERT::convertResult) .collect(Collectors.toList()); - RefundOrderResult refundOrderResult = PayRefundOrderConvert.CONVERT.convertResult(refundOrder); + RefundOrderResult refundOrderResult = RefundOrderConvert.CONVERT.convertResult(refundOrder); refundOrderResult.setRefundId(refundOrder.getId()); refundOrderResult.setChannels(channels); return refundOrderResult; 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/RefundCallbackService.java similarity index 90% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/PayRefundCallbackService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/callback/service/RefundCallbackService.java index a8c040496..c64a10ddd 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/RefundCallbackService.java @@ -5,8 +5,8 @@ import cn.bootx.platform.daxpay.service.code.PayCallbackStatusEnum; import cn.bootx.platform.daxpay.service.code.RefundRepairWayEnum; import cn.bootx.platform.daxpay.service.common.context.CallbackLocal; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.core.payment.repair.result.RefundRepairResult; import cn.bootx.platform.daxpay.service.core.payment.repair.service.RefundRepairService; import com.baomidou.lock.LockInfo; @@ -18,15 +18,15 @@ import org.springframework.stereotype.Service; import java.util.Objects; /** - * 支付退款回调 + * 退款回调 * @author xxm * @since 2024/1/24 */ @Slf4j @Service @RequiredArgsConstructor -public class PayRefundCallbackService { - private final PayRefundOrderManager refundOrderManager; +public class RefundCallbackService { + private final RefundOrderManager refundOrderManager; private final RefundRepairService reflectionService; @@ -47,7 +47,7 @@ public class PayRefundCallbackService { } try { // 获取退款单 - PayRefundOrder refundOrder = refundOrderManager.findById(callbackInfo.getOrderId()).orElse(null); + RefundOrder refundOrder = refundOrderManager.findById(callbackInfo.getOrderId()).orElse(null); // 退款单不存在,记录回调记录 if (Objects.isNull(refundOrder)) { callbackInfo.setCallbackStatus(PayCallbackStatusEnum.NOT_FOUND).setMsg("退款单不存在,记录回调记录"); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/common/service/PaymentAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/common/service/PaymentAssistService.java index 7f04584ac..2877c2248 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/common/service/PaymentAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/common/service/PaymentAssistService.java @@ -52,9 +52,7 @@ public class PaymentAssistService { private void initRequest(PaymentCommonParam paymentCommonParam){ RequestLocal request = PaymentContextLocal.get().getRequestInfo(); request.setClientIp(paymentCommonParam.getClientIp()) -// .setAttach(paymentCommonParam.getAttach()) .setSign(paymentCommonParam.getSign()) - .setVersion(paymentCommonParam.getVersion()) .setReqTime(paymentCommonParam.getReqTime()) .setReqId(MDC.get(CommonCode.TRACE_ID)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayChannelResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayChannelResult.java similarity index 91% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayChannelResult.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayChannelResult.java index 6b94ba6c9..dc9467c27 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayChannelResult.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayChannelResult.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.service.core.notice.result; +package cn.bootx.platform.daxpay.service.core.payment.notice.result; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayWayEnum; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayNoticeResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayNoticeResult.java similarity index 95% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayNoticeResult.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayNoticeResult.java index 1c69e4323..179440024 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/notice/result/PayNoticeResult.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/PayNoticeResult.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.service.core.notice.result; +package cn.bootx.platform.daxpay.service.core.payment.notice.result; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundChannelResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundChannelResult.java new file mode 100644 index 000000000..280854f1e --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundChannelResult.java @@ -0,0 +1,26 @@ +package cn.bootx.platform.daxpay.service.core.payment.notice.result; + +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 退款通道信息 + * @author xxm + * @since 2024/2/22 + */ +@Data +@Accessors(chain = true) +@Schema(title = "退款通道信息") +public class RefundChannelResult { + + /** + * @see PayChannelEnum#getCode() + */ + @Schema(description = "支付通道编码") + private String channel; + + @Schema(description = "退款金额") + private Integer amount; +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundNoticeResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundNoticeResult.java new file mode 100644 index 000000000..1ca5e40c8 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/result/RefundNoticeResult.java @@ -0,0 +1,61 @@ +package cn.bootx.platform.daxpay.service.core.payment.notice.result; + +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.RefundStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * + * @author xxm + * @since 2024/2/22 + */ +@Data +@Accessors(chain = true) +@Schema(title = "退款通知消息") +public class RefundNoticeResult { + + + @Schema(description = "退款ID") + private Long refundId; + + @Schema(description = "退款号") + private String refundNo; + + @Schema(description = "是否含有异步通道") + private boolean asyncPay; + + /** + * @see PayChannelEnum#ASYNC_TYPE_CODE + */ + @Schema(description = "异步支付通道") + private String asyncChannel; + + @Schema(description = "退款金额") + private Integer amount; + + @Schema(description = "退款通道信息") + private List refundChannels; + + /** + * @see RefundStatusEnum + */ + @Schema(description = "退款状态") + private String status; + + @Schema(description = "退款成功时间") + private LocalDateTime refundTime; + + @Schema(description = "退款创建时间") + private LocalDateTime createTime; + + @Schema(description = "商户扩展参数,回调时会原样返回") + private String attach; + + @Schema(description = "签名") + private String sign; +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java index e21cba68e..b85f3a788 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java @@ -6,22 +6,30 @@ import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.redis.RedisClient; import cn.bootx.platform.daxpay.code.PaySignTypeEnum; import cn.bootx.platform.daxpay.service.code.ClientNoticeTypeEnum; -import cn.bootx.platform.daxpay.service.core.notice.result.PayChannelResult; -import cn.bootx.platform.daxpay.service.core.notice.result.PayNoticeResult; import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayOrderExtraManager; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrderExtra; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundChannelOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderExtraManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.core.payment.notice.dao.ClientNoticeTaskManager; import cn.bootx.platform.daxpay.service.core.payment.notice.entity.ClientNoticeTask; +import cn.bootx.platform.daxpay.service.core.payment.notice.result.PayChannelResult; +import cn.bootx.platform.daxpay.service.core.payment.notice.result.PayNoticeResult; +import cn.bootx.platform.daxpay.service.core.payment.notice.result.RefundChannelResult; +import cn.bootx.platform.daxpay.service.core.payment.notice.result.RefundNoticeResult; import cn.bootx.platform.daxpay.service.core.system.config.entity.PlatformConfig; import cn.bootx.platform.daxpay.service.core.system.config.service.PlatformConfigService; import cn.bootx.platform.daxpay.util.PaySignUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.HttpException; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; @@ -44,9 +52,13 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class ClientNoticeService { - private final PayOrderExtraManager orderExtraManager; + private final PayOrderExtraManager payOrderExtraManager; - private final PayChannelOrderManager channelOrderManager; + private final PayChannelOrderManager payChannelOrderManager; + + private final RefundOrderExtraManager refundOrderExtraManager; + + private final RefundChannelOrderManager refundChannelOrderManager; private final PlatformConfigService configService; @@ -61,30 +73,30 @@ public class ClientNoticeService { private static final Map DELAY_TIME = new HashMap<>(); /* + * key: 当前通知次数, value 下次通知的时间间隔 * 初始化延迟时间表, 总共会发起16次通知吗, 总计 24h4m * 通知频率为0s/15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h */ static { - DELAY_TIME.put(1, 0); + DELAY_TIME.put(1, 15 * 1000); DELAY_TIME.put(2, 15 * 1000); - DELAY_TIME.put(3, 15 * 1000); - DELAY_TIME.put(4, 30 * 1000); - DELAY_TIME.put(5, 3 * 60 * 1000); - DELAY_TIME.put(6, 10 * 60 * 1000); - DELAY_TIME.put(7, 20 * 60 * 1000); + DELAY_TIME.put(3, 30 * 1000); + DELAY_TIME.put(4, 3 * 60 * 1000); + DELAY_TIME.put(5, 10 * 60 * 1000); + DELAY_TIME.put(6, 20 * 60 * 1000); + DELAY_TIME.put(7, 30 * 60 * 1000); DELAY_TIME.put(8, 30 * 60 * 1000); DELAY_TIME.put(9, 30 * 60 * 1000); - DELAY_TIME.put(10, 30 * 60 * 1000); - DELAY_TIME.put(11, 60 * 60 * 1000); + DELAY_TIME.put(10, 60 * 60 * 1000); + DELAY_TIME.put(11, 3 * 60 * 60 * 1000); DELAY_TIME.put(12, 3 * 60 * 60 * 1000); DELAY_TIME.put(13, 3 * 60 * 60 * 1000); - DELAY_TIME.put(14, 3 * 60 * 60 * 1000); + DELAY_TIME.put(14, 6 * 60 * 60 * 1000); DELAY_TIME.put(15, 6 * 60 * 60 * 1000); - DELAY_TIME.put(16, 6 * 60 * 60 * 1000); } /** - * 注册支付消息通知任务, 失败重试3次, 间隔一秒 + * 注册支付消息通知任务 * @param order 支付订单 * @param orderExtra 支付订单扩展信息 * @param channelOrders 支付通道订单 @@ -93,30 +105,30 @@ public class ClientNoticeService { public void registerPayNotice(PayOrder order, PayOrderExtra orderExtra, List channelOrders) { // 支付订单扩展信息为空则进行查询 if (Objects.isNull(orderExtra)){ - Optional extraOpt = orderExtraManager.findById(order.getId()); + Optional extraOpt = payOrderExtraManager.findById(order.getId()); if (!extraOpt.isPresent()){ log.error("未找到支付扩展信息,数据错误,订单ID:{}",order.getId()); return; } orderExtra = extraOpt.get(); } - // 通道支付订单为空则进行查询 - if (CollUtil.isEmpty(channelOrders)){ - channelOrders = channelOrderManager.findAllByPaymentId(order.getId()); + // 判断是否需要进行通知 + if (StrUtil.isBlank(orderExtra.getNotifyUrl())){ + log.info("支付订单无需通知,订单ID:{}",order.getId()); } - // 将任务写入到任务表中 - ClientNoticeTask task = new ClientNoticeTask() - .setType(ClientNoticeTypeEnum.PAY.getType()) - .setUrl(orderExtra.getNotifyUrl()) - .setSendCount(0); + // 通道支付订单为空则进行查询 + if (CollUtil.isEmpty(channelOrders)){ + channelOrders = payChannelOrderManager.findAllByPaymentId(order.getId()); + } + // 创建通知任务并保存 + ClientNoticeTask task = this.buildPayTask(order, orderExtra, channelOrders); try { taskManager.save(task); } catch (Exception e) { log.error("注册支付消息通知任务失败,数据错误,订单ID:{}",order.getId()); throw new RuntimeException(e); } - try { // 同时触发一次通知, 如果成功发送, 任务结束 this.sendData(task, LocalDateTime.now()); @@ -126,9 +138,9 @@ public class ClientNoticeService { } /** - * 构建出任务对象 + * 构建出支付通知任务对象 */ - private void buildTask(PayOrder order, PayOrderExtra orderExtra, List channelOrders){ + private ClientNoticeTask buildPayTask(PayOrder order, PayOrderExtra orderExtra, List channelOrders){ // 组装内容 List channels = channelOrders.stream() .map(o->new PayChannelResult().setChannel(o.getChannel()).setWay(o.getPayWay()).setAmount(o.getAmount())) @@ -155,13 +167,102 @@ public class ClientNoticeService { payNoticeResult.setSign(PaySignUtil.hmacSha256Sign(payNoticeResult,config.getSignSecret())); } } + return new ClientNoticeTask() + .setUrl(orderExtra.getNotifyUrl()) + .setContent(JSONUtil.toJsonStr(payNoticeResult)) + .setType(ClientNoticeTypeEnum.PAY.getType()) + .setSendCount(0) + .setOrderId(order.getId()); } + + /** + * 注册退款消息通知任务 + * @param order 退款订单 + * @param orderExtra 退款订单扩展信息 + * @param channelOrders 退款通道订单 + */ + @Async("bigExecutor") + public void registerRefundNotice(RefundOrder order, PayOrderExtra orderExtra, List channelOrders) { + // 退款订单扩展信息为空则进行查询 + if (Objects.isNull(orderExtra)){ + Optional extraOpt = payOrderExtraManager.findById(order.getId()); + if (!extraOpt.isPresent()){ + log.error("未找到支付扩展信息,数据错误,订单ID:{}",order.getId()); + return; + } + orderExtra = extraOpt.get(); + } + // 判断是否需要进行通知 + if (StrUtil.isBlank(orderExtra.getNotifyUrl())){ + log.info("退款订单无需通知,订单ID:{}",order.getId()); + } + + // 通道退款订单为空则进行查询 + if (CollUtil.isEmpty(channelOrders)){ + channelOrders = refundChannelOrderManager.findAllByRefundId(order.getId()); + } + // 创建通知任务并保存 + ClientNoticeTask task = this.buildRefundTask(order, orderExtra, channelOrders); + try { + taskManager.save(task); + } catch (Exception e) { + log.error("注册退款消息通知任务失败,数据错误,订单ID:{}",order.getId()); + throw new RuntimeException(e); + } + try { + // 同时触发一次通知, 如果成功发送, 任务结束 + this.sendData(task, LocalDateTime.now()); + } catch (HttpException e) { + this.failHandler(task, LocalDateTime.now()); + } + } + + /** + * 构建出退款通知任务对象 + */ + private ClientNoticeTask buildRefundTask(RefundOrder order, PayOrderExtra orderExtra, List channelOrders){ + // 组装内容 + List channels = channelOrders.stream() + .map(o->new RefundChannelResult().setChannel(o.getChannel()).setAmount(o.getAmount())) + .collect(Collectors.toList()); + + RefundNoticeResult payNoticeResult = new RefundNoticeResult() + .setRefundId(order.getId()) + .setAsyncPay(order.isAsyncPay()) + .setAsyncChannel(order.getAsyncChannel()) + .setRefundNo(order.getRefundNo()) + .setAmount(order.getAmount()) + .setRefundTime(order.getRefundTime()) + .setCreateTime(order.getCreateTime()) + .setStatus(order.getStatus()) + .setAttach(orderExtra.getAttach()) + .setRefundChannels(channels); + + PlatformConfig config = configService.getConfig(); + // 是否需要签名 + if (orderExtra.isNoticeSign()){ + // 签名 + if (Objects.equals(config.getSignType(), PaySignTypeEnum.MD5.getCode())){ + payNoticeResult.setSign(PaySignUtil.md5Sign(payNoticeResult,config.getSignSecret())); + } else { + payNoticeResult.setSign(PaySignUtil.hmacSha256Sign(payNoticeResult,config.getSignSecret())); + } + } + return new ClientNoticeTask() + .setUrl(orderExtra.getNotifyUrl()) + .setContent(JSONUtil.toJsonStr(payNoticeResult)) + .setType(ClientNoticeTypeEnum.PAY.getType()) + .setSendCount(0) + .setOrderId(order.getId()); + } + + /** * 从redis中执行任务, 通过定时任务触发 */ @Async("asyncExecutor") - public void taskRun(long start, long end){ + public void taskStart(long start, long end){ // 查询Redis任务表,获取任务 Set taskIds = redisClient.zrangeByScore(KEY, start, end); // 发起一个异步任务, @@ -199,7 +300,7 @@ public class ClientNoticeService { } /** - * 处理任务, 出现异常直接抛出 + * 发送通知数据, 如果失败, 注册下次重发的任务 */ private void sendData(ClientNoticeTask task, LocalDateTime now){ HttpResponse execute = HttpUtil.createPost(task.getUrl()) @@ -220,35 +321,25 @@ public class ClientNoticeService { */ private void successHandler(ClientNoticeTask task){ // 记录成功并保存 + task.setSendCount(task.getSendCount() + 1); task.setSuccess(true); taskManager.updateById(task); } /** - * 失败处理, 首先发送次数+1, 然后 + * 失败处理, 首先发送次数+1, 然后注册后推指定时间的重试任务 */ private void failHandler(ClientNoticeTask task, LocalDateTime now){ // 次数+1 task.setSendCount(task.getSendCount() + 1); - // 注册任务到redis中 - this.pushRedis(task, now); - // 更新任务 + // 判断发送次数是否未超过15次, 注册任务到redis中 + if (task.getSendCount() < 16){ + // 根据当前次数和时间计算出毫秒值 + Integer delay = DELAY_TIME.get(task.getSendCount()); + long taskTime = LocalDateTimeUtil.timestamp(now) + delay; + redisClient.zadd(KEY, String.valueOf(task.getId()), taskTime); + } + // 更新任务信息 taskManager.updateById(task); } - - /** - * 注册到Redis任务列表中 - */ - private void pushRedis(ClientNoticeTask task, LocalDateTime now){ - // 判断发送次数是否超过16次 - if (task.getSendCount() > 16){ - return; - } - // 根据当前次数和时间计算出毫秒值 - Integer delay = DELAY_TIME.get(task.getSendCount()); - long taskTime = LocalDateTimeUtil.timestamp(now) + delay; - redisClient.zadd(KEY, String.valueOf(task.getId()), taskTime); - - } - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayAssistService.java index cde747976..7680da10b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/pay/service/PayAssistService.java @@ -6,6 +6,7 @@ import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.pay.PayChannelParam; import cn.bootx.platform.daxpay.param.pay.PayParam; +import cn.bootx.platform.daxpay.service.common.context.ApiInfoLocal; import cn.bootx.platform.daxpay.service.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.service.common.context.NoticeLocal; import cn.bootx.platform.daxpay.service.common.context.PlatformLocal; @@ -95,16 +96,26 @@ public class PayAssistService { */ private void initNotice(PayParam payParam){ NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); + ApiInfoLocal apiInfo = PaymentContextLocal.get().getApiInfo(); PlatformLocal platform = PaymentContextLocal.get().getPlatformInfo(); - // 异步回调 - if (!payParam.isNotNotify()){ - noticeInfo.setNotifyUrl(payParam.getReturnUrl()); - if (StrUtil.isNotBlank(payParam.getNotifyUrl())){ + // 异步回调为开启状态 + if (!payParam.isNotNotify() && apiInfo.isNotice()){ + // 首先读取请求参数 + noticeInfo.setNotifyUrl(payParam.getNotifyUrl()); + // 读取接口配置 + if (StrUtil.isNotBlank(noticeInfo.getNotifyUrl())){ + noticeInfo.setNotifyUrl(apiInfo.getNoticeUrl()); + } + // 读取平台配置 + if (StrUtil.isNotBlank(noticeInfo.getNotifyUrl())){ noticeInfo.setNotifyUrl(platform.getNotifyUrl()); } } // 同步回调 - noticeInfo.setReturnUrl(payParam.getReturnUrl()); + noticeInfo.setNotifyUrl(payParam.getReturnUrl()); + if (StrUtil.isNotBlank(noticeInfo.getNotifyUrl())){ + noticeInfo.setNotifyUrl(platform.getNotifyUrl()); + } // 退出回调地址 noticeInfo.setQuitUrl(payParam.getQuitUrl()); } @@ -150,19 +161,24 @@ public class PayAssistService { * @param payParam 支付参数 * @param paymentId 支付订单id */ - public void updatePayOrderExtra(PayParam payParam,Long paymentId){ + public PayOrderExtra updatePayOrderExtra(PayParam payParam,Long paymentId){ + ApiInfoLocal apiInfo = PaymentContextLocal.get().getApiInfo(); PayOrderExtra payOrderExtra = payOrderExtraManager.findById(paymentId) .orElseThrow(() -> new DataNotExistException("支付订单不存在")); - String notifyUrl = PaymentContextLocal.get().getNoticeInfo().getNotifyUrl(); - String returnUrl = PaymentContextLocal.get().getNoticeInfo().getReturnUrl(); + + NoticeLocal noticeInfo = PaymentContextLocal.get() + .getNoticeInfo(); + String notifyUrl = noticeInfo.getNotifyUrl(); + String returnUrl = noticeInfo.getReturnUrl(); + payOrderExtra.setReqTime(payParam.getReqTime()) .setReqSign(payParam.getSign()) - .setNotNotify(payParam.isNotNotify()) .setNotifyUrl(notifyUrl) .setReturnUrl(returnUrl) + .setNoticeSign(apiInfo.isNoticeSign()) .setAttach(payParam.getAttach()) .setClientIp(payParam.getClientIp()); - payOrderExtraManager.updateById(payOrderExtra); + return payOrderExtraManager.updateById(payOrderExtra); } /** 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 508eb93ba..1224fae5c 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 @@ -12,6 +12,7 @@ import cn.bootx.platform.daxpay.service.core.order.pay.builder.PayBuilder; import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrderExtra; import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderService; import cn.bootx.platform.daxpay.service.core.payment.notice.service.ClientNoticeService; import cn.bootx.platform.daxpay.service.core.payment.pay.factory.PayStrategyFactory; @@ -220,18 +221,22 @@ public class PayService { // 5.2支付发起成功处理 payStrategyList.forEach(AbsPayStrategy::doSuccessHandler); - // 6.1 如果异步支付完成, 进行订单完成处理, 并触发通知 + // 6.1 如果异步支付完成, 进行订单完成处理 AsyncPayLocal asyncPayInfo = PaymentContextLocal.get().getAsyncPayInfo(); if (asyncPayInfo.isPayComplete()) { payOrder.setGatewayOrderNo(asyncPayInfo.getGatewayOrderNo()) .setStatus(SUCCESS.getCode()) .setPayTime(LocalDateTime.now()); - clientNoticeService.registerPayNotice(payOrder,null,null); } // 6.2 更新支付订单和扩展参数 payOrderService.updateById(payOrder); - payAssistService.updatePayOrderExtra(payParam,payOrder.getId()); + PayOrderExtra payOrderExtra = payAssistService.updatePayOrderExtra(payParam, payOrder.getId()); + + // 订单完成, 触发通知 + if (Objects.equals(payOrder.getStatus(), SUCCESS.getCode())) { + clientNoticeService.registerPayNotice(payOrder, payOrderExtra,null); + } // 7. 组装返回参数 return PayBuilder.buildPayResultByPayOrder(payOrder); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/PayRefundStrategyFactory.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/RefundStrategyFactory.java similarity index 89% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/PayRefundStrategyFactory.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/RefundStrategyFactory.java index 91a423757..08bc1c598 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/PayRefundStrategyFactory.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/factory/RefundStrategyFactory.java @@ -22,7 +22,7 @@ import static cn.bootx.platform.daxpay.code.PayChannelEnum.ASYNC_TYPE_CODE; * @author xxm * @since 2023/7/4 */ -public class PayRefundStrategyFactory { +public class RefundStrategyFactory { /** * 根据传入的支付通道创建策略 @@ -34,22 +34,22 @@ public class PayRefundStrategyFactory { PayChannelEnum channelEnum = PayChannelEnum.findByCode(refundChannelParam.getChannel()); switch (channelEnum) { case ALI: - strategy = SpringUtil.getBean(AliPayRefundStrategy.class); + strategy = SpringUtil.getBean(AliRefundStrategy.class); break; case WECHAT: - strategy = SpringUtil.getBean(WeChatPayRefundStrategy.class); + strategy = SpringUtil.getBean(WeChatRefundStrategy.class); break; case UNION_PAY: - strategy = SpringUtil.getBean(UnionPayRefundStrategy.class); + strategy = SpringUtil.getBean(UnionRefundStrategy.class); break; case CASH: - strategy = SpringUtil.getBean(CashPayRefundStrategy.class); + strategy = SpringUtil.getBean(CashRefundStrategy.class); break; case WALLET: - strategy = SpringUtil.getBean(WalletPayRefundStrategy.class); + strategy = SpringUtil.getBean(WalletRefundStrategy.class); break; case VOUCHER: - strategy = SpringUtil.getBean(VoucherPayRefundStrategy.class); + strategy = SpringUtil.getBean(VoucherRefundStrategy.class); break; default: throw new PayUnsupportedMethodException(); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java similarity index 72% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java index 5286a58d7..435266da8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java @@ -3,21 +3,24 @@ package cn.bootx.platform.daxpay.service.core.payment.refund.service; import cn.bootx.platform.common.core.exception.ValidationFailedException; import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.code.RefundStatusEnum; import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.code.RefundStatusEnum; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.pay.RefundChannelParam; import cn.bootx.platform.daxpay.param.pay.RefundParam; +import cn.bootx.platform.daxpay.service.common.context.ApiInfoLocal; import cn.bootx.platform.daxpay.service.common.context.NoticeLocal; import cn.bootx.platform.daxpay.service.common.context.PlatformLocal; import cn.bootx.platform.daxpay.service.common.context.RefundLocal; 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.pay.service.PayOrderQueryService; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundChannelOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundChannelOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderExtraManager; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrderExtra; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -42,12 +45,14 @@ import static cn.bootx.platform.daxpay.code.RefundStatusEnum.SUCCESS; @Slf4j @Service @RequiredArgsConstructor -public class PayRefundAssistService { +public class RefundAssistService { private final PayOrderQueryService payOrderQueryService; - private final PayRefundOrderManager payRefundOrderManager; + private final RefundOrderManager refundOrderManager; - private final PayRefundChannelOrderManager payRefundChannelOrderManager; + private final RefundOrderExtraManager refundOrderExtraManager; + + private final RefundChannelOrderManager payRefundChannelOrderManager; /** * 初始化上下文 @@ -62,11 +67,18 @@ public class PayRefundAssistService { */ private void initNotice(RefundParam param) { NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); + ApiInfoLocal apiInfo = PaymentContextLocal.get().getApiInfo(); PlatformLocal platform = PaymentContextLocal.get().getPlatformInfo(); - // 异步回调 - if (!param.isNotNotify()){ + // 异步回调为开启状态 + if (!param.isNotNotify() && apiInfo.isNotice()){ + // 首先读取请求参数 noticeInfo.setNotifyUrl(param.getNotifyUrl()); - if (StrUtil.isNotBlank(param.getNotifyUrl())){ + // 读取接口配置 + if (StrUtil.isNotBlank(noticeInfo.getNotifyUrl())){ + noticeInfo.setNotifyUrl(apiInfo.getNoticeUrl()); + } + // 读取平台配置 + if (StrUtil.isNotBlank(noticeInfo.getNotifyUrl())){ noticeInfo.setNotifyUrl(platform.getNotifyUrl()); } } @@ -97,9 +109,6 @@ public class PayRefundAssistService { if (CollUtil.isEmpty(param.getRefundChannels())) { throw new ValidationFailedException("退款通道参数不能为空"); } -// if (Objects.isNull(param.getRefundNo())) { -// throw new ValidationFailedException("部分退款时退款单号必传"); -// } } // 简单退款校验 @@ -127,7 +136,7 @@ public class PayRefundAssistService { // 退款号唯一校验 if (StrUtil.isNotBlank(param.getRefundNo()) - && payRefundOrderManager.existsByRefundNo(param.getRefundNo())){ + && refundOrderManager.existsByRefundNo(param.getRefundNo())){ throw new PayFailureException("退款单号已存在"); } } @@ -136,7 +145,7 @@ public class PayRefundAssistService { * 预先创建退款相关订单并保存, 使用新事务, 防止丢单 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public PayRefundOrder createOrderAndChannel(RefundParam refundParam, PayOrder payOrder, List refundChannelOrders) { + public RefundOrder createOrderAndChannel(RefundParam refundParam, PayOrder payOrder, List refundChannelOrders) { // 此次的总退款金额 Integer amount = refundParam.getRefundChannels() .stream() @@ -145,7 +154,7 @@ public class PayRefundAssistService { int refundableBalance = payOrder.getRefundableBalance(); // 生成退款订单 - PayRefundOrder refundOrder = new PayRefundOrder() + RefundOrder refundOrder = new RefundOrder() .setPaymentId(payOrder.getId()) .setStatus(RefundStatusEnum.PROGRESS.getCode()) .setBusinessNo(payOrder.getBusinessNo()) @@ -154,8 +163,7 @@ public class PayRefundAssistService { .setAmount(amount) .setRefundableBalance(refundableBalance) .setTitle(payOrder.getTitle()) - .setClientIp(refundParam.getClientIp()) - .setReqId(PaymentContextLocal.get().getRequestInfo().getReqId()); + .setReason(refundParam.getReason()); // 退款参数中是否存在异步通道 RefundChannelParam asyncChannel = refundParam.getRefundChannels() @@ -175,16 +183,41 @@ public class PayRefundAssistService { if(StrUtil.isBlank(refundOrder.getRefundNo())){ refundOrder.setRefundNo(String.valueOf(refundOrder.getId())); } + + RefundOrderExtra refundOrderExtra = this.createRefundOrderExtra(refundParam, refundOrder.getId()); refundChannelOrders.forEach(r->r.setRefundId(refundOrder.getId())); payRefundChannelOrderManager.saveAll(refundChannelOrders); - return payRefundOrderManager.save(refundOrder); + return refundOrderManager.save(refundOrder); + } + + /** + * 创建退款扩展订单 + */ + public RefundOrderExtra createRefundOrderExtra(RefundParam refundParam, Long refundOrderId){ + PlatformLocal platform = PaymentContextLocal.get().getPlatformInfo(); + ApiInfoLocal apiInfo = PaymentContextLocal.get().getApiInfo(); + NoticeLocal notice = PaymentContextLocal.get().getNoticeInfo(); + String reqId = PaymentContextLocal.get() + .getRequestInfo() + .getReqId(); + RefundOrderExtra orderExtra = new RefundOrderExtra() + .setClientIp(refundParam.getClientIp()) + .setReqId(reqId) + .setReqTime(refundParam.getReqTime()) + .setAttach(refundParam.getAttach()) + .setReqSign(refundParam.getSign()) + .setReqSignType(platform.getSignType()) + .setNoticeSign(apiInfo.isNoticeSign()) + .setNotifyUrl(notice.getNotifyUrl()); + orderExtra.setId(refundOrderId); + return orderExtra; } /** * 更新退款成功信息 */ @Transactional(rollbackFor = Exception.class) - public void updateOrderAndChannel(PayRefundOrder refundOrder, List refundChannelOrders){ + public void updateOrderAndChannel(RefundOrder refundOrder, List refundChannelOrders){ RefundLocal asyncRefundInfo = PaymentContextLocal.get().getRefundInfo(); refundOrder.setStatus(asyncRefundInfo.getStatus().getCode()) .setGatewayOrderNo(asyncRefundInfo.getGatewayOrderNo()); @@ -192,7 +225,7 @@ public class PayRefundAssistService { if (Objects.equals(refundOrder.getStatus(), SUCCESS.getCode())){ refundOrder.setRefundTime(LocalDateTime.now()); } - payRefundOrderManager.updateById(refundOrder); + refundOrderManager.updateById(refundOrder); payRefundChannelOrderManager.updateAllById(refundChannelOrders); } @@ -200,7 +233,7 @@ public class PayRefundAssistService { * 更新退款错误信息 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public void updateOrderByError(PayRefundOrder refundOrder){ + public void updateOrderByError(RefundOrder refundOrder){ RefundLocal asyncRefundInfo = PaymentContextLocal.get().getRefundInfo(); refundOrder.setErrorCode(asyncRefundInfo.getErrorCode()); refundOrder.setErrorMsg(asyncRefundInfo.getErrorMsg()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java similarity index 84% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java index 1b6b802b4..1c19883f0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java @@ -17,9 +17,10 @@ import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManage import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderService; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; -import cn.bootx.platform.daxpay.service.core.payment.refund.factory.PayRefundStrategyFactory; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; +import cn.bootx.platform.daxpay.service.core.payment.notice.service.ClientNoticeService; +import cn.bootx.platform.daxpay.service.core.payment.refund.factory.RefundStrategyFactory; import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; @@ -32,10 +33,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -47,12 +45,14 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class PayRefundService { +public class RefundService { - private final PayRefundAssistService payRefundAssistService;; + private final RefundAssistService refundAssistService;; private final PayOrderService payOrderService; + private final ClientNoticeService clientNoticeService; + private final PayChannelOrderManager payChannelOrderManager; private final LockTemplate lockTemplate; @@ -86,9 +86,9 @@ public class PayRefundService { */ private RefundResult refundAdapter(RefundParam param, boolean simple){ // 获取支付订单 - PayOrder payOrder = payRefundAssistService.getPayOrder(param); + PayOrder payOrder = refundAssistService.getPayOrder(param); // 第一次检查退款参数, 校验一些特殊情况 - payRefundAssistService.checkAndDisposeParam(param, payOrder); + refundAssistService.checkAndDisposeParam(param, payOrder); // 组装退款参数, 处理全部退款和简单退款情况 List payChannelOrders = payChannelOrderManager.findAllByPaymentId(payOrder.getId()); @@ -118,7 +118,7 @@ public class PayRefundService { } try { // 退款上下文初始化 - payRefundAssistService.initRefundContext(param); + refundAssistService.initRefundContext(param); // 分支付通道进行退款 return this.refundByChannel(param,payOrder,payChannelOrders); } finally { @@ -139,7 +139,7 @@ public class PayRefundService { List refundChannels = refundParam.getRefundChannels(); // 1.2获取退款参数方式,通过工厂生成对应的策略组 - List payRefundStrategies = PayRefundStrategyFactory.createAsyncLast(refundChannels); + List payRefundStrategies = RefundStrategyFactory.createAsyncLast(refundChannels); if (CollectionUtil.isEmpty(payRefundStrategies)) { throw new PayUnsupportedMethodException(); } @@ -156,7 +156,7 @@ public class PayRefundService { payRefundStrategies.forEach(AbsRefundStrategy::generateChannelOrder); // 退款操作的预处理, 使用独立的新事物进行发起, 返回创建成功的退款订单, 成功后才可以进行下一阶段的操作 - PayRefundOrder refundOrder = SpringUtil.getBean(this.getClass()).preRefundMethod(refundParam, payOrder, payRefundStrategies); + RefundOrder refundOrder = SpringUtil.getBean(this.getClass()).preRefundMethod(refundParam, payOrder, payRefundStrategies); // 设置退款订单对象 payRefundStrategies.forEach(r->r.setRefundOrder(refundOrder)); @@ -170,7 +170,7 @@ public class PayRefundService { payRefundStrategies.forEach(AbsRefundStrategy::doSuccessHandler); // 4.进行成功处理, 分别处理退款订单, 通道退款订单, 支付订单 - List refundChannelOrders = payRefundStrategies.stream() + List refundChannelOrders = payRefundStrategies.stream() .map(AbsRefundStrategy::getRefundChannelOrder) .collect(Collectors.toList()); this.successHandler(refundOrder, refundChannelOrders, payOrder); @@ -190,7 +190,7 @@ public class PayRefundService { * 退款一阶段: 进行支付订单和支付通道订单的预扣, 预创建退款订单并保存, 使用独立的新事物进行发起 */ @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class ) - public PayRefundOrder preRefundMethod(RefundParam refundParam, PayOrder payOrder, List payRefundStrategies) { + public RefundOrder preRefundMethod(RefundParam refundParam, PayOrder payOrder, List payRefundStrategies) { // --------------------------- 支付订单 ------------------------------------- // 预扣支付相关订单要退款的金额并进行更新 payRefundStrategies.forEach(AbsRefundStrategy::doPreDeductOrderHandler); @@ -208,19 +208,19 @@ public class PayRefundService { .setStatus(PayStatusEnum.REFUNDING.getCode()); payOrderService.updateById(payOrder); // ----------------------- 退款订单 ------------------------- - List refundChannelOrders = payRefundStrategies.stream() + List refundChannelOrders = payRefundStrategies.stream() .map(AbsRefundStrategy::getRefundChannelOrder) .collect(Collectors.toList()); - return payRefundAssistService.createOrderAndChannel(refundParam, payOrder,refundChannelOrders); + return refundAssistService.createOrderAndChannel(refundParam, payOrder,refundChannelOrders); } /** * 成功处理, 更新退款订单, 退款通道订单, 支付订单, 支付通道订单 */ - private void successHandler(PayRefundOrder payRefundOrder, List refundChannelOrders, PayOrder payOrder) { + private void successHandler(RefundOrder refundOrder, List refundChannelOrders, PayOrder payOrder) { RefundLocal asyncRefundInfo = PaymentContextLocal.get().getRefundInfo(); // 剩余可退款余额 - int refundableBalance = payRefundOrder.getRefundableBalance(); + int refundableBalance = refundOrder.getRefundableBalance(); // 设置支付订单状态 if (asyncRefundInfo.getStatus() == RefundStatusEnum.PROGRESS) { // 设置为退款中 @@ -235,14 +235,20 @@ public class PayRefundService { payOrderService.updateById(payOrder); // 更新退款订单和相关通道订单 - payRefundAssistService.updateOrderAndChannel(payRefundOrder,refundChannelOrders); + refundAssistService.updateOrderAndChannel(refundOrder,refundChannelOrders); + + // 发送通知 + List list = Arrays.asList(PayStatusEnum.REFUNDING.getCode(), PayStatusEnum.REFUNDED.getCode()); + if (list.contains(payOrder.getStatus())){ + clientNoticeService.registerRefundNotice(refundOrder, null, refundChannelOrders); + } } /** * 失败处理, 只更新退款订单, 通道订单不进行错误更新 */ - private void errorHandler(PayRefundOrder refundOrder) { + private void errorHandler(RefundOrder refundOrder) { // 记录退款失败的记录 - payRefundAssistService.updateOrderByError(refundOrder); + refundAssistService.updateOrderByError(refundOrder); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliRefundStrategy.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliRefundStrategy.java index 3ad055c58..bac7936c9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/AliRefundStrategy.java @@ -25,7 +25,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class AliPayRefundStrategy extends AbsRefundStrategy { +public class AliRefundStrategy extends AbsRefundStrategy { private final AliPayConfigService alipayConfigService; private final AliPayRefundService aliRefundService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashRefundStrategy.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashRefundStrategy.java index c45db0257..6e46c978e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/CashRefundStrategy.java @@ -19,7 +19,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class CashPayRefundStrategy extends AbsRefundStrategy { +public class CashRefundStrategy extends AbsRefundStrategy { private final CashRecordService cashRecordService; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionRefundStrategy.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionRefundStrategy.java index a7838416d..dfd5b1a4f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/UnionRefundStrategy.java @@ -16,7 +16,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class UnionPayRefundStrategy extends AbsRefundStrategy { +public class UnionRefundStrategy extends AbsRefundStrategy { /** * 策略标识 * diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherRefundStrategy.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherRefundStrategy.java index 365ee4d65..d82d93f36 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/VoucherRefundStrategy.java @@ -24,7 +24,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class VoucherPayRefundStrategy extends AbsRefundStrategy { +public class VoucherRefundStrategy extends AbsRefundStrategy { private final VoucherPayService voucherPayService; private final VoucherQueryService voucherQueryService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletRefundStrategy.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletRefundStrategy.java index b18ca8004..d82a082f4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WalletRefundStrategy.java @@ -24,7 +24,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class WalletPayRefundStrategy extends AbsRefundStrategy { +public class WalletRefundStrategy extends AbsRefundStrategy { private final WalletPayService walletPayService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatPayRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatRefundStrategy.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatPayRefundStrategy.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatRefundStrategy.java index 0fcbe3fd1..3bef73d10 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatPayRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/strategy/WeChatRefundStrategy.java @@ -25,7 +25,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class WeChatPayRefundStrategy extends AbsRefundStrategy { +public class WeChatRefundStrategy extends AbsRefundStrategy { private final WeChatPayConfigService weChatPayConfigService; 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 a9baf63e9..5e086cbff 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 @@ -12,10 +12,11 @@ import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderQueryService; import cn.bootx.platform.daxpay.service.core.order.pay.service.PayOrderService; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundChannelOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundChannelOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; +import cn.bootx.platform.daxpay.service.core.payment.notice.service.ClientNoticeService; import cn.bootx.platform.daxpay.service.core.payment.repair.factory.RefundRepairStrategyFactory; import cn.bootx.platform.daxpay.service.core.payment.repair.result.RefundRepairResult; import cn.bootx.platform.daxpay.service.core.record.repair.entity.PayRepairRecord; @@ -45,11 +46,13 @@ public class RefundRepairService { private final PayOrderQueryService payOrderQueryService; + private final ClientNoticeService clientNoticeService; + private final PayChannelOrderManager payChannelOrderManager; - private final PayRefundOrderManager refundOrderManager; + private final RefundOrderManager refundOrderManager; - private final PayRefundChannelOrderManager refundChannelOrderManager; + private final RefundChannelOrderManager refundChannelOrderManager; private final PayRepairRecordService recordService; @@ -57,7 +60,7 @@ public class RefundRepairService { * 修复退款单 */ @Transactional(rollbackFor = Exception.class) - public RefundRepairResult repair(PayRefundOrder refundOrder, RefundRepairWayEnum repairType){ + public RefundRepairResult repair(RefundOrder refundOrder, RefundRepairWayEnum repairType){ // 获取关联支付单 PayOrder payOrder = payOrderQueryService.findById(refundOrder.getPaymentId()) @@ -67,17 +70,17 @@ public class RefundRepairService { .stream() .collect(Collectors.toMap(PayChannelOrder::getChannel, Function.identity(), CollectorsFunction::retainLatest)); // 异步通道退款单 - Map refundChannelOrderMap = refundChannelOrderManager.findAllByRefundId(refundOrder.getId()) + Map refundChannelOrderMap = refundChannelOrderManager.findAllByRefundId(refundOrder.getId()) .stream() - .collect(Collectors.toMap(PayRefundChannelOrder::getChannel, Function.identity(), CollectorsFunction::retainLatest)); + .collect(Collectors.toMap(RefundChannelOrder::getChannel, Function.identity(), CollectorsFunction::retainLatest)); // 2 初始化修复参数 List channels = new ArrayList<>(payChannelOrderMap.keySet()); List repairStrategies = RefundRepairStrategyFactory.createAsyncLast(channels); for (AbsRefundRepairStrategy repairStrategy : repairStrategies) { PayChannelOrder payChannelOrder = payChannelOrderMap.get(repairStrategy.getChannel().getCode()); - PayRefundChannelOrder payRefundChannelOrder = refundChannelOrderMap.get(repairStrategy.getChannel().getCode()); - repairStrategy.initRepairParam(refundOrder, payRefundChannelOrder, payOrder, payChannelOrder); + RefundChannelOrder refundChannelOrder = refundChannelOrderMap.get(repairStrategy.getChannel().getCode()); + repairStrategy.initRepairParam(refundOrder, refundChannelOrder, payOrder, payChannelOrder); } // 根据不同的类型执行对应的修复逻辑 @@ -103,7 +106,7 @@ public class RefundRepairService { /** * 退款成功, 更新退款单和支付单 */ - private RefundRepairResult success(PayRefundOrder refundOrder, PayOrder payOrder, List repairStrategies) { + private RefundRepairResult success(RefundOrder refundOrder, PayOrder payOrder, List repairStrategies) { RepairLocal repairInfo = PaymentContextLocal.get().getRepairInfo(); // 订单相关状态 PayStatusEnum beforePayStatus = PayStatusEnum.findByCode(payOrder.getStatus()); @@ -127,7 +130,7 @@ public class RefundRepairService { List payChannelOrders = repairStrategies.stream() .map(AbsRefundRepairStrategy::getPayChannelOrder) .collect(Collectors.toList()); - List refundChannelOrders = repairStrategies + List refundChannelOrders = repairStrategies .stream() .map(AbsRefundRepairStrategy::getRefundChannelOrder) .collect(Collectors.toList()); @@ -138,6 +141,12 @@ public class RefundRepairService { payChannelOrderManager.updateAllById(payChannelOrders); refundChannelOrderManager.updateAllById(refundChannelOrders); + // 发送通知 + List list = Arrays.asList(PayStatusEnum.REFUNDING.getCode(), PayStatusEnum.REFUNDED.getCode()); + if (list.contains(payOrder.getStatus())){ + clientNoticeService.registerRefundNotice(refundOrder, null, refundChannelOrders); + } + return new RefundRepairResult() .setBeforePayStatus(beforePayStatus) .setAfterPayStatus(afterPayRefundStatus) @@ -149,7 +158,7 @@ public class RefundRepairService { /** * 退款失败, 关闭退款单并将失败的退款金额归还回订单 */ - private RefundRepairResult close(PayRefundOrder refundOrder, PayOrder payOrder, List repairStrategies) { + private RefundRepairResult close(RefundOrder refundOrder, PayOrder payOrder, List repairStrategies) { // 要返回的状态 RefundRepairResult repairResult = new RefundRepairResult(); @@ -182,7 +191,7 @@ public class RefundRepairService { List payChannelOrders = repairStrategies.stream() .map(AbsRefundRepairStrategy::getPayChannelOrder) .collect(Collectors.toList()); - List refundChannelOrders = repairStrategies + List refundChannelOrders = repairStrategies .stream() .map(AbsRefundRepairStrategy::getRefundChannelOrder) .collect(Collectors.toList()); @@ -224,7 +233,7 @@ public class RefundRepairService { * 退款订单的修复记录 * 退款中 -> 退款成功 */ - private PayRepairRecord refundRepairRecord(PayRefundOrder refundOrder, RefundRepairWayEnum repairType, RefundRepairResult repairResult){ + private PayRepairRecord refundRepairRecord(RefundOrder refundOrder, RefundRepairWayEnum repairType, RefundRepairResult repairResult){ // 修复后的状态 String afterStatus = Optional.ofNullable(repairResult.getAfterRefundStatus()).map(RefundStatusEnum::getCode).orElse(null); // 修复发起来源 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/refund/WalletRefundRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/refund/WalletRefundRepairStrategy.java index 051871715..d2e45f8f7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/refund/WalletRefundRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/refund/WalletRefundRepairStrategy.java @@ -9,7 +9,7 @@ import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPaySer import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletQueryService; import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletRecordService; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder; import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; @@ -65,7 +65,7 @@ public class WalletRefundRepairStrategy extends AbsRefundRepairStrategy { @Override public void doSuccessHandler() { PayChannelOrder payChannelOrder = this.getPayChannelOrder(); - PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder(); + RefundChannelOrder refundChannelOrder = this.getRefundChannelOrder(); // 判断是全部退款还是部分退款 if (Objects.equals(payChannelOrder.getRefundableBalance(), 0)){ //全部退款 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/RefundSyncService.java similarity index 94% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PayRefundSyncService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/RefundSyncService.java index 0df3338d4..08fbe6c8a 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/RefundSyncService.java @@ -12,8 +12,8 @@ import cn.bootx.platform.daxpay.service.code.PaymentTypeEnum; import cn.bootx.platform.daxpay.service.code.RefundRepairWayEnum; import cn.bootx.platform.daxpay.service.common.context.RepairLocal; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.service.core.order.refund.dao.PayRefundOrderManager; -import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundOrder; +import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager; +import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder; import cn.bootx.platform.daxpay.service.core.payment.repair.result.RefundRepairResult; import cn.bootx.platform.daxpay.service.core.payment.repair.service.RefundRepairService; import cn.bootx.platform.daxpay.service.core.payment.sync.factory.RefundSyncStrategyFactory; @@ -39,8 +39,8 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class PayRefundSyncService { - private final PayRefundOrderManager refundOrderManager; +public class RefundSyncService { + private final RefundOrderManager refundOrderManager; private final PaySyncRecordService paySyncRecordService; @@ -54,7 +54,7 @@ public class PayRefundSyncService { @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public SyncResult sync(RefundSyncParam param){ // 先获取退款单 - PayRefundOrder refundOrder; + RefundOrder refundOrder; if (Objects.nonNull(param.getRefundId())){ refundOrder = refundOrderManager.findById(param.getRefundId()) .orElseThrow(() -> new PayFailureException("未查询到退款订单")); @@ -77,7 +77,7 @@ public class PayRefundSyncService { * 退款订单信息同步 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public SyncResult syncRefundOrder(PayRefundOrder refundOrder) { + public SyncResult syncRefundOrder(RefundOrder refundOrder) { // 加锁 LockInfo lock = lockTemplate.lock("sync:refund:" + refundOrder.getId(),10000,200); if (Objects.isNull(lock)) { @@ -140,7 +140,7 @@ public class PayRefundSyncService { * @see RefundSyncStatusEnum 同步返回类型 * @see RefundStatusEnum 退款单状态 */ - private boolean checkSyncStatus(RefundGatewaySyncResult syncResult, PayRefundOrder order){ + private boolean checkSyncStatus(RefundGatewaySyncResult syncResult, RefundOrder order){ RefundSyncStatusEnum syncStatus = syncResult.getSyncStatus(); String orderStatus = order.getStatus(); // 退款完成 @@ -165,7 +165,7 @@ public class PayRefundSyncService { /** * 进行退款订单和支付订单的补偿 */ - private RefundRepairResult repairHandler(RefundGatewaySyncResult syncResult, PayRefundOrder order){ + private RefundRepairResult repairHandler(RefundGatewaySyncResult syncResult, RefundOrder order){ RefundSyncStatusEnum syncStatusEnum = syncResult.getSyncStatus(); RefundRepairResult repair = new RefundRepairResult(); // 对支付网关同步的结果进行处理 @@ -197,7 +197,7 @@ public class PayRefundSyncService { * @param repairOrderNo 修复号 * @param errorMsg 错误信息 */ - private void saveRecord(PayRefundOrder refundOrder, RefundGatewaySyncResult syncResult, boolean repair, String repairOrderNo, String errorMsg){ + private void saveRecord(RefundOrder refundOrder, RefundGatewaySyncResult syncResult, boolean repair, String repairOrderNo, String errorMsg){ PaySyncRecord paySyncRecord = new PaySyncRecord() .setOrderId(refundOrder.getId()) .setOrderNo(refundOrder.getRefundNo()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PayApiConfig.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PayApiConfig.java index 7f7c4b469..e22e7a24e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PayApiConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PayApiConfig.java @@ -52,11 +52,7 @@ public class PayApiConfig extends MpBaseEntity implements EntityBaseFunction