diff --git a/internal/service/refund/approval_decision.go b/internal/service/refund/approval_decision.go index 9dbd486d..5fe9fdef 100644 --- a/internal/service/refund/approval_decision.go +++ b/internal/service/refund/approval_decision.go @@ -113,9 +113,6 @@ func (s *Service) applyApprovedDecision(ctx context.Context, event approvalapp.T if err := validateApprovedRefundAmount(approvedAmount, refund.RequestedRefundAmount, &order); err != nil { return err } - if err := s.preparePaymentRefundCredentials(ctx, tx, order.ID); err != nil { - return err - } // 原路退款只登记待执行事实:退款单转入原路处理中,订单在渠道明确成功前保持已支付。 // 客户收款信息与退回原钱包在审批通过时即完成,订单同时置为已退款。 originalRoute := refund.Method == constants.RefundMethodOriginalRoute @@ -163,6 +160,10 @@ func (s *Service) applyApprovedDecision(ctx context.Context, event approvalapp.T if order.PaymentStatus != model.PaymentStatusPaid && order.PaymentStatus != model.PaymentStatusRefunded { return errors.New(errors.CodeInvalidStatus, "订单状态不允许原路退款") } + // 收款商户凭证只约束原路退款;客户收款信息与钱包退款不经渠道,不受其完整性影响。 + if err := s.preparePaymentRefundCredentials(ctx, tx, order.ID); err != nil { + return err + } if err := s.prepareChannelRefundInTx(ctx, tx, &refund, attempt); err != nil { return err } diff --git a/internal/service/refund/payment_merchant.go b/internal/service/refund/payment_merchant.go index ff2f7ef6..67c61117 100644 --- a/internal/service/refund/payment_merchant.go +++ b/internal/service/refund/payment_merchant.go @@ -19,6 +19,9 @@ func (s *Service) SetPaymentMerchantRuntime(runtime *merchantpayment.RuntimeLoad // preparePaymentRefundCredentials 在企微通过事务内装载并校验原路退款所需凭证。 // +// 仅退款方式为原路退款时调用:线上支付订单也可选客户收款信息退款(如商户号余额不足), +// 该方式不经渠道,不能因收款商户凭证不完整被阻断。 +// // 钱包支付和线下支付没有收款商户凭证,直接放行。merchant_id 为空仅表示留存期内的历史 // 线上支付,仍按 payment_config_id 读取兼容配置;绝不能按当前商户池推断历史商户。 func (s *Service) preparePaymentRefundCredentials(ctx context.Context, tx *gorm.DB, orderID uint) error { diff --git a/internal/service/refund/service.go b/internal/service/refund/service.go index b98970a4..789906bc 100644 --- a/internal/service/refund/service.go +++ b/internal/service/refund/service.go @@ -449,8 +449,10 @@ func (s *Service) Approve(ctx context.Context, id uint, req *dto.ApproveRefundRe if orderResult.RowsAffected == 0 { return errors.New(errors.CodeInvalidStatus, "订单状态已变更,无法执行退款审批") } - if err := s.preparePaymentRefundCredentials(ctx, tx, order.ID); err != nil { - return err + if refund.Method == constants.RefundMethodOriginalRoute { + if err := s.preparePaymentRefundCredentials(ctx, tx, order.ID); err != nil { + return err + } } if err := s.refundWalletPayment(ctx, tx, refund, order, approvedAmount, userID); err != nil {