集成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, orline_items.imagesin this API version. Please useline_items.priceorline_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
相关产品推荐
相关产品推荐

