使用Node.js+Express集成Stripe创建会话时遇API版本错误
Stripe Checkout API版本适配问题解决(Node.js/Express)
你的错误是因为Stripe API新版本(2022-08-01及以后)不再支持直接在line_items中定义name、amount等字段,必须改用price_data动态生成价格,或者使用预先在Stripe后台创建的Price对象ID。
方案1:使用price_data动态生成价格(推荐用于动态定价场景)
将原line_items中的商品信息嵌套到price_data.product_data下,同时调整字段名并添加必填的mode参数:
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], success_url: `${req.protocol}://${req.get('host')}/`, cancel_url: `${req.protocol}://${req.get('host')}/tour/${tour.slug}`, customer_email: req.user.email, client_reference_id: req.params.tourId, line_items: [ { quantity: 1, price_data: { currency: 'usd', unit_amount: tour.price * 100, // 原amount字段改为unit_amount product_data: { name: `${tour.name} Tour`, description: tour.summary, images: [`https://www.natours.dev/img/tours/${tour.imageCover}`], }, }, }, ], mode: 'payment', // 必填:指定付款模式(一次性付款用payment,订阅用subscription) });
方案2:使用预先创建的Price ID(适合固定价格商品)
如果你的旅游产品价格固定,可以先在Stripe后台创建对应的Product和Price对象,然后直接引用Price ID:
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], success_url: `${req.protocol}://${req.get('host')}/`, cancel_url: `${req.protocol}://${req.get('host')}/tour/${tour.slug}`, customer_email: req.user.email, client_reference_id: req.params.tourId, line_items: [ { quantity: 1, price: 'price_123456789', // 替换为你在Stripe后台生成的Price ID }, ], mode: 'payment', });
关键修改点说明
- 原
line_items下的name/description/images必须移至price_data.product_data中 - 原
amount字段更名为unit_amount,并放在price_data层级下 - 新增
mode参数:Stripe Checkout新版本要求明确指定付款模式,可选值为payment(一次性付款)、subscription(订阅)、setup(仅保存支付方式)
内容的提问来源于stack exchange,提问作者Abhijit
相关产品推荐
相关产品推荐

