> 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/nfc-wallet-sdk-android/es/implement-nfc-wallet/make-payment/implement-contactless-payments/2.-implement-contactless-payment-callbacks.md).

# 2. Implementar callbacks de pago sin contacto

## Resumen

Durante el procesamiento APDU, el SDK de cartera NFC llama a su aplicación con eventos del ciclo de vida del pago.

Implemente `ContactlessPaymentServiceListener` en su aplicación de billetera digital para:

* Detectar cuándo comienza y termina una transacción sin contacto.
* Activar la autenticación adicional cuando se requiera CDCVM.
* Manejar errores y recuperarse para la siguiente transacción.

## Integración del SDK

### Implemente `ContactlessPaymentServiceListener`

Cree una instancia del listener e implemente los callbacks que necesite.

```java
// Instanciar un listener para el servicio HCE.
PaymentServiceListener myPaymentListener = new ContactlessPaymentServiceListener() {

    @Override
    public void onTransactionStarted() {
        /*
         * Se activa cuando se intercambia el primer APDU con el terminal POS.
         */
    }

    @Override
    public void onAuthenticationRequired(
            PaymentService activatedPaymentService,
            CHVerificationMethod chVerificationMethod,
            long cvmResetTimeout) {
        /*
         * Se activa cuando el usuario final debe autenticarse (CDCVM).
         *
         * Use chVerificationMethod para determinar el método requerido.
         * cvmResetTimeout se aplica solo a algunos métodos (por ejemplo, PIN de la billetera).
         * Úselo para indicar al usuario final cuánto tiempo permanece válida la verificación.
         */
    }

    @Override
    public void onReadyToTap(PaymentService paymentService) {
        /*
         * Se activa después de la autenticación exitosa.
         * Solicite al usuario final que vuelva a acercar (tocar) antes de que expire cvmResetTimeout.
         */
    }

    @Override
    public void onTransactionCompleted(TransactionContext transactionContext) {
        /*
         * Se activa cuando la transacción se completa con éxito.
         * Use TransactionContext para mostrar detalles (monto, fecha y más).
         */
    }

    @Override
    public void onTransactionInterrupted() {
        /*
         * Se activa cuando se interrumpe el enlace NFC con el terminal POS.
         * Indique al usuario final que vuelva a acercar (tocar).
         * Callback opcional
         */
    }

    @Override
    public void onError(
            TransactionContext transactionContext,
            PaymentServiceErrorCode paymentServiceErrorCode,
            String message) {
        /*
         * Se activa cuando la transacción no puede completarse con éxito.
         */
    }

    @Override
    public void onFirstTapCompleted() {
        /*
         * Indica que el procesamiento APDU del primer toque se completó.
         * Compatible solo para transacciones basadas en PFP.
         */
    }

    @Override
    public void onNextTransactionReady(
            DeactivationStatus deactivationStatus,
            DigitalizedCardStatus digitalizedCardStatus,
            DigitalizedCard digitalizedCard) {
        /*
         * Se activa después de que se completa una transacción.
         * Úselo para verificar el estado de la tarjeta y prepararse para el siguiente pago.
         */
    }
};
```

### Devuelva el listener desde su servicio HCE

En su clase que extienda `AsyncHCEService`, devuelva el listener desde `setupListener()`.

```java
public class MyHCEService extends AsyncHCEService {

    @Override
    public PaymentServiceListener setupListener() {
        return myPaymentListener;
    }
}
```

## Flujo de callbacks (típico)

Los callbacks usualmente se activan en este orden.

`onTransactionInterrupted()` puede ocurrir en cualquier momento después de `onTransactionStarted()`.

1. `onTransactionStarted()` después del primer intercambio APDU con el terminal POS.
2. `onAuthenticationRequired()` cuando el usuario final debe completar CDCVM.
3. `onReadyToTap()` después de la autenticación exitosa, para solicitar un segundo toque.
4. `onTransactionCompleted()` cuando la transacción se completa con éxito.
5. `onTransactionInterrupted()` (opcional) cuando el enlace NFC con el terminal POS se cae. Ver [Manejar desconexiones del terminal POS](#handle-pos-terminal-disconnects-optional).
6. `onNextTransactionReady()` cuando el SDK está listo para la siguiente transacción.

Si ocurre un error, el SDK activa `onError()` en lugar de completar el flujo.

## Manejar desconexiones del terminal POS (opcional)

El SDK puede notificarle cuando se interrumpe el enlace NFC con el terminal POS.

Use `onTransactionInterrupted()` para indicar al usuario final que vuelva a acercar (tocar).

Configure el comportamiento de reintento antes de iniciar los pagos sin contacto:

* `PaymentSetting.setRetryLimit(int)`

  Establece cuántas desconexiones del terminal POS se toleran antes de fallar la transacción.

  El valor predeterminado es `0`.

  Con `0`, el SDK activa `onError()` en la primera desconexión.
* `PaymentSetting.setTransactionRetryTimeout(long)`

  Establece cuánto tiempo puede reintentar el terminal POS después de una desconexión.

  Si no se recibe ningún APDU durante este intervalo, el SDK activa `onError()`.

  El rango es `500` a `10000` milisegundos.

  El valor predeterminado es `2000` milisegundos.


---

# 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/nfc-wallet-sdk-android/es/implement-nfc-wallet/make-payment/implement-contactless-payments/2.-implement-contactless-payment-callbacks.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.
