Stripe checkout event for failed payments

Solution 1:

To charge a credit or a debit card, you create a Charge object. You can retrieve and refund individual charges as well as list all charges. Charges are identified by a unique, random ID.

-- From the Stripe API Documentation.

You can then detect a webhook response of charge.failed to show that an attempted use of a charge object has failed.

Stripe used to be very cleanly documented, but they've lost their way a little, recently.

Stripe card payments ALWAYS use Charge objects, sometimes these are set by you (invoices, subscriptions, etc.) and sometimes these are set behind the scenes by Stripe ("Checkout Process", etc) -- but they are always set, so your webhook can always detect a charge.failed event.


Addendum

This does work, however, since the client_reference_id is not in the charge.failed data, I can't link the failed payment to a specific account anyway. But in regards to my actual question, this event does work and is the correct answer, just unfortunate that it doesn't solve my specific situation.

To solve this; either using the Stipe interface or by coding:

1) Create a Customer object and keep some sort of record of this customer Id.

2) When the Stripe Charge runs, an associated $charge->customer is set. This is available to your webhook.

3) When the webhook result appears, use this (typically) $event->data->object->customer value to cross reference the charge with the correct customer on your server.

4) As mentioned in comments, Stripe Webhook Testing does not populate the webhooks with example data such as ->customer... :-(

Solution 2:

I know this is a bit late for a reply - but I have a working solution!!

When I create a "Session" in Stripe, I make sure to fill out the SessionCreateOptions so that the PaymentIntentData.Metadata field is setup to have my customer's ID and stuff in it. When I do that, the metadata not only shows up in payment_intent.created and payment_intent.succeeded webhooks, but it ALSO shows up in charge.succeeded/failed!

This means that when a payment fails I can look up the attempted payment that I keep track of and email them back letting them know that it failed and why, and I can also log it for myself for reference when I go look up that customer in my customer service tools.