> 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 de APDU, NFC Wallet SDK llama a su aplicación con eventos del ciclo de vida de pago.

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

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

## Integración del SDK

### Implemente `ContactlessPaymentServiceListener`

Cree una instancia de listener e implemente las devoluciones de llamada 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 solo se aplica a algunos métodos (por ejemplo, PIN de la billetera).
         * Úselo para indicar al usuario final durante cuánto tiempo sigue siendo válida la verificación.
         */
    }

    @Override
    public void onReadyToTap(PaymentService paymentService) {
        /*
         * Se activa después de una autenticación correcta.
         * Solicite al usuario final que acerque la tarjeta de nuevo antes de que caduque cvmResetTimeout.
         */
    }

    @Override
    public void onTransactionCompleted(TransactionContext transactionContext) {
        /*
         * Se activa cuando la transacción finaliza correctamente.
         * Use TransactionContext para mostrar detalles (importe, fecha y más).
         */
    }

    @Override
    public void onTransactionInterrupted() {
        /*
         * Se activa cuando se interrumpe el enlace NFC con el terminal POS.
         * Solicite al usuario final que acerque la tarjeta de nuevo.
         * Devolución de llamada opcional
         */
    }

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

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

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

### Devuelva el listener desde su servicio HCE

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

```java
public class MyHCEService extends AsyncHCEService {

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

## Flujo de devolución de llamada (típico)

Normalmente, las devoluciones de llamada se activan en este orden.

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

1. `onTransactionStarted()` después del primer intercambio de APDU con el terminal POS.
2. `onAuthenticationRequired()` cuando el usuario final debe completar CDCVM.
3. `onReadyToTap()` después de una autenticación correcta, para solicitar un segundo toque.
4. `onTransactionCompleted()` cuando la transacción finaliza correctamente.
5. `onTransactionInterrupted()` (opcional) cuando se pierde el enlace NFC con el terminal POS. Consulte [Gestionar 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.

## Gestionar desconexiones del terminal POS (opcional)

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

Use `onTransactionInterrupted()` para solicitar al usuario final que acerque la tarjeta de nuevo.

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 que falle 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.
