You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stripe订阅创建异常:无报错但仪表盘无显示,API返回参数错误

Stripe订阅创建错误排查与修复

问题描述

我尝试在Stripe上为已配置价格的商品创建订阅,分别采用直接调用Price对象和新建价格对象两种方式,结果一致:初始调用时无报错,但Stripe仪表盘完全看不到订阅记录。后续调用API返回了明确错误,相关代码、请求体及错误响应如下。

现有代码(创建订阅的fetch请求)

async createSubscription(data) {
      try {
        const params = new URLSearchParams();
        params.append('customer', data.customer);
        params.append('cancel_at_period_end', data.cancel_at_period_end.toString());
        params.append('currency', data.currency);
        params.append('description', data.description);
        params.append('items[0][price_data][currency]',  data.items[0].price_data.currency);
        params.append('items[0][price_data][product]',   data.items[0].price_data.product);
        params.append('items[0][price_data][recurring]', data.items[0].price_data.recurring.interval);
        params.append('items[0][price_data][unit_amount]', data.items[0].price_data.unit_amount);


        const response = await fetch(url, {
          method: 'POST',
          headers: {
              'Authorization': `Bearer ${process.env.STRIPE_SECRET_KEY}`,
              'Content-Type': 'application/x-www-form-urlencoded'
          },
        
        body: params});
       
        return {data: response};
      } catch (err) {
        return {error: err.message };
      }
    }

JSON请求体

{
    "customer": "cus_QjVBjHwGQiiHie",
    "cancel_at_period_end": false,
    "currency": "eur",
    "description": "my test subscription",

    "items": [
        {
            "price_data": {
                "currency": "eur",
                "product": "prod_Ql0OtnWNPRhvlh",
                
                "recurring": {
                    "interval": "month"
                },
                "unit_amount": 1000
            }
        }
    ]
}

API返回错误响应

{
    "data": {
        "error": {
            "message": "Invalid object",
            "param": "items[0][price_data][recurring]",
            "request_log_url": "https://dashboard.stripe.com/test/logs/req_VuvYP2QECpJRyD?t=1725541424",
            "type": "invalid_request_error"
        }
    }
}

错误原因分析

  1. 参数格式错误:recurring是嵌套对象(需包含interval字段),但代码中直接将interval的值(month)赋值给items[0][price_data][recurring],Stripe API期望的是recurring[interval]的嵌套参数结构,而非单一字符串。
  2. 冗余参数:订阅创建接口无需单独传递currency,因为price_data内已包含该字段,冗余参数可能引发冲突。
  3. 响应未解析:原代码直接返回response对象,未解析响应体,导致无法判断请求实际状态——之前“无报错但无订阅”的情况,大概率是请求已失败但代码未捕获到错误信息。

修复方案

1. 修正参数传递格式

将recurring的参数拼接改为嵌套格式:

// 替换原错误行
params.append('items[0][price_data][recurring][interval]', data.items[0].price_data.recurring.interval);

2. 移除冗余参数

删除params.append('currency', data.currency);这一行。

3. 解析API响应体

添加响应体解析逻辑,确保能获取到API返回的具体数据或错误:

const response = await fetch(url, { /* ...原有配置... */ });
// 新增解析步骤
const result = await response.json();
return { data: result };

修复后的完整代码

async createSubscription(data) {
  try {
    const params = new URLSearchParams();
    params.append('customer', data.customer);
    params.append('cancel_at_period_end', data.cancel_at_period_end.toString());
    params.append('description', data.description);
    params.append('items[0][price_data][currency]', data.items[0].price_data.currency);
    params.append('items[0][price_data][product]', data.items[0].price_data.product);
    // 修正recurring参数传递
    params.append('items[0][price_data][recurring][interval]', data.items[0].price_data.recurring.interval);
    params.append('items[0][price_data][unit_amount]', data.items[0].price_data.unit_amount);

    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.STRIPE_SECRET_KEY}`,
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: params
    });

    // 解析响应JSON
    const result = await response.json();
    return { data: result };
  } catch (err) {
    return { error: err.message };
  }
}

额外提示:直接使用已存在的Price对象

如果商品已配置好Price,无需构建price_data,直接传递Price ID即可,代码更简洁:

// 替换price_data相关的所有append行
params.append('items[0][price]', '你的Price ID'); // 例如price_xxx

内容的提问来源于stack exchange,提问作者Fabx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:05:23