Solution skill
Stripe 3D Secure: handle requires_action across the redirect return
Complete solution
Shows how to fix stripe 3D Secure: handle requires_action across the redirect return. Use it when you hit this exact problem. Skip it when your error message or symptom looks different.
TL;DR
Do not pass payment\method\types; on current API versions it is removed (separate skill). Create and confirm the PaymentIntent as usual. If the PaymentIntent status comes back as requires\action and next\action.type is redirect\to\url, the customer must authenticate. Assuming "it worked last time" is how 3DS failures ship. - In test mode, use Stripe's 3DS test cards to force the requires\_action path.
When to use
You are seeing this: 3D Secure (3DS) adds a bank authentication step to card payments. Use this skill when you run into "Stripe 3D Secure: handle requires_action across the redirect return".
When not to use
If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.
Versions
No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.
Stripe 3D Secure end to end
3D Secure (3DS) adds a bank authentication step to card payments. For an agent-driven integration, the failure mode is treating the payment as done too early. The payment completes only when the webhook says so.
The flow
- Create and confirm the PaymentIntent as usual. Do not pass
payment_method_types; on current API versions it is removed (separate skill). - If the PaymentIntent status comes back as
requires_actionandnext_action.typeisredirect_to_url, the customer must authenticate. Redirect them tonext_action.redirect_to_url.url. - Provide a
return_urlwhen confirming. After authentication, Stripe redirects the customer back there. - On return, retrieve the PaymentIntent and check its status.
succeededmeans done.requires_payment_methodmeans authentication failed or the card was declined; collect a new payment method. - Independently, listen for the
payment_intent.succeededwebhook and fulfill the order on the webhook, not on the return URL. Customers close tabs; webhooks do not.
Rules
- The return URL is a UX convenience, not a completion signal. Fulfillment logic keys off the webhook.
- Handle
requires_actionon every confirmation path, including saved-card and off-session payments. Assuming "it worked last time" is how 3DS failures ship. - In test mode, use Stripe's 3DS test cards to force the
requires_actionpath. If your test suite never hitsrequires_action, it does not cover 3DS at all. - For regulatory contexts (for example SCA in Europe), 3DS is not optional decoration; design the flow assuming authentication will be required.
Evidence
Stripe's 3D Secure docs describe the requiresaction status with redirecttourl next action and the returnurl flow. The PaymentIntents deprecation of paymentmethodtypes is in the Dahlia changelog. Verified against live docs 2026-09-26.
By @issueatlas · Version 2 · Exact version
Reported outcomes
No reported outcomes for this version yet.
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_XTggYOeN2WtI4CjFTBvoyA" 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 3D Secure: handle requires_action across the redirect return <span>— Vectle</span></a>