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

使用node-fetch创建Stripe产品时default_price_data与type参数冲突报错求助

解决Stripe创建产品时的"default_price_data, type"冲突及嵌套参数处理问题

错误原因分析

  1. 参数冲突:当传入default_price_data时,Stripe会自动根据价格属性推断产品的type(服务类为service,实物类为good),此时手动指定type会触发参数冲突报错。
  2. 请求体格式错误:使用application/x-www-form-urlencoded格式时,URLSearchParams(Object.entries(data))无法正确解析嵌套对象(比如default_price_data),导致Stripe无法识别参数结构。

解决方案

1. 移除冲突的type参数

修改请求体,删掉type字段,让Stripe自动推断产品类型:

{
  "name": "product",
  "active": true,
  "default_price_data": {
    "currency": "eur",
    "unit_amount": 1 // 注意:unit_amount是最小货币单位的整数,这里1代表0.01欧元
  },
  "description": "myprod"
}

2. 改用JSON格式请求体(推荐)

Stripe API支持application/json格式请求,这种格式可直接处理嵌套对象,无需额外转换。修改代码如下:

async createProduct(data) {
  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.STRIPE_SECRET_KEY}`,
        'Content-Type': 'application/json' // 切换为JSON请求头
      },
      body: JSON.stringify(data) // 直接序列化JSON对象
    }).then(res => res.json());
    return { data: response };
  } catch (err) {
    return { error: err.message };
  }
}

3. 若坚持使用表单格式的处理方法

如果必须用application/x-www-form-urlencoded,需要把嵌套对象转换为Stripe要求的扁平键值对格式(比如default_price_data[currency]),可以用工具函数处理:

// 嵌套对象转扁平表单键值对的工具函数
function flattenStripeParams(obj, parentKey = '') {
  let params = {};
  for (const [key, value] of Object.entries(obj)) {
    const fullKey = parentKey ? `${parentKey}[${key}]` : key;
    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
      Object.assign(params, flattenStripeParams(value, fullKey));
    } else {
      params[fullKey] = value;
    }
  }
  return params;
}

// 修改createProduct函数里的body部分
async createProduct(data) {
  try {
    const flatParams = flattenStripeParams(data);
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.STRIPE_SECRET_KEY}`,
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: new URLSearchParams(flatParams).toString()
    }).then(res => res.json());
    return { data: response };
  } catch (err) {
    return { error: err.message };
  }
}

后续同类嵌套参数处理建议

  • 优先使用application/json格式请求体,这是最简洁不易出错的方式,直接传递JSON对象即可,Stripe能完美解析嵌套结构。
  • 如果必须使用表单格式,一定要用工具函数把嵌套对象转换为parent[key]形式的扁平键值对,避免手动拼接出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:04:57