# Crear un pago preautorizado

Esta guía le orientará en el procesamiento de una transacción de preautorización utilizando la aplicación Get Smart. La preautorización le permite bloquear un importe específico en la tarjeta de un cliente sin capturar los fondos de inmediato. Esto se utiliza habitualmente en hoteles, alquiler de vehículos o escenarios donde el precio final del servicio está pendiente.

## Requisitos

Antes de comenzar, asegúrese de tener:

* **Perfil de comercio con soporte para preautorizaciones** - Contacte con el soporte de Get Smart para verificar que su cuenta admite este tipo de transacción
* **Aplicación Get Smart** instalada y configurada en el dispositivo Android
* **Permiso para lanzar Intents externos** en su aplicación

<Callout type="warning">

No todos los perfiles de comercio admiten preautorizaciones. Verifique con Get Smart que su cuenta está configurada para transacciones de preautorización antes de implementar esta funcionalidad.

</Callout>

## Proceso de la transacción de preautorización

Esta sección le guía a través del proceso de dos pasos para preautorizar y confirmar un pago con la integración Get Smart App2App. El flujo de trabajo implica dos llamadas de Intent distintas: la preautorización para retener los fondos y la confirmación para capturarlos.

### Paso 1: Ejecutar la preautorización

Una transacción de preautorización bloquea fondos en la tarjeta del cliente sin capturarlos de inmediato. Debe crear un Intent con el tipo de transacción `10` para iniciar la retención. La aplicación Get Smart procesa la preautorización y devuelve un ID de pedido (`ORDER`) que debe almacenar para su posterior confirmación.

La tabla siguiente enumera los parámetros que debe incluir en su Intent de preautorización:

| Parámetro | Tipo   | Obligatorio | Descripción                                       |
| :-------- | :----- | :------- | :----------------------------------------------- |
| `amount`  | double | Sí       | El importe a retener en la tarjeta                |
| `type`    | int    | Sí       | Establecer en `10` para transacciones de preautorización |
| `invoice` | String | No       | Número de pedido o identificador opcional para el seguimiento |

El siguiente ejemplo de código muestra cómo crear y lanzar un Intent de preautorización:

```java
// Define el código de petición para la gestión del resultado
static final int REQUEST_CODE_PREAUTH = 2001;

// Inicializa el Intent con la acción de Get Smart
Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");

// Añade los parámetros de preautorización
intent.putExtra("amount", 100.00);
intent.putExtra("type", 10); // 10 = Preautorización
intent.putExtra("invoice", "PRE-AUTH-001");

// Lanza el Intent
try {
    startActivityForResult(intent, REQUEST_CODE_PREAUTH);
} catch (ActivityNotFoundException e) {
    // Gestionar la ausencia de la aplicación Get Smart
    new AlertDialog.Builder(this)
        .setTitle("App Get Smart no encontrada")
        .setMessage("Por favor, instale y configure la aplicación Get Smart.")
        .setPositiveButton("OK", null)
        .show();
}
```

### Paso 2: Almacenar y confirmar la preautorización

Cuando la preautorización tiene éxito, la app Get Smart devuelve un parámetro `ORDER` a través del callback `onActivityResult`. Debe almacenar este ID de pedido para confirmar y capturar el pago más tarde. Las preautorizaciones suelen caducar entre 7 y 30 días, dependiendo del emisor de la tarjeta, por lo que debe confirmar la captura dentro de este plazo.

Para finalizar el pago, envíe una solicitud de confirmación utilizando el tipo de transacción `11` e incluya el ID del pedido original (`original_order`). El importe de la confirmación puede ser igual o inferior al importe preautorizado, dependiendo de la configuración de su contrato de comercio.

La tabla siguiente enumera los parámetros para el Intent de confirmación:

| Parámetro        | Tipo   | Obligatorio | Descripción                                                           |
| :--------------- | :----- | :------- | :------------------------------------------------------------------ |
| `amount`         | double | Sí       | El importe a capturar (igual o inferior al importe preautorizado)     |
| `type`           | int    | Sí       | Establecer en `11` para Confirmación de preautorización               |
| `original_order` | String | Sí       | El ID de pedido (`ORDER`) devuelto en la preautorización              |

El siguiente ejemplo de código muestra cómo gestionar el resultado de la preautorización y, posteriormente, confirmar la captura:

```java
// Gestionar el resultado de la preautorización
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == REQUEST_CODE_PREAUTH) {
        if (resultCode == RESULT_OK && data != null) {
            // Preautorización exitosa - almacenar el ID del pedido
            String orderId = data.getStringExtra("ORDER");
            String authCode = data.getStringExtra("AUTHORIZATION");
            
            // Almacenar orderId para su posterior confirmación
            savePreAuthOrderId(orderId);
        }
    } else if (requestCode == REQUEST_CODE_CONFIRM) {
        if (resultCode == RESULT_OK && data != null) {
            // Confirmación exitosa
            String orderId = data.getStringExtra("ORDER");
            // Procesar pago confirmado
        }
    }
}

// Más tarde, cuando esté listo para capturar los fondos
private void confirmPreAuthorization(String originalOrderId, double captureAmount) {
    static final int REQUEST_CODE_CONFIRM = 2002;
    
    Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
    intent.putExtra("amount", captureAmount);
    intent.putExtra("type", 11); // 11 = Confirmación de preautorización
    intent.putExtra("original_order", originalOrderId); // Obligatorio
    
    try {
        startActivityForResult(intent, REQUEST_CODE_CONFIRM);
    } catch (ActivityNotFoundException e) {
        // Gestionar la ausencia de la aplicación Get Smart
    }
}
```

<Callout type="note">

Algunas configuraciones de comercio permiten confirmar un importe inferior al autorizado originalmente (captura parcial). Consulte su contrato de comercio para verificar si esta funcionalidad está disponible para su cuenta.

</Callout>

### Próximos pasos

Ahora que ha procesado con éxito una transacción de preautorización, puede explorar más funciones de la integración Get Smart App2App:

* [Referencia de parámetros de respuesta](/es/get-smart/get-smart-app2app/reference/response-parameters) - Especificaciones completas de los campos de respuesta
* [Devolver un pago](/es/get-smart/get-smart-app2app/transaction-guides/transactions/refund-a-payment) - Aprenda cómo revertir transacciones
* [Referencia de parámetros de petición](/es/get-smart/get-smart-app2app/reference/request-parameters) - Especificaciones completas de parámetros