如何获取Stripe结账会话中用户实际购买的商品数量?
问题:如何获取Stripe结账会话中用户实际选择的购买数量?
我开发了一个Web应用,用户需要购买信用包才能使用,比如5000个信用点的套餐售价4.99美元。我用Stripe管理支付流程,通过以下代码创建了允许用户调整购买数量的结账会话:
const session = await stripe.checkout.sessions.create({ customer: customer.id, mode: "payment", line_items: [ { price: priceId, quantity: 1, adjustable_quantity: { enabled: true, minimum: 1, maximum: 10, }, }, ], success_url: successUrl, expand: ['line_items'], }); console.log("session.line_items.data", session.line_items.data)
支付完成后,我想获取用户实际选择的购买数量,但在session.line_items.data里找不到正确数值——打印出来的内容里quantity显示为1,可我在结账时输入的明明是大于1的数量:
session.line_items.data [ { id: 'li_1NkQLWKr7t8UXDrfh27ztJyS', object: 'item', amount_discount: 0, amount_subtotal: 499, amount_tax: 0, amount_total: 499, currency: 'usd', description: 'Pack of 5000 credits', price: { id: 'price_1NkPz7Kr7t8UXDrfWPexeF0Y', object: 'price', active: true, billing_scheme: 'per_unit', created: 1693308085, currency: 'usd', custom_unit_amount: null, livemode: false, lookup_key: null, metadata: {}, nickname: null, product: 'prod_OXUzBNts9jZ47m', recurring: null, tax_behavior: 'unspecified', tiers_mode: null, transform_quantity: null, type: 'one_time', unit_amount: 499, unit_amount_decimal: '499' }, quantity: 1 } ]
解决方法
- 创建会话时的line_items是初始配置:你当前打印的是创建结账会话时设置的初始数量,并非用户修改后的最终数据。
- 通过Webhooks获取支付完成后的真实数据:支付成功后,Stripe会触发
checkout.session.completed事件。在该事件的payload中,展开line_items或关联的payment_intent,即可获取用户实际购买的数量。 - 事后重新检索结账会话:如果未使用Webhooks,可在用户跳转回success_url时,通过会话ID重新调用检索接口获取最新数据。示例代码:
// 在success页面的后端验证逻辑中执行 const session = await stripe.checkout.sessions.retrieve( sessionId, // 从success_url的参数中提取会话ID { expand: ['line_items'] } ); console.log(session.line_items.data[0].quantity); // 此处为用户实际购买的数量
- 注意数据更新时机:只有用户完成支付后,Stripe才会更新会话的实际订单数据,因此必须在支付完成后再去获取最新的line_items信息。
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

