From 67e0840695707cf7d097533e721dd28f9e0c6a6e Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 31 Mar 2026 15:26:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=92=B1=E5=8C=85?= =?UTF-8?q?=E5=85=85=E5=80=BC=E4=B8=8D=E6=94=AF=E6=8C=81=20wechat=5Fv2=20?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=B8=A0=E9=81=93=E5=AF=BC=E8=87=B4=201046?= =?UTF-8?q?=20=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当前激活的微信支付配置 provider_type = wechat_v2,但 CreateRecharge 硬编码使用 V3(PowerWeChat)路径,导致初始化失败。 新增 createJSAPIPayOrder 方法,根据 provider_type 路由到对应通道: - wechat_v2 → NewPaymentV2ServiceFromConfig - wechat(默认)→ NewPaymentAppFromConfig(V3) 与 client_order.Service.newPaymentProvider 保持相同的路由逻辑。 --- internal/handler/app/client_wallet.go | 37 ++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/internal/handler/app/client_wallet.go b/internal/handler/app/client_wallet.go index ed12acd..b2e96c6 100644 --- a/internal/handler/app/client_wallet.go +++ b/internal/handler/app/client_wallet.go @@ -288,14 +288,10 @@ func (h *ClientWalletHandler) CreateRecharge(c *fiber.Ctx) error { // 先初始化微信支付实例并创建预支付订单,确认支付通道可用 // 避免先写入充值记录后支付初始化失败,导致产生孤儿记录 - 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( + payResult, err := h.createJSAPIPayOrder( resolved.SkipPermissionCtx, + config, + appID, rechargeNo, "资产钱包充值", openID, @@ -585,6 +581,33 @@ func pickAppIDByType(config *model.WechatConfig, appType string) (string, error) } } +// createJSAPIPayOrder 根据支付配置的提供者类型路由到对应支付通道,发起 JSAPI 预下单。 +// 与 client_order.Service.newPaymentProvider 保持相同的路由逻辑,支持 wechat_v2 和 wechat(v3)。 +func (h *ClientWalletHandler) createJSAPIPayOrder( + ctx context.Context, + config *model.WechatConfig, + appID, orderNo, description, openID string, + amount int, +) (*wechat.JSAPIPayResult, error) { + switch config.ProviderType { + case model.ProviderTypeWechatV2: + // 微信 v2:仅需 APIv2Key,无需证书序列号 + svc, err := wechat.NewPaymentV2ServiceFromConfig(config, appID, h.logger) + if err != nil { + return nil, errors.Wrap(errors.CodeWechatPayFailed, err, "初始化微信 v2 支付实例失败") + } + return svc.CreateJSAPIOrder(ctx, orderNo, description, openID, amount) + default: + // 微信 v3(PowerWeChat):需要证书序列号和 API v3 Key + cache := wechat.NewRedisCache(h.redis) + paymentApp, err := wechat.NewPaymentAppFromConfig(config, appID, cache, h.logger) + if err != nil { + return nil, errors.Wrap(errors.CodeWechatPayFailed, err, "初始化微信支付实例失败") + } + return wechat.NewPaymentService(paymentApp, h.logger).CreateJSAPIOrder(ctx, orderNo, description, openID, amount) + } +} + func generateClientRechargeNo() string { timestamp := time.Now().Format("20060102150405") randomNum := rand.Intn(1000000)