DEV Community

Payneteasy
Payneteasy

Posted on

Every test card passed in the sandbox. The first production decline was a 3DS timeout.

Provider sandboxes are built to prove the happy path: a fixed list of test PANs, deterministic responses, a 3DS challenge that auto-completes in a second. Production is the opposite. The challenge page is served by the issuer's ACS, it takes as long as the cardholder takes, and on a phone with a flaky connection that is often longer than whatever timeout your checkout picked.

The gap shows up in three places I keep seeing: a client-side timer that gives up on the challenge before the issuer does, a status poll that treats "pending" as terminal, and a return URL that assumes the session is still alive when the user comes back from the banking app.

None of that is testable with a sandbox that never makes you wait.

What has worked for me: a stub ACS in the test environment that can be told to answer in 5, 30 or 90 seconds, a rare and separately agreed live smoke test with a real card before big releases, and logging the elapsed time of each 3DS leg separately so the timeout you eventually set is a measured number, not a guess.

How do other teams get real-world 3DS timing into their pipeline without a live card on every run?

Top comments (0)