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

集成Stripe支付遇Invalid Request Error:line_items参数格式不符

解决Stripe Checkout Invalid Request Error问题

问题场景

在为网站集成Stripe支付时触发Invalid Request Error,以下是原checkout.js代码:

const stripe = require('stripe')(process.env.STRIPE_SECRET_kEY);
const { productList } = require('../products');

exports.checkoutCtrlFunction = async (req, res) => {
    try {

        const productsFromFrontend = req.body.products;
        console.log(productList);

        function productsToBuy() {
            let products = [];

            productList.forEach( singleProductList => {
                productsFromFrontend.forEach(singleProductFrontend => {
                    if(singleProductList.tag === singleProductFrontend.tag) {
                        products.push({
                            name: singleProductList.name,
                            description: singleProductList.description,
                            images: [singleProductList.image],
                            amount: singleProductList.price * 100,
                            currency: 'usd',
                            quantity: singleProductFrontend.inCart
                        })
                    }
                })
            })

            return products
        }

        const session = await stripe.checkout.sessions.create({
            payment_method_types: ['card'],
            success_url: `${req.protocol}://${req.get('host')}/checkout/success`,
            cancel_url: `${req.protocol}://${req.get('host')}/cart`,
            shipping_address_collection: {
                allowed_countries: ['US', 'GB']
            },
            line_items: productsToBuy()

        });

        res.status(200).json({
            status: "success",
            session: session
        })
    } catch (error) {
        console.log(error);
    }
}

报错信息

You cannot use line_items.amount, line_items.currency, line_items.name, line_items.description, or line_items.images in this API version. Please use line_items.price or line_items.price_data

问题原因

你的Stripe API版本已更新,创建Checkout Session时,line_items字段不再支持直接传入name、amount等顶层属性,必须通过price(关联已在Stripe后台创建的Price对象)或price_data(动态定义商品价格及信息)来配置。

解决方案

由于你是从本地productList动态获取商品信息,适合使用price_data字段重构line_items的结构:

  • 将原顶层的name、description、images嵌套到price_data.product_data中
  • 原amount改为unit_amount,放到price_data下
  • currency移至price_data层级
  • quantity保留在line_item的根层级

修改后的productsToBuy函数代码如下:

function productsToBuy() {
    let products = [];

    productList.forEach(singleProductList => {
        productsFromFrontend.forEach(singleProductFrontend => {
            if(singleProductList.tag === singleProductFrontend.tag) {
                products.push({
                    quantity: singleProductFrontend.inCart,
                    price_data: {
                        currency: 'usd',
                        unit_amount: singleProductList.price * 100,
                        product_data: {
                            name: singleProductList.name,
                            description: singleProductList.description,
                            images: [singleProductList.image]
                        }
                    }
                })
            }
        })
    })

    return products
}

替换原函数后,重新调用Stripe API即可正常创建Checkout Session。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:20:28