diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index b4178f61..baed6563 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -17,6 +17,7 @@ - fix: 修复微信退款同步时, 错误信息未保存问题 - fix: 修复手动发起退款时上下文未进行初始化的问题 - fix: 修复简单退款选择全部退款时报错问题 +- fix: 修复退款时未检验退款金额问题,导致可以退款余额可以大于可退余额 ## [v2.0.0] - 支持支付宝支付: 扫码支付、付款码支付、PC支付、H5支付 diff --git a/daxpay-single-sdk/src/test/java/cn/bootx/platform/daxpay/sdk/payment/SimpleRefundOrderTest.java b/daxpay-single-sdk/src/test/java/cn/bootx/platform/daxpay/sdk/payment/SimpleRefundOrderTest.java index d4f3acf2..e5b5f03b 100644 --- a/daxpay-single-sdk/src/test/java/cn/bootx/platform/daxpay/sdk/payment/SimpleRefundOrderTest.java +++ b/daxpay-single-sdk/src/test/java/cn/bootx/platform/daxpay/sdk/payment/SimpleRefundOrderTest.java @@ -37,7 +37,7 @@ public class SimpleRefundOrderTest { public void refundAllOrder(){ SimpleRefundParam param = new SimpleRefundParam(); param.setClientIp("127.0.0.1"); - param.setPaymentId(1762014603543281664L); + param.setPaymentId(1762025452118953984L); param.setRefundNo("R" + RandomUtil.randomNumbers(5)); param.setRefundAll(true); DaxPayResult execute = DaxPayKit.execute(param); @@ -53,11 +53,11 @@ public class SimpleRefundOrderTest { SimpleRefundParam param = new SimpleRefundParam(); param.setClientIp("127.0.0.1"); - param.setPaymentId(1762018229581910016L); + param.setPaymentId(1762025452118953984L); param.setRefundAll(false); param.setRefundNo("R" + RandomUtil.randomNumbers(5)); // 设置具体的退款参数 - param.setAmount(1); + param.setAmount(19); DaxPayResult execute = DaxPayKit.execute(param); System.out.println(execute); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java index cce655f0..fe6280f3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundAssistService.java @@ -120,6 +120,7 @@ public class RefundAssistService { List tradesStatus = Arrays.asList( PayStatusEnum.PROGRESS.getCode(), PayStatusEnum.CLOSE.getCode(), + PayStatusEnum.REFUNDED.getCode(), PayStatusEnum.REFUNDING.getCode(), PayStatusEnum.FAIL.getCode()); if (tradesStatus.contains(payOrder.getStatus())) { @@ -128,12 +129,14 @@ public class RefundAssistService { } // 过滤掉金额为空和0的退款参数 - List channelParams = param.getRefundChannels() - .stream() - .filter(r -> Objects.nonNull(r.getAmount())) - .filter(r -> r.getAmount() > 0) - .collect(Collectors.toList()); - param.setRefundChannels(channelParams); + if (!param.isRefundAll()) { + List channelParams = param.getRefundChannels() + .stream() + .filter(r -> Objects.nonNull(r.getAmount())) + .filter(r -> r.getAmount() > 0) + .collect(Collectors.toList()); + param.setRefundChannels(channelParams); + } // 退款号唯一校验 if (StrUtil.isNotBlank(param.getRefundNo()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java index 0f963683..5178a95a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/RefundService.java @@ -101,7 +101,7 @@ public class RefundService { .stream() .map(o -> new RefundChannelParam() .setChannel(o.getChannel()) - .setAmount(o.getAmount())) + .setAmount(o.getRefundableBalance())) .collect(Collectors.toList()); param.setRefundChannels(channelParams); } else if (simple) { @@ -154,13 +154,16 @@ public class RefundService { refundStrategy.initRefundParam(payOrder, refundParam, payChannelOrder); } - // 生成通道退款订单对象 + // 2.1 退款前校验操作 + payRefundStrategies.forEach(AbsRefundStrategy::doBeforeCheckHandler); + + // 2.2 生成通道退款订单对象 payRefundStrategies.forEach(AbsRefundStrategy::generateChannelOrder); - // 退款操作的预处理, 使用独立的新事物进行发起, 返回创建成功的退款订单, 成功后才可以进行下一阶段的操作 + // 2.3 退款操作的预处理, 使用独立的新事物进行发起, 返回创建成功的退款订单, 成功后才可以进行下一阶段的操作 RefundOrder refundOrder = SpringUtil.getBean(this.getClass()).preRefundMethod(refundParam, payOrder, payRefundStrategies); - // 设置退款订单对象 + // 2.4 设置退款订单对象 payRefundStrategies.forEach(r->r.setRefundOrder(refundOrder)); try { @@ -168,7 +171,7 @@ public class RefundService { payRefundStrategies.forEach(AbsRefundStrategy::doBeforeRefundHandler); // 3.2 执行退款策略 payRefundStrategies.forEach(AbsRefundStrategy::doRefundHandler); - // 3.4 执行退款发起成功后操作 + // 3.3 执行退款发起成功后操作 payRefundStrategies.forEach(AbsRefundStrategy::doSuccessHandler); // 4.进行成功处理, 分别处理退款订单, 通道退款订单, 支付订单 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsRefundStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsRefundStrategy.java index aab8f612..b0906746 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsRefundStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsRefundStrategy.java @@ -1,7 +1,8 @@ package cn.bootx.platform.daxpay.service.func; -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.core.order.pay.entity.PayChannelOrder; @@ -62,9 +63,20 @@ public abstract class AbsRefundStrategy implements PayStrategy{ } /** - * 退款前对处理 + * 退款前对退款数据校验 */ - public void doBeforeRefundHandler() {} + public void doBeforeCheckHandler() { + // 退款金额不可以大于可退余额 + if (this.getRefundChannelParam().getAmount() > this.getPayChannelOrder().getRefundableBalance()) { + throw new PayFailureException("["+ this.getChannel().getName() +"]退款金额大于可退余额"); + } + } + + /** + * 退款前对处理, 主要进行配置的加载和检查 + */ + public void doBeforeRefundHandler() { + } /** * 退款操作