Stripe Checkout会话添加多产品失败,请求技术排查支持
我来帮你排查这个问题,从你提供的错误日志和代码来看,核心问题已经很明确了:Stripe收到的请求中,第二个商品(line_items[1])的quantity值小于1,虽然你代码里硬编码写的是quantity: 1,但实际发送到Stripe的参数出现了异常。下面是具体的排查和解决步骤:
1. 确认实际发送给Stripe的参数
首先在你的后端代码里添加日志,打印出你传给stripe.checkout.sessions.create的完整参数,看看line_items数组里每个商品的quantity是否真的都是1。比如修改代码如下:
app.post('/create-session', async (req, res) => { const YOUR_DOMAIN = 'http://localhost:3000/Home'; const sessionParams = { payment_method_types: ['card'], line_items: [ // 你的6个商品对象保持不变 { price_data: { currency: 'usd', product_data: { name: 'Product1', images: ['https://i.imgur.com/EHyR2nP.png'], }, unit_amount: 1899, }, quantity: 1, }, // ... 剩下5个商品 ], mode: 'payment', success_url: `${YOUR_DOMAIN}?success=true`, cancel_url: `${YOUR_DOMAIN}?canceled=true`, }; // 添加日志打印,确认参数正确性 console.log('实际发送给Stripe的商品列表:', sessionParams.line_items); const session = await stripe.checkout.sessions.create(sessionParams); res.json({ id: session.id }); });
如果日志里显示某个quantity是0、null或者空值,那就要检查代码里有没有其他逻辑(比如中间件、req.body参数覆盖)不小心修改了这个值。
2. 升级stripe-node版本
你当前使用的是stripe-node 8.119.0,这个版本是2021年发布的,属于比较老旧的版本。Stripe的SDK和API会持续更新,旧版本可能存在多商品参数解析、动态价格创建的bug。建议直接升级到最新版本:
npm install stripe@latest
升级后再测试创建会话,很多旧版本的兼容性问题会被直接修复。
3. 尝试使用预创建的Price ID替代动态price_data
你现在是用price_data动态创建商品价格,旧版本SDK在处理多个动态价格时可能出现异常。可以先在Stripe后台创建好这6个商品对应的Price对象,然后在line_items里直接使用price字段:
line_items: [ { price: 'price_xxxxxx1', // 替换为你在Stripe后台创建的第一个商品Price ID quantity: 1, }, { price: 'price_xxxxxx2', // 第二个商品的Price ID quantity: 1, }, // 剩下4个商品同理 ]
这种方式绕开了动态创建价格的逻辑,能排除SDK对动态price_data的处理异常问题。
4. 检查API版本兼容性
旧版本的stripe-node会绑定一个旧的Stripe API版本,而旧API版本对Checkout会话的line_items数量或参数规则可能有不同限制。升级SDK后,会自动使用最新的API版本,能避免这类规则不匹配的问题。
按照上面的步骤排查,大概率能解决你的问题。优先尝试升级SDK,这是最快速解决旧版本bug的方法。
内容的提问来源于stack exchange,提问作者Mr Fake

