f
This commit is contained in:
@@ -81,13 +81,12 @@ func (l *AdminRefundOrderLogic) handleAlipayRefund(order *model.Order, req *type
|
|||||||
if order.PayTime.Valid {
|
if order.PayTime.Valid {
|
||||||
orderPayTime = &order.PayTime.Time
|
orderPayTime = &order.PayTime.Time
|
||||||
}
|
}
|
||||||
refundResp, err := l.svcCtx.AlipayService.AliRefund(l.ctx, order.OrderNo, req.RefundAmount, orderPayTime)
|
refundNo := l.generateRefundNo(order.OrderNo)
|
||||||
|
refundResp, err := l.svcCtx.AlipayService.AliRefund(l.ctx, order.OrderNo, req.RefundAmount, orderPayTime, refundNo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 支付宝退款失败 err: %v", err)
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 支付宝退款失败 err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
refundNo := l.generateRefundNo(order.OrderNo)
|
|
||||||
|
|
||||||
if refundResp.IsSuccess() {
|
if refundResp.IsSuccess() {
|
||||||
// 支付宝退款成功,创建成功记录
|
// 支付宝退款成功,创建成功记录
|
||||||
err = l.createRefundRecordAndUpdateOrder(order, req, refundNo, refundResp.TradeNo, model.OrderStatusRefunded, model.OrderRefundStatusSuccess)
|
err = l.createRefundRecordAndUpdateOrder(order, req, refundNo, refundResp.TradeNo, model.OrderStatusRefunded, model.OrderRefundStatusSuccess)
|
||||||
@@ -188,9 +187,9 @@ func (l *AdminRefundOrderLogic) createRefundRecordOnly(order *model.Order, req *
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// generateRefundNo 生成退款单号
|
// generateRefundNo 生成退款单号(同一订单多次退款需唯一,避免 unique_refund_no 冲突)
|
||||||
func (l *AdminRefundOrderLogic) generateRefundNo(orderNo string) string {
|
func (l *AdminRefundOrderLogic) generateRefundNo(orderNo string) string {
|
||||||
return fmt.Sprintf("%s%s", RefundNoPrefix, orderNo)
|
return fmt.Sprintf("%s%s-%d", RefundNoPrefix, orderNo, time.Now().UnixMilli())
|
||||||
}
|
}
|
||||||
|
|
||||||
// createNullString 创建 sql.NullString
|
// createNullString 创建 sql.NullString
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ func (l *AlipayCallbackLogic) handleRefund(order *model.AgentMembershipRechargeO
|
|||||||
} else {
|
} else {
|
||||||
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
|
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
|
||||||
orderPayTime := order.CreateTime
|
orderPayTime := order.CreateTime
|
||||||
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime)
|
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime, "")
|
||||||
if refundErr != nil {
|
if refundErr != nil {
|
||||||
return refundErr
|
return refundErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ func (l *WechatPayCallbackLogic) handleRefund(order *model.AgentMembershipRechar
|
|||||||
} else {
|
} else {
|
||||||
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
|
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
|
||||||
orderPayTime := order.CreateTime
|
orderPayTime := order.CreateTime
|
||||||
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime)
|
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime, "")
|
||||||
if refundErr != nil {
|
if refundErr != nil {
|
||||||
return refundErr
|
return refundErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error
|
|||||||
if order.PayTime.Valid {
|
if order.PayTime.Valid {
|
||||||
orderPayTime = &order.PayTime.Time
|
orderPayTime = &order.PayTime.Time
|
||||||
}
|
}
|
||||||
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, orderPayTime)
|
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, orderPayTime, "")
|
||||||
if refundErr != nil {
|
if refundErr != nil {
|
||||||
logx.Error(refundErr)
|
logx.Error(refundErr)
|
||||||
return asynq.SkipRetry
|
return asynq.SkipRetry
|
||||||
|
|||||||
@@ -144,17 +144,21 @@ func (a *AliPayService) CreateAlipayOrder(ctx context.Context, amount float64, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AliRefund 发起支付宝退款。orderPayTime 为订单支付时间(或创建时间);仅当落在 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内时使用 bak 商户号,否则使用正式商户号;传 nil 则使用正式商户号。
|
// AliRefund 发起支付宝退款。orderPayTime 为订单支付时间(或创建时间);仅当落在 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内时使用 bak 商户号,否则使用正式商户号;传 nil 则使用正式商户号。
|
||||||
func (a *AliPayService) AliRefund(ctx context.Context, outTradeNo string, refundAmount float64, orderPayTime *time.Time) (*alipay.TradeRefundRsp, error) {
|
// outRequestNo 为商户退款请求号,同一笔退款需唯一;传空则使用 "refund-"+outTradeNo,重试时建议传入唯一号避免支付宝报重复。
|
||||||
|
func (a *AliPayService) AliRefund(ctx context.Context, outTradeNo string, refundAmount float64, orderPayTime *time.Time, outRequestNo string) (*alipay.TradeRefundRsp, error) {
|
||||||
client := a.AlipayClient
|
client := a.AlipayClient
|
||||||
if orderPayTime != nil && a.AlipayClientBak != nil &&
|
if orderPayTime != nil && a.AlipayClientBak != nil &&
|
||||||
!orderPayTime.Before(AlipayBakRefundStart) && orderPayTime.Before(AlipayBakRefundEnd) {
|
!orderPayTime.Before(AlipayBakRefundStart) && orderPayTime.Before(AlipayBakRefundEnd) {
|
||||||
client = a.AlipayClientBak
|
client = a.AlipayClientBak
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if outRequestNo == "" {
|
||||||
|
outRequestNo = fmt.Sprintf("refund-%s", outTradeNo)
|
||||||
|
}
|
||||||
refund := alipay.TradeRefund{
|
refund := alipay.TradeRefund{
|
||||||
OutTradeNo: outTradeNo,
|
OutTradeNo: outTradeNo,
|
||||||
RefundAmount: lzUtils.ToAlipayAmount(refundAmount),
|
RefundAmount: lzUtils.ToAlipayAmount(refundAmount),
|
||||||
OutRequestNo: fmt.Sprintf("refund-%s", outTradeNo),
|
OutRequestNo: outRequestNo,
|
||||||
}
|
}
|
||||||
|
|
||||||
refundResp, err := client.TradeRefund(ctx, refund)
|
refundResp, err := client.TradeRefund(ctx, refund)
|
||||||
|
|||||||
Reference in New Issue
Block a user