NodeJS 条带从会话对象获取产品ID /价格ID

c86crjj0  于 2023-03-01  发布在  Node.js
关注(0)|答案(3)|浏览(149)

我目前正在使用Stripe Webhooks在用户为产品付款时接收通知。此功能运行良好。从付款意图中,我可以获取SeisionCustomer对象。但我找不到获取用户付款的product_idprice_id的方法。
是否有人知道获取product_idprice_id的方法?

9jyewag0

9jyewag01#

谢谢您的提问。正如您所注意到的,checkout.session.completed事件中包含的会话数据不包括价格ID与结帐会话相关联的line_items
line_items是可扩展属性之一,因此要检索Price ID,您需要检索Checkout Session并使用expand将行项目包含在响应中。无法配置您的webhook以使发送给您的数据包含此数据。
有两种方法可以将客户的购买与结帐会话关联。首先,您可以将结帐会话的ID与客户购买的购物车或项目列表一起存储在数据库中。这样,如果结帐会话成功,您就可以按ID查找购物车并了解购买了哪些项目。
或者,您可以监听checkout.session.completed webhook事件,然后当您收到成功结帐的新通知时,retrieve the Sessionexpand将使用相关的价格数据。
使用如下所示的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);

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

lmvvr0a8

lmvvr0a82#

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

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

付款完成后,您可以从metadata字段检索此信息。
您也可以对会话对象执行相同的操作。

2o7dmzc5

2o7dmzc53#

cjav_dev的答案很棒!下面是相同的PHP代码。

use Stripe\StripeClient;
$event = \Stripe\Event::constructFrom(
    json_decode($payload, true), $sig_header, $endpoint_secret
);
$eventObject = $event->data->object;

$stripe = new StripeClient('testsk_ssdfd...sdfs');
$csr = $stripe->checkout->sessions->retrieve($eventObject->id,
  ['expand' => ['line_items']]
);
$priceid = $csr->line_items['data'][0]['price']['id'];

请注意,以上只是检索第一行项目。您可能需要为所有项目执行一个循环。

相关问题