> 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/1.-implement-hce-service.md).

# 1. Implementar el servicio HCE

## Descripción general

NFC Wallet SDK admite la emulación de tarjeta host de Android (HCE). Permite la emulación de tarjetas NFC e intercambiar APDU con un terminal POS a través de NFC.

Para obtener más detalles, consulte la documentación de Android: [Descripción general de la emulación de tarjeta basada en host](https://developer.android.com/develop/connectivity/nfc/hce).

Para continuar, primero implemente un servicio HCE como se describe en esta sección.

Después de registrar el servicio, verifique que aparezca en **Toque y paga** en la configuración de Android.

## Integración del SDK

### Extienda `AsyncHCEService`

Para gestionar pagos sin contacto, habilite el procesamiento de APDU extendiendo `AsyncHCEService`.

No necesita anular ningún método.

Use las anulaciones solo si desea registrar o personalizar el manejo de APDU.

```java
public class MyHCEService extends AsyncHCEService {

    // Anular 'processCommandApdu' es opcional
    // La aplicación de billetera digital puede capturar el tiempo de procesamiento de APDU.
    @Override
    public byte[] processCommandApdu(byte[] inputApdu, Bundle bundle) {
        // Devuelve el valor del SDK (siempre 'null').
        // El procesamiento de APDU es asíncrono.
        // El SDK envía automáticamente la APDU de respuesta al terminal POS.
        return super.processCommandApdu(inputApdu, bundle);
    }

    // Anular 'onApduResponse' es opcional
    // La aplicación de billetera digital puede inspeccionar o anular la APDU de respuesta.
    @Override
    public boolean onApduResponse(final byte[] inputApdu, final Bundle extras, final byte[] responseApdu){
        // La aplicación de billetera digital puede registrar responseApdu.

        // Si desea anular la respuesta y contestar al terminal POS:
        // 1. modifique responseAPDU
        // 2. sendResponseApdu(modifiedResponseApdu);
        // 3. return true; indica al SDK que la respuesta ya se envió.

        // De lo contrario, devuelva false y deje que el SDK envíe responseApdu.
        return false;
    }
}
```

{% hint style="info" %}
NFC Wallet SDK suspende el procesamiento de APDU cuando se requiere autenticación.

El procesamiento de APDU se reanuda después de que la autenticación se realiza correctamente, se aborta o se desactiva el servicio HCE.
{% endhint %}

{% hint style="danger" %}
Algunos dispositivos bloquean los inicios en segundo plano de una `Activity` para el mensaje emergente de autenticación adicional. Esto puede bloquear los pagos sin contacto hasta que llame a `deactivate()`.

Su aplicación de billetera digital puede implementar un tiempo de espera y llamar a `deactivate()` para desbloquear el flujo de pago sin contacto.
{% endhint %}

### Registre el servicio en `AndroidManifest.xml`

Registre su servicio HCE (la clase que extiende `AsyncHCEService`) como `HOST_APDU_SERVICE` en su manifiesto.

```xml
<!-- El nombre del servicio debe coincidir con la estructura de su paquete. -->
<service android:name="com.mycompany.myapplication.myservices.MyHCEService"
  android:exported="true"
  android:label="@string/app_name"
  android:permission="android.permission.BIND_NFC_SERVICE">
  <intent-filter>
    <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
  </intent-filter>
  <meta-data
    android:name="android.nfc.cardemulation.host_apdu_service"
    android:resource="@xml/apduservice"/>
</service>
```

{% hint style="info" %}
Cree `apduservice.xml` en `res/xml` para declarar los AID compatibles.
{% endhint %}

### Declare los AID compatibles

Cree `apduservice.xml` en `res/xml`.

Declare el AID de PPSE y los AID de red de pago que admite.

```xml
 <?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
  android:description="@string/hce_service_description"
  android:requireDeviceUnlock="false"
  android:apduServiceBanner="@drawable/hce_banner">
  <aid-group
    android:description="@string/aid_description"
    android:category="payment">
    <!-- AID de PPSE requerido -->
    <aid-filter android:name="325041592E5359532E4444463031"/>
    <!-- AID de Mastercard -->
    <aid-filter android:name="A0000000041010"/>
    <aid-filter android:name="A0000000043060"/>
    <aid-filter android:name="A0000000042010"/>
    <!-- AID de Visa -->
    <aid-filter android:name="A0000000031010"/>
    <aid-filter android:name="A0000000980840"/>
    <aid-filter android:name="A0000000032020"/>
    <aid-filter android:name="A0000000032010"/>
    
  </aid-group>
</host-apdu-service>
```

En el ejemplo anterior:

* El AID de PPSE requerido es:
  * `325041592E5359532E4444463031`
* Los AID de Mastercard son:
  * `A0000000041010`
  * `A0000000043060`
  * `A0000000042010`
* Los AID de Visa son:
  * `A0000000031010`
  * `A0000000980840`
  * `A0000000032020`
  * `A0000000032010`

{% hint style="info" %}
La lista de AID depende de su programa NFC Wallet. Confirme la lista con el representante de su red de pago.
{% endhint %}

### Verificar la configuración de Toque y paga

Después de registrar el servicio HCE en `AndroidManifest.xml`, aparece en **Toque y paga** en la configuración de Android.

Para verificar:

1. Abra **Configuración** en el dispositivo.
2. Vaya a **Toque y paga**.
3. Confirme que su aplicación aparezca en la lista.

<figure><img src="/files/189bc938d14d1c4e63b92a58972be56b82acb831" alt="" width="375"><figcaption><p>Configuración de Android que muestra la aplicación en la lista bajo Toque y paga.</p></figcaption></figure>


---

# 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/1.-implement-hce-service.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.
