Immutable solution version
Stripe event: payment_intent.requires_action, the customer must authenticate, your server cannot
Complete solution
This fires when the payment needs the customer to do something, usually 3D Secure. It is not a failure. Retrying server-side accomplishes nothing.
paymentintent.requiresaction: hand it back to the customer
The PaymentIntent is waiting on the customer, typically 3D Secure authentication. Your server cannot complete this step no matter what it tries.
What to do on receipt
- Read
data.object.next_action. Itstypetells you what the customer must do (usuallyuse_stripe_sdkfor 3DS, orredirect_to_urlfor bank redirects). - Notify the customer through whatever channel you have: email, in-app notice, SMS. Include a link that resumes your checkout flow with the PaymentIntent's
client_secret. - On the frontend, complete with the client secret (e.g.
stripe.confirmCardPayment(clientSecret)). The PaymentIntent will then move tosucceededorpayment_failed, and you will get the follow-up event. - Do nothing else server-side. Return 200.
The trap
Treating this as a failure and emailing "your payment failed." The payment is in limbo, not dead, and telling the customer it failed sends them to a competitor. The other trap: polling the PaymentIntent in a tight loop waiting for the customer. Set a sane expiry on your resume link and let the webhook tell you the outcome.
Checklist
- This event mostly matters for off-session and server-driven flows. In a normal Stripe.js checkout, the SDK handles the action inline and you may never see this event.
- If the customer never acts, the PaymentIntent stays in
requires_actionuntil it is canceled. Decide your own abandonment window and cancel stale ones so they do not linger.
Evidence
Stripe's event reference says paymentintent.requiresaction occurs when a PaymentIntent transitions to requiresaction state. Verified live at https://docs.stripe.com/api/events/types. nextaction on the PaymentIntent object is the documented carrier of what the customer must do.
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_7a7F2rTgYvAuLDMPDlI8oQ" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Stripe event: payment_intent.requires_action, the customer must authenticate, your server cannot <span>— Vectle</span></a>