如何通过Stripe获取含商品/价格信息的用户购买历史?
问题
我拥有一个Web应用,用户需购买不同的信用点数包方可使用。例如,5000点数包售价4.99美元,10000点数包售价7.99美元。我使用Stripe管理购买流程,可通过以下代码创建支持用户调整购买数量的结账会话(基于priceId):
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'], });
现在我希望编写一个函数来获取指定用户的购买历史,原本计划使用stripe.charges.list接口,但该接口返回的Charge对象仅包含用户支付金额,无法获知购买的商品及价格信息,请问该如何解决此问题?
解决方案
直接用stripe.charges.list确实拿不到商品明细,推荐用以下几种方式获取完整的购买历史及商品信息:
1. 从Checkout Sessions入手
用户通过结账会话完成支付后,每个会话都关联了对应的商品明细。你可以通过stripe.checkout.sessions.list筛选指定用户的会话,再扩展line_items字段获取商品信息:
const sessions = await stripe.checkout.sessions.list({ customer: customer.id, expand: ['data.line_items'], // 扩展获取会话包含的商品明细 limit: 100, // 按需调整数量 }); // 遍历会话提取购买信息 sessions.data.forEach(session => { const purchaseInfo = { id: session.id, amountTotal: session.amount_total, currency: session.currency, createdAt: new Date(session.created * 1000), lineItems: session.line_items.data.map(item => ({ priceId: item.price.id, productId: item.price.product, quantity: item.quantity, unitAmount: item.price.unit_amount, })) }; // 若需要商品名称,可单独调用stripe.products.retrieve查询productId对应的信息 });
2. 通过Payment Intents关联查询
每个Charge都会关联一个Payment Intent,你可以先列出用户的Charges,再通过Charge的payment_intent字段查询对应的Payment Intent,进而获取关联的Line Items:
const charges = await stripe.charges.list({ customer: customer.id, limit: 100, }); // 遍历Charge查询关联的Payment Intent及商品明细 for (const charge of charges.data) { if (charge.payment_intent) { const paymentIntent = await stripe.paymentIntents.retrieve(charge.payment_intent, { expand: ['line_items'], }); // 从paymentIntent.line_items中获取商品信息 const lineItems = paymentIntent.line_items?.data || []; // 处理商品明细 } }
3. 使用Invoices(如果适用)
如果你的购买流程涉及订阅或开票场景,也可以通过stripe.invoices.list查询用户的发票,发票中会包含完整的商品明细和价格信息:
const invoices = await stripe.invoices.list({ customer: customer.id, expand: ['data.lines'], limit: 100, }); invoices.data.forEach(invoice => { const lineItems = invoice.lines.data.map(item => ({ productId: item.price.product, priceId: item.price.id, quantity: item.quantity, amount: item.amount, description: item.description, })); // 处理发票及商品信息 });
注意事项
- 优先使用Checkout Sessions的方式,因为它直接对应用户的单次购买行为,关联的商品信息最直观。
- 扩展字段时按需添加,避免不必要的性能损耗。
- 如果需要长期存储购买历史,建议将获取到的商品信息同步到自己的数据库中,减少频繁调用Stripe API的次数。
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

