> 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/pin-management/es/implementar-la-gestion-de-pin/cambiar-un-pin.md).

# Cambiar un PIN

Para limitar la exposición del PIN en una tarjeta física, la aplicación emisora delega la tarea de cambiar el PIN al SDK D1.

Estos son los formatos de PIN (desde el backend del emisor) que se admiten actualmente:

* PIN ISO0
* PIN 3DES Seccos

### Experiencia de Usuario

<figure><img src="/files/7778c2068394bba15ac6dba6cda16a0d39fe9164" alt=""><figcaption><p>Pantalla de ejemplo para cambio de PIN en la Aplicación del Emisor</p></figcaption></figure>

### Flujo

<figure><img src="/files/acd80d7102ae90e1d8dd87aee08303c2b809e9f0" alt=""><figcaption><p>Flujo de alto nivel para cambiar un PIN</p></figcaption></figure>

1. El usuario se autentica en la app bancaria y solicita cambiar el PIN
2. Se realiza una llamada interna al SDK
3. Capturar el PIN de forma segura
4. API BackEnd D1
5. D1 transcifra el PIN de la clave del dispositivo a la clave del emisor
6. Establecer el PIN en el backend del emisor

### Diagrama de Secuencia

#### Pre-requisitos

* Consumidor, cuenta y tarjeta ya registrados en D1
* El SDK está correctamente inicializado
* La App Emisora llamó a la API de inicio de sesión del SDK D1.

<figure><img src="/files/0ff9868e0d76cdcd458bee34d4d7e996105683af" alt=""><figcaption><p>Diagrama de secuencia para cambio de PIN</p></figcaption></figure>

<figure><img src="/files/e30795acd3d816cdb4cbf3a60c15b38158cbe32f" alt=""><figcaption></figcaption></figure>

### APIs requeridas

| API                                                                                                                                                                             | Entrante/Saliente   | Descripción                                                             |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------- |
| [Obtener token de autorización](/pin-management/es/integrar-la-api-d1/referencia-de-la-api-d1/api-saliente-desde-d1/api-oauth2.md#post-oauth2-token)                            | Emisor <- Thales D1 | Obtener un token de acceso OAuth 2.0 para llamar al backend del Emisor. |
| [Establecer PIN](/pin-management/es/integrar-la-api-d1/referencia-de-la-api-d1/api-saliente-desde-d1/api-de-gestion-de-pin.md#put-cms-api-v1-issuers-issuerid-cards-cardid-pin) | Emisor <- Thales D1 | Establecer el PIN desde la app móvil al backend del Emisor.             |

### APIs condicionales

| API                                                                                                                                                                                                                  | Entrante/Saliente   | Descripción                                                                                                 |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------- |
| [API Obtener Contador de Cambio de PIN](/pin-management/es/integrar-la-api-d1/referencia-de-la-api-d1/api-saliente-desde-d1/api-de-gestion-de-pin.md#get-cms-api-v1-issuers-issuerid-cards-cardid-pin-changecounter) | Emisor <- Thales D1 | En caso de PIN Seccos. Se usa para recuperar el Contador de Cambio de PIN necesario para el Cálculo del PIN |

### SDK

> #### Nota
>
> Para mayor seguridad, la API de Cambio de PIN tiene un período de tiempo de último inicio de sesión predeterminado más estricto que las otras APIs. Para asegurar un cambio de PIN exitoso, debe gestionar el flujo de inicio de sesión/reinicio de sesión para completar el inicio de sesión dentro del tiempo asignado antes de enviar el cambio de PIN.

{% tabs %}
{% tab title="Android" %}

```java
@Nullable
@Override
public View onCreateView(
        @NonNull LayoutInflater inflater,
        @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState
) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);

    SecureEditText entryEditPin = (SecureEditText)view.findViewById(R.id.pin_entry);
    SecureEditText confirmEditPin = (SecureEditText)view.findViewById(R.id.pin_confirm);
    PINEntryUI.PINEventListener listener = new PINEntryUI.PINEventListener() {
        @Override
        public void onPinEvent(PINEntryUI.PINEvent pinEvent, String additionalInfo) {
            switch (pinEvent){
                case FIRST_ENTRY_FINISH:
                    // cambiar el foco a confirmEditPin
                    break;
                case PIN_MATCH:
                    // habilitar el botón Continuar/Enviar
                    break;
                case PIN_MISMATCH:
                    // deshabilitar el botón Continuar/Enviar y mostrar el error de PIN_MISMATCH
                    break;
            }
        }
    };

    String cardID = ""; // obtenido p. ej. desde el servidor
    ChangePINOptions options = new ChangePINOptions(4);
    pinEntryUI = d1Task.changePIN(cardID, entryEditPin, confirmEditPin, options, listener);

    Button button = (Button)view.findViewById(R.id.pin_submit);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pinEntryUI.submit(new D1Task.Callback<Void>() {
                @Override
                public void onSuccess(final Void data) {
                }

                @Override
                public void onError(@NonNull final D1Exception exception) {
                }
            });
        }
    });
    
    return view;
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
class ViewController: UIViewController {
    var pinEntryUI: PINEntryUI? = nil
    override func viewDidLoad() {
        let entryEditPin = D1SecureTextField()
        let confirmEditPin = D1SecureTextField()
        let cardID = "" // obtenido p. ej. desde el servidor
        let options = ChangePINOptions(pinLength: 4)
        pinEntryUI = d1Task.changePIN(cardID, textFieldNew: entryEditPin, textFieldConfirm: confirmEditPin, options: options, delegate: self)
    }

    func onButtonClick() {
        pinEntryUI?.submit { error in 
        }
    }
}

extension ViewController: PINEntryUIDelegate {
    func pinEntryUI(_ pinEntryUI: PINEntryUI, pinEvent: PINEntryUI.PINEvent, additionalInfo: String) {
        switch pinEvent {
            case .firstEntryFinish: 
                // cambiar el foco a confirmEditPin
                break
            case .pinMismatch:
                // habilitar el botón Continuar/Enviar
                break
            case .pinMatch:
                // deshabilitar el botón Continuar/Enviar y mostrar el error de PIN_MISMATCH
                break
        }
    }
}

```

{% endtab %}
{% endtabs %}


---

# 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:

```
GET https://docs.payments.thalescloud.io/pin-management/es/implementar-la-gestion-de-pin/cambiar-un-pin.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
