Short answer
Catch the error after confirmPayment, show a message that the bank couldn’t confirm the payment, and keep the same PaymentIntent so the customer can try again or enter another card. For redirect flows, read the PaymentIntent on your return page and check for requires_payment_method. Test it with card 4000000000003220 and the Failure button.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
What the error means, and what to do
01
The customer failed or closed the 3D Secure check
“The provided payment method has failed authentication. Provide a new payment method to attempt to fulfill this PaymentIntent again.” Stripe, Error codes (payment_intent_authentication_failure)
The bank asked for a code, an app approval or a password, and the customer got it wrong, cancelled or closed the window. Stripe reports this as an authentication failure, not a card decline.
02
Let the customer try again
“Failure: The PaymentIntent transitions to a status of requires_payment_method, indicating that you need to try a different payment method, or you can retry 3DS by reconfirming.” Stripe, Authenticate with 3D Secure
Keep the same PaymentIntent. Confirming it again starts a new 3D Secure check, and a new card can go through the same flow.
const { error } = await stripe.confirmPayment({ elements, confirmParams: { return_url: 'https://example.com/done' }, redirect: 'if_required', }); if (error?.code === 'payment_intent_authentication_failure') { showMessage('Your bank couldn’t confirm this payment. Try again or use another card.'); }03
Redirect flows end on your return page
When the check happens on a redirect, the error doesn’t come back from confirmPayment. Retrieve the PaymentIntent on the return page and show the retry message when its status is requires_payment_method.
04
Test it before customers hit it
“Clicking the Failure button simulates an unsuccessful attempt at authentication.” Stripe, Authenticate with 3D Secure (testing)
In a sandbox, pay with test card 4000000000003220, which always requires 3D Secure, then click Failure on Stripe’s test page to see the error your app shows.
Checked against the vendor’s docs on : Stripe docs: Error codes; Stripe docs: Authenticate with 3D Secure.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
“Working with Simon makes everything run so smoothly and better than I could ask for it. Amazingly communicative, extremely knowledgeable of coding and the backend processes. I strongly recommend.”
Related: Stripe authentication_required decline · Stripe subscription incomplete (requires_action) · Stripe card declined (generic_decline) · Stripe card_not_supported