Stripe 从会话对象中获取 product_id / price_id

Nil*_*ubi 3 payment backend node.js stripe-payments

我目前正在使用 Stripe Webhooks 在用户为产品付款时收到通知。这工作正常。从付款意图中,我可以获得SeesionCustomer对象。但是我没有找到一种方法来获取用户支付的product_idprice_id

有人知道获取product_idprice_id 的方法吗?

Mad*_*ama 7

创建付款意图时,您可以在元数据字段中存储有关该对象的附加信息。

const paymentIntent = await stripe.paymentIntents.create({
    amount: 1099,
    currency: 'usd',
    payment_method_types: ['card'],
    metadata: {
        product_id: '123',
        price_id: '20',
    },
});
Run Code Online (Sandbox Code Playgroud)

付款完成后,您可以从元数据字段检索此信息。

您也可以对会话对象执行相同的操作。


w1z*_*n1p 6

谢谢你的提问。正如您所注意到的,checkout.session.completed事件中包含的会话数据不包括line_items价格 ID 与结帐会话关联的位置。

line_items是可扩展的属性之一,因此要检索价格 ID,您需要检索结帐会话并使用expand将订单项包含在响应中。没有办法配置你的 webhook 来让发送给你的数据包含这些数据。

有两种方法可以将客户的购买与结账会话相关联。首先,您可以将 Checkout Session 的 ID 与购物车或客户购买的商品列表一起存储在您的数据库中。这样,如果结帐会话成功,您可以通过 ID 查找购物车并知道购买了哪些商品。

或者,您可以监听checkout.session.completedwebhook 事件,然后当您收到成功结帐的新通知时,使用expand检索会话,然后使用相关的价格数据。

使用如下所示的 stripe-node:

const session = await stripe.checkout.sessions.retrieve(
  'cs_test_xxx', {
    expand: ['line_items'],
  },
);
// note there may be more than one line item, but this is how you access the price ID.
console.log(session.line_items.data[0].price.id);
// the product ID is accessible on the Price object.
console.log(session.line_items.data[0].price.product);
Run Code Online (Sandbox Code Playgroud)

更进一步,如果您想要的不仅仅是产品的 ID,您还可以通过传递line_items.data.price.product来扩展它,这将包括行项目的相关价格以及这些价格的完整产品对象。