Short answer
Catch the decline, keep the PaymentIntent it returns, and email or notify the customer with a link to a page that calls confirmPayment with that PaymentIntent’s client secret. The bank then shows its check and the payment can succeed. If the same code comes back after a passed check, the customer has to call the bank.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
Why the bank asks, and the fix
01
The charge ran while the customer was away
“Set off_session to true to indicate that the customer isn’t in your checkout flow to respond to any authentication requests.” Stripe, Save and reuse payment methods
With off_session set to true, Stripe asks the bank to skip the check. When the bank says no, the payment fails with this code, and only the customer can finish it.
02
The card wasn’t saved for later charges
Save the card while the customer is present, with a SetupIntent or setup_future_usage set to off_session on the first payment. The bank can then ask for the check once, up front, and later charges are less likely to need it.
03
Bring the customer back to confirm
“If the payment failed due to an authentication_required decline code, use the declined PaymentIntent’s client secret with confirmPayment to allow the customer to authenticate the payment.” Stripe, Save and reuse payment methods
The failed request carries the PaymentIntent. Save its ID, send the customer a link, and confirm it on that page so the bank can show the check.
try { await stripe.paymentIntents.create({ amount, currency: 'usd', customer: customerId, payment_method: paymentMethodId, off_session: true, confirm: true, }); } catch (err) { if (err.code === 'authentication_required') { await notifyCustomer(customerId, err.raw.payment_intent.id); } } // the page the customer opens asks your server for the PaymentIntent // by ID and gets its client_secret back (never put it in the email link) await stripe.confirmPayment({ clientSecret, confirmParams: { return_url } });04
The customer skipped the check
“The customer tried to proceed without performing the required authentication, so the issuer declined again.” Stripe, Decline codes (authentication_not_handled)
A second decline after the customer closed or skipped the check comes back as authentication_not_handled. Show the check again, or let them use another card.
05
The check passed and the bank still declined
“If the card issuer returns this decline code despite a successfully authenticated transaction, the customer needs to contact their card issuer for more information.” Stripe, Decline codes (authentication_required)
Your code can’t fix this one. Tell the customer to call the bank, or to pay with another card.
06
Test the renewal path
“The card requires authentication for the initial setup and also requires authentication for subsequent payments.” Stripe, Save and reuse payment methods (testing)
In a sandbox, save test card 4000 0027 6000 3184 and charge it off session. It asks for authentication every time, so your recovery email or page runs.
Checked against the vendor’s docs on : Stripe docs: Decline codes; Stripe docs: Save and reuse payment methods.
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 payment_intent_authentication_failure · Stripe subscription incomplete (requires_action) · Stripe card declined (generic_decline) · Stripe setup_intent_authentication_failure