fix: 修复钱包充值不支持 wechat_v2 支付渠道导致 1046 报错
当前激活的微信支付配置 provider_type = wechat_v2,但 CreateRecharge 硬编码使用 V3(PowerWeChat)路径,导致初始化失败。 新增 createJSAPIPayOrder 方法,根据 provider_type 路由到对应通道: - wechat_v2 → NewPaymentV2ServiceFromConfig - wechat(默认)→ NewPaymentAppFromConfig(V3) 与 client_order.Service.newPaymentProvider 保持相同的路由逻辑。
This commit is contained in:
@@ -288,14 +288,10 @@ func (h *ClientWalletHandler) CreateRecharge(c *fiber.Ctx) error {
|
|||||||
|
|
||||||
// 先初始化微信支付实例并创建预支付订单,确认支付通道可用
|
// 先初始化微信支付实例并创建预支付订单,确认支付通道可用
|
||||||
// 避免先写入充值记录后支付初始化失败,导致产生孤儿记录
|
// 避免先写入充值记录后支付初始化失败,导致产生孤儿记录
|
||||||
cache := wechat.NewRedisCache(h.redis)
|
payResult, err := h.createJSAPIPayOrder(
|
||||||
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,
|
resolved.SkipPermissionCtx,
|
||||||
|
config,
|
||||||
|
appID,
|
||||||
rechargeNo,
|
rechargeNo,
|
||||||
"资产钱包充值",
|
"资产钱包充值",
|
||||||
openID,
|
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 {
|
func generateClientRechargeNo() string {
|
||||||
timestamp := time.Now().Format("20060102150405")
|
timestamp := time.Now().Format("20060102150405")
|
||||||
randomNum := rand.Intn(1000000)
|
randomNum := rand.Intn(1000000)
|
||||||
|
|||||||
Reference in New Issue
Block a user