Stripe 从会话对象中获取 product_id / price_id
Stripe get product_id / price_id from session object
我目前正在使用 Stripe Webhooks 在用户为产品付款时收到通知。这工作正常。从付款意向中,我可以获得 Seesion 和 Customer 对象。但是我没有找到一种方法来获得用户支付的 product_id 或 price_id 。
有人知道如何获得 product_id 或 price_id 吗?
感谢提问。正如您所注意到的,checkout.session.completed
事件中包含的会话数据不包括价格 ID 与结账会话关联的 line_items
。
line_items
是可扩展属性之一,因此要检索价格 ID,您需要检索结帐会话并使用 expand 将订单项包含在响应中。无法配置您的 webhook 以让发送给您的数据包含此数据。
有两种方法可以将客户的购买与结帐会话相关联。首先,您可以将结帐会话的 ID 与购物车或客户购买的商品列表一起存储在数据库中。这样,如果结帐成功,您可以通过 ID 查找购物车并了解购买了哪些商品。
或者您可以侦听 checkout.session.completed
webhook 事件,然后当您收到成功结帐的新通知时,使用 expand 检索会话然后使用相关的价格数据。
使用如下所示的条带节点:
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
来扩展它,这将包括订单项、它们的相关价格和完整的产品对象对于这些价格。
创建付款意向时,您可以在 元数据 字段中存储有关对象的其他信息。
const paymentIntent = await stripe.paymentIntents.create({
amount: 1099,
currency: 'usd',
payment_method_types: ['card'],
metadata: {
product_id: '123',
price_id: '20',
},
});
付款完成后,您可以从 元数据 字段中检索此信息。
您也可以对会话对象执行相同的操作。
cjav_dev回答的很好!这是相同的 PHP 代码。
$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'];
请注意,以上内容仅检索第一个订单项。您可能需要对所有项目进行循环。
我目前正在使用 Stripe Webhooks 在用户为产品付款时收到通知。这工作正常。从付款意向中,我可以获得 Seesion 和 Customer 对象。但是我没有找到一种方法来获得用户支付的 product_id 或 price_id 。
有人知道如何获得 product_id 或 price_id 吗?
感谢提问。正如您所注意到的,checkout.session.completed
事件中包含的会话数据不包括价格 ID 与结账会话关联的 line_items
。
line_items
是可扩展属性之一,因此要检索价格 ID,您需要检索结帐会话并使用 expand 将订单项包含在响应中。无法配置您的 webhook 以让发送给您的数据包含此数据。
有两种方法可以将客户的购买与结帐会话相关联。首先,您可以将结帐会话的 ID 与购物车或客户购买的商品列表一起存储在数据库中。这样,如果结帐成功,您可以通过 ID 查找购物车并了解购买了哪些商品。
或者您可以侦听 checkout.session.completed
webhook 事件,然后当您收到成功结帐的新通知时,使用 expand 检索会话然后使用相关的价格数据。
使用如下所示的条带节点:
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
来扩展它,这将包括订单项、它们的相关价格和完整的产品对象对于这些价格。
创建付款意向时,您可以在 元数据 字段中存储有关对象的其他信息。
const paymentIntent = await stripe.paymentIntents.create({
amount: 1099,
currency: 'usd',
payment_method_types: ['card'],
metadata: {
product_id: '123',
price_id: '20',
},
});
付款完成后,您可以从 元数据 字段中检索此信息。
您也可以对会话对象执行相同的操作。
cjav_dev回答的很好!这是相同的 PHP 代码。
$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'];
请注意,以上内容仅检索第一个订单项。您可能需要对所有项目进行循环。