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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:53:15