For a successful payment, how can I find the related checkout session ID given the payment intent ID?
Given a Stripe payment intent ID, how can I find the checkout session ID?
1.4k views Asked by Dashiell Rose Bark-Huss At
2
There are 2 answers
0
On
Given a Stripe payment intent ID, you can find the checkout session ID like so:
From Stripe CLI
stripe checkout sessions list --payment-intent=pi_abc --limit=1 --expand=data.line_items
Line items
Taking it a step further, this PHP example will return the line items for a given payment intent:
/**
* Returns an array of line items. On each, can access properties `price`,
* `quantity` and more. e.g.:
* - getLinesItemsFromPaymentIntent('pi_3MCJzWBkWO5ojRjq1zBX6gA3')[0]->price->id
* - getLinesItemsFromPaymentIntent('pi_3MCJzWBkWO5ojRjq1zBX6gA3')[0]->quantity
*/
function getLinesItemsFromPaymentIntent($payment_intent_id) {
$stripe = new \Stripe\StripeClient(
getenv('STRIPE_API_SECRET_KEY')
);
// https://stripe.com/docs/api/checkout/sessions/list?lang=cli#list_checkout_sessions-payment_intent
$session = $stripe->checkout->sessions->all([
'limit' => 1,
'payment_intent' => $payment_intent_id,
'expand' => ['data.line_items'],
]);
return $session->data[0]->line_items->data ?? false;
}
Limitations
In passing, note that this will only work with products ordered through a Stripe Payment Link AKA Stripe-hosted payment page AKA checkout sessions
in the API.
If/when using your own payment form, you will need to use yet another approach to retrieve line items / what was ordered by your customer
Ergo, the way to make things more consistent when using multiple types of order forms is to set/read metadata on the Subscription, payment_intent_data or whatever handles your orders.
In that case you would just use the Checkout Session List API and pass in the Payment Intent ID for the
payment_intent
parameter. That will return an array with the related Checkout Session in it.