NilsKyuubi
NilsKyuubi

Reputation: 371

Stripe get product_id / price_id from session object

I'm currently using Stripe Webhooks to get notified when user pays for a product. This is working fine. From the payment intent I can get the Seesion and the Customer Object. But I don't find a way to get the product_id or price_id for what the user paid.

Does someone know a way to get product_id or price_id ?

Upvotes: 5

Views: 3679

Answers (3)

Senthil
Senthil

Reputation: 634

cjav_dev answer is great! Here is the PHP code for the same.

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'];

Note the above is only retrieving the 1st line item. You may have to do a loop for all items.

Upvotes: 1

Madhu Jayarama
Madhu Jayarama

Reputation: 443

While creating the Payment Intent, you can store additional information about the object in the metadata field.

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

Once the payment is done, you can retrieve this information from the metadata field.

You can do the same for the Session Object as well.

Upvotes: 7

cjav_dev
cjav_dev

Reputation: 3105

Thanks for the question. As you noticed the Session data included in the checkout.session.completed event does not include the line_items where the Price ID is associated to the Checkout Session.

line_items is one of the expandable properties, so to retrieve the Price ID you'd retrieve the Checkout Session and use expand to include the line items in the response. There is not a way to configure your webhook to have the data sent to you include this data.

There are two approaches to associating a customer's purchase with a Checkout Session. First, you could store the ID of the Checkout Session in your database alongside the cart or list of items purchased by the customer. That way you if a checkout session is successful, you can look up the cart by ID and know which items were purchased.

Alternatively you could listen for the checkout.session.completed webhook event, then when you receive a new notification for a successful checkout, retrieve the Session with expand then use the related price data.

Using stripe-node that would look like the following:

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);

To take this a step further, if you wanted more than just the ID of the product, you could also expand that by passing line_items.data.price.product which would include the line items their related prices and the full product objects for those prices.

Upvotes: 9

Related Questions