Welcome to our new developer portal! Use the "Ask" button to chat with our AI Agent.
For the complete documentation index, see llms.txt. This page is also available as Markdown.

List payment passkeys

Overview

Use this flow to retrieve payment passkeys linked to a card. The issuer application displays the results in its native user interface.

This flow is available only for Visa.

User experience

Visa user experience for listing payment passkeys.

Visa requires a brief initialization step on an issuer-hosted web page.

This step checks the device configuration.

The issuer application then displays them in its native user interface.

UI screens are for information purposes only; actual appearance may vary depending on device, OS, and configuration.

Flow

Visa initialization flow for payment passkey listing.

The D1 SDK redirects the end user to an issuer-hosted web page. This can be a loading page.

The page loads the D1 JavaScript SDK.

The D1 JavaScript SDK starts the Visa SDK in a hidden iframe.

If the device completed this step within eight minutes, the D1 SDK skips the web page automatically.

Sequence diagram

Prerequisites

  • The issuer application integrates and initializes the D1 SDK.

  • The issuer application is authenticated with the D1 SDK.

  • The end user and card are registered in the D1 Platform.

  • The issuer exposes the issuer-hosted web page at an URL configured in the D1 backend.

After this sequence, Visa initialization completes. The D1 SDK and D1 backend retrieve the card's payment passkeys. They also identify the payment passkey linked to the current device.

The D1 SDK returns the payment passkey list to the issuer application. The issuer application displays the list in its native iOS or Android user interface.

Integrate the D1 JavaScript SDK

Create an issuer-hosted web page that loads the D1 JavaScript SDK.

The D1 JavaScript SDK creates a hidden iframe that runs the Visa JavaScript SDK. Visa uses the device fingerprint before it retrieves payment passkeys or creates a payment passkey.

The D1 SDK opens this page when needed. It uses a ChromeCustomTab on Android and SFSafariViewController or ASWebAuthenticationSession on iOS. Initialization takes up to two seconds.

Display a waiting state while initialization runs. A spinner is sufficient.

Receive initialization parameters

The D1 SDK opens the issuer-hosted web page with query parameters.

Read these parameters from the page URL:

Parameter
D1 JavaScript SDK option
Required

issuerCallbackUrl

issuerCallbackUrl

Yes

apn

visaParameters.apn

Yes

softwareId

visaParameters.softwareId

Yes

softwareVersion

visaParameters.softwareVersion

Yes

productCode

visaParameters.productCode

Yes

All values are strings and URL-encoded. Pass them unchanged to init().

Initialize the D1 JavaScript SDK

On the issuer-hosted web page:

  1. Display a waiting state until the flow completes or redirects.

  2. Read the query parameters added by the D1 SDK.

  3. Load the D1 JavaScript SDK with its Subresource Integrity (SRI) hash.

  4. Set crossorigin="anonymous" on the script.

  5. Call init() with the callback URL and Visa parameters.

The following example loads and initializes the D1 JavaScript SDK:

Security requirements

  • Set integrity to the SRI hash provided by Thales. The browser blocks a modified script.

  • Set crossorigin="anonymous". Cross-origin SRI requires a CORS-enabled response.

  • Check that window.init is available. Display an error if the script fails to load.

  • Serve the page over HTTPS. Do not embed it in an iframe.

  • Register the page origin with Visa during D1 onboarding. Visa receives it as top_origin and integrator_origin.

Handle the callback

When initialization finishes, the D1 JavaScript SDK redirects to issuerCallbackUrl. Configure this URL during D1 onboarding.

The D1 SDK handles the callback automatically on iOS. On Android, redirect the callback to the D1 SDK as shown below.

Integrate the D1 SDK

Follow these platform requirements:

  • Integrate the D1 SDK as mentioned in this section.

  • Android: Call handleResult() directly on the main thread from onNewIntent(). Do not use background threads or dispatchers. They can trigger lifecycle callbacks before processing completes.

Last updated

Was this helpful?