Skip to main content

Overview

3D Secure is handled automatically inside confirmPayment, with no separate call. If the customer’s bank requires a challenge, the SDK shows it in-page and resumes when they finish. Frictionless authentications need no UI at all. When a challenge is required, the customer sees their bank’s authentication screen (OTP, biometric, etc.) inside a secure iframe. You choose where it appears.

Rendering in your own container

Put a container in your checkout (only needed if you do not want the default modal), then pass it to threeDS.container and drive your UI from onStatusChange. That is why the callback matters: it is how you show a spinner during authentication and hide it when the challenge appears.

Lifecycle status

onStatusChange reports the payment’s progress: There are two paths through the lifecycle:
  • Frictionless: submitting -> authenticating -> terminal. No requires_action, the customer sees nothing.
  • Challenge: submitting -> requires_action -> authenticating -> terminal. The customer completes the OTP in between.

Challenge window size

The EMVCo challenge window dimensions, passed to confirmPayment as acsWindowSize. This only applies to the challenge path and is ignored when the authentication is frictionless.
Test both paths with the sandbox test cards: a challenge card presents the OTP step (enter 1234), and a frictionless card authenticates with no customer interaction.