This commit is contained in:
2026-02-06 14:05:53 +08:00
parent dc4fcbf857
commit 33a8baefb7
6 changed files with 15 additions and 11 deletions

View File

@@ -53,7 +53,7 @@ type AlipayConfig struct {
AppCertPath string // 应用公钥证书路径
AlipayCertPath string // 支付宝公钥证书路径
AlipayRootCertPath string // 根证书路径
// Bak 仅用于 2026-02-02 18:26 之前的订单退款
// Bak 仅用于 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单退款
AppIDBak string
PrivateKeyBak string
AlipayPublicKeyBak string

View File

@@ -75,7 +75,7 @@ func (l *AdminRefundOrderLogic) getAndValidateOrder(orderId int64, refundAmount
return order, nil
}
// handleAlipayRefund 处理支付宝退款2026-02-02 18:26 前的订单走 bak 商户号)
// handleAlipayRefund 处理支付宝退款(仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号)
func (l *AdminRefundOrderLogic) handleAlipayRefund(order *model.Order, req *types.AdminRefundOrderReq) (*types.AdminRefundOrderResp, error) {
orderPayTime := &order.CreateTime
if order.PayTime.Valid {

View File

@@ -218,7 +218,7 @@ func (l *AlipayCallbackLogic) handleRefund(order *model.AgentMembershipRechargeO
return refundErr
}
} else {
// 代理会员订单以创建时间为准2026-02-02 18:26 前的订单走 bak 商户号
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
orderPayTime := order.CreateTime
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime)
if refundErr != nil {

View File

@@ -221,7 +221,7 @@ func (l *WechatPayCallbackLogic) handleRefund(order *model.AgentMembershipRechar
return refundErr
}
} else {
// 代理会员订单以创建时间为准2026-02-02 18:26 前的订单走 bak 商户号
// 代理会员订单以创建时间为准,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
orderPayTime := order.CreateTime
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount, &orderPayTime)
if refundErr != nil {

View File

@@ -266,7 +266,7 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error
logx.Infof("已发起微信退款申请, orderID: %d, amount: %f", order.Id, order.Amount)
return asynq.SkipRetry
} else {
// 支付宝退款为同步结果2026-02-02 18:26 前的订单走 bak 商户号
// 支付宝退款为同步结果,仅 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单走 bak 商户号
orderPayTime := &order.CreateTime
if order.PayTime.Valid {
orderPayTime = &order.PayTime.Time

View File

@@ -16,13 +16,16 @@ import (
"github.com/smartwalle/alipay/v3"
)
// AlipayBakRefundCutoff bak 支付宝仅用于该时间点之前的订单退款2026年2月2日 18:26 下午,CST
var AlipayBakRefundCutoff = time.Date(2026, 2, 2, 18, 26, 0, 0, time.FixedZone("CST", 8*3600))
// bak 支付宝仅用于 [AlipayBakRefundStart, AlipayBakRefundEnd) 区间内支付订单退款,区间外使用正式 clientCST
var (
AlipayBakRefundStart = time.Date(2026, 1, 25, 16, 38, 17, 0, time.FixedZone("CST", 8*3600)) // Sun Jan 25 2026 16:38:17 GMT+0800 之前用正式
AlipayBakRefundEnd = time.Date(2026, 2, 2, 18, 26, 0, 0, time.FixedZone("CST", 8*3600)) // 2026-02-02 18:26 之后用正式
)
type AliPayService struct {
config config.AlipayConfig
AlipayClient *alipay.Client
AlipayClientBak *alipay.Client // 仅用于 2026-02-02 18:26订单的退款
AlipayClientBak *alipay.Client // 仅用于 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单的退款
}
// NewAliPayService 是一个构造函数,用于初始化 AliPayService
@@ -53,7 +56,7 @@ func NewAliPayService(c config.Config) *AliPayService {
AlipayClient: client,
}
// 初始化 bak 支付宝客户端(仅用于 2026-02-02 18:26订单的退款)
// 初始化 bak 支付宝客户端(仅用于 [2026-01-25 16:38:17, 2026-02-02 18:26) 区间内订单的退款)
if c.Alipay.AppIDBak != "" && c.Alipay.PrivateKeyBak != "" {
bakClient, err := alipay.New(c.Alipay.AppIDBak, c.Alipay.PrivateKeyBak, c.Alipay.IsProduction)
if err != nil {
@@ -140,10 +143,11 @@ func (a *AliPayService) CreateAlipayOrder(ctx context.Context, amount float64, s
}
}
// AliRefund 发起支付宝退款。orderPayTime 为订单支付时间(或创建时间),若在 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) {
client := a.AlipayClient
if orderPayTime != nil && !orderPayTime.After(AlipayBakRefundCutoff) && a.AlipayClientBak != nil {
if orderPayTime != nil && a.AlipayClientBak != nil &&
!orderPayTime.Before(AlipayBakRefundStart) && orderPayTime.Before(AlipayBakRefundEnd) {
client = a.AlipayClientBak
}