diff --git a/internal/handler/app/client_wallet.go b/internal/handler/app/client_wallet.go index 7676764..ed12acd 100644 --- a/internal/handler/app/client_wallet.go +++ b/internal/handler/app/client_wallet.go @@ -285,6 +285,27 @@ func (h *ClientWalletHandler) CreateRecharge(c *fiber.Ctx) error { } rechargeNo := generateClientRechargeNo() + + // 先初始化微信支付实例并创建预支付订单,确认支付通道可用 + // 避免先写入充值记录后支付初始化失败,导致产生孤儿记录 + cache := wechat.NewRedisCache(h.redis) + paymentApp, err := wechat.NewPaymentAppFromConfig(config, appID, cache, h.logger) + if err != nil { + return errors.Wrap(errors.CodeWechatPayFailed, err, "初始化微信支付实例失败") + } + paymentService := wechat.NewPaymentService(paymentApp, h.logger) + payResult, err := paymentService.CreateJSAPIOrder( + resolved.SkipPermissionCtx, + rechargeNo, + "资产钱包充值", + openID, + int(req.Amount), + ) + if err != nil { + return err + } + + // 支付通道确认可用后,再创建充值记录 recharge := &model.AssetRechargeRecord{ UserID: resolved.CustomerID, AssetWalletID: wallet.ID, @@ -304,23 +325,6 @@ func (h *ClientWalletHandler) CreateRecharge(c *fiber.Ctx) error { return errors.Wrap(errors.CodeDatabaseError, err, "创建充值记录失败") } - cache := wechat.NewRedisCache(h.redis) - paymentApp, err := wechat.NewPaymentAppFromConfig(config, appID, cache, h.logger) - if err != nil { - return errors.Wrap(errors.CodeWechatPayFailed, err, "初始化微信支付实例失败") - } - paymentService := wechat.NewPaymentService(paymentApp, h.logger) - payResult, err := paymentService.CreateJSAPIOrder( - resolved.SkipPermissionCtx, - recharge.RechargeNo, - "资产钱包充值", - openID, - int(req.Amount), - ) - if err != nil { - return err - } - payConfig := buildClientRechargePayConfig(appID, payResult) resp := &dto.ClientRechargeResponse{ Recharge: dto.ClientRechargeResult{