> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/classic-push-provisioning/es/casos-de-uso/ver-y-controlar/autenticacion-en-la-aplicacion/apple-pay.md).

# Apple Pay

#### Configuración TSP del esquema <a href="#scheme-tsp-configuration" id="scheme-tsp-configuration"></a>

La información de redirección es la siguiente:

* `contactName`: Identificador del nombre del emisor (ver el diagrama arriba).
* `bank_app`: Nombre de la app iOS utilizada para la autenticación dentro de la aplicación.
* `appLaunchURL`: Esquema de URL de enlace profundo dedicado para la aplicación del emisor. Apple Pay lo usa para iniciar la aplicación del emisor para la autenticación dentro de la aplicación. La aplicación del emisor puede entonces determinar que fue iniciada por la aplicación wallet basándose en el valor del esquema de URL.
* `associatedStoreIdentifiers`: Identificadores de la aplicación del emisor en el App Store. Apple Pay los usa para solicitar al usuario final que descargue la aplicación del emisor si no está instalada.
* `associatedApplicationIdentifiers`: Identificadores de la aplicación del emisor. Deben coincidir con el Team ID de su cuenta de desarrollador y el ID del paquete de la app.

**Configurar y manejar un esquema de URL personalizado**

1. En Xcode, vaya a Project Settings > Targets > su aplicación y seleccione la `Info` pestaña de su target.
   * Establezca `identifier` a un identificador único. El valor recomendado es el ID del paquete de la aplicación.
   * Establezca `URL Schemes` a su esquema personalizado.
   * Establezca `Role` a `Editor`.

<br>

<figure><img src="/files/79088ce82c46b5f6cf7c5835a4949436aa4ebe0e" alt=""><figcaption></figcaption></figure>

2. Cuando la aplicación wallet redirige al usuario final a la aplicación del emisor, la aplicación del emisor debe verificar que fue iniciada por la aplicación wallet. La aplicación wallet añade parámetros de consulta a la URL. Estos parámetros identifican de forma única el pase (tarjeta digital). Por ejemplo, `myscheme://mypath?passTypeIdentifier=paymentpass.com.apple&serialNumber=123&action=verify`.

Para más detalles, consulte la [documentación de Apple](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app).

#### Identificación de tarjeta y token <a href="#card-and-token-identification" id="card-and-token-identification"></a>

Para identificar la tarjeta y el token a activar, la aplicación del emisor debe usar las APIs iOS PassKit. En particular, use estos parámetros:

* passTypeIdentifier
* serialNumber

En términos de iOS, estos parámetros le permiten identificar el `Pase`. En este flujo, el `Pase` es el token a activar.

A continuación hay un ejemplo de código Swift que muestra cómo usar estos datos para identificar el `Pase`.

> <i class="fa-exclamation-circle">:exclamation-circle:</i>
>
> **Advertencia**
>
> Este código de ejemplo se proporciona tal cual. Usted es responsable de usar las especificaciones más recientes de Apple. Thales no se hace responsable de los cambios que Apple pueda introducir en las APIs de PassKit.

```swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
        // manejar error p. ej. registro
        return false
    }
    
    guard let queryItems = components.queryItems else {
        // manejar error p. ej. registro
        return false
    }

    // ejemplo de comprobación de los elementos de consulta
    let containsPassTypeIdentifier = queryItems.contains(where: { $0.name == "passTypeIdentifier" && $0.value == "paymentpass.com.apple" })
    let indexSerialNumber = queryItems.firstIndex(where: { $0.name == "serialNumber" })
    let containsAction = queryItems.contains(where: { $0.name == "action" })
    let validated = containsPassTypeIdentifier && indexSerialNumber != nil && containsAction

    guard validated, let indexSerialNumber = indexSerialNumber else {
        // manejar error p. ej. mostrar interfaz de error
        return false
    }

    var serialNumber = queryItems[indexSerialNumber].value
    let tokenRequestorId = "40010030273" // solo en caso de VISA, de lo contrario cadena vacía
    let scheme = "SCHEME" // VISA, MASTERCARD, AMEX
    let authorizationCode = "<JWT>" // proporcione el valor JWT relacionado con la tarjeta en particular, obtenido del backend del emisor

    if let serialNumber = serialNumber {
        let tokenInput = GetTokenInput(serialNumber: serialNumber)
        TPCSDK.getToken(input: tokenInput) {
            (localPass, remotePass, error) in
            if let error = error {
                // manejar error de TPC
                return
            }
            
            var tokenId: String? = nil
            var last4: String? = nil
            if let localPass = localPass {
                last4 = localPass.secureElementPass?.primaryAccountNumberSuffix
                tokenId = localPass.secureElementPass?.deviceAccountIdentifier
            } else if let remotePass = remotePass {
                last4 = remotePass.secureElementPass?.primaryAccountNumberSuffix
                tokenId = remotePass.secureElementPass?.deviceAccountIdentifier
            }

            if let last4 = last4,
                let tokenId = tokenId {

                // mostrar last4 para la interfaz de confirmación

                TPCSDK.updateTokenState(tokenId: tokenId,
                                        tokenRequestorId: tokenRequestorId,
                                        schemeString: scheme,
                                        authorizationCode: authorizationCode,
                                        action: .Activate) { success, error in
                    if let error = error {
                        // manejar error de TPC
                    } else if success {
                        // por hacer: actualizar la interfaz para indicar el estado de la digitalización de la tarjeta
                    }
                }
            }
        }
    } else {
        // manejar error p. ej. mostrar interfaz de error
        return false
    }
    return true
}
```

\
**Nota:**

El `deviceAccountIdentifier` corresponde al `ID de token` en TSP. Puede usarlo para activar el token de la tarjeta digitalizada. El `primaryAccountNumberSuffix` son los últimos cuatro dígitos del PAN que se han tokenizado. Puede usarlos para recuperar el diseño de la tarjeta y mostrárselo al usuario final durante la solicitud de autenticación.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.payments.thalescloud.io/classic-push-provisioning/es/casos-de-uso/ver-y-controlar/autenticacion-en-la-aplicacion/apple-pay.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
