# Crea un pago preautorizado

En esta guía procesas una transacción de preautorización con la Getnet Payment App. La preautorización retiene fondos de forma temporal en la tarjeta de crédito del cliente para una captura posterior. Se usa en reservas de hotel o alquiler de autos, donde el monto final puede variar.

## Antes de comenzar

Antes de seguir los pasos, necesitas:

* La Getnet Payment App instalada en el terminal.
* Conocer los códigos de los planes de cuotas, si aplica.

## Cómo funciona

Todas las acciones de preautorización usan el URI `getnet://payment/v1/pre-auth`. El parámetro `operation` selecciona la acción:

| `operation` | Acción | Descripción |
| :--- | :--- | :--- |
| `"0"` | Crear | Reserva fondos en la tarjeta. |
| `"1"` | Modificar | Actualiza una preautorización existente. |
| `"2"` | Eliminar | Cancela una preautorización. |
| `"3"` | Confirmar | Captura los fondos reservados. |
| `"4"` | Consultar | Lista las preautorizaciones pendientes. |

<Callout type="warning">

la operación de creación devuelve un `authorizationRefCode`. Ese valor es el identificador de la preautorización. Lo envías de vuelta como `reservation_id` para modificar, confirmar o eliminar la preautorización. Guárdalo después de cada creación.

</Callout>

## Paso 1: Crea una preautorización

Para reservar un monto en la tarjeta del cliente, envía un Intent con `operation` en `"0"`.

**Parámetros de solicitud**

| Parámetro | Descripción | Obligatorio |
| :--- | :--- | :--- |
| `operation` | Define `"0"` para crear la preautorización. | Sí |
| `originalAmount` | Valor en moneda local para realizar la transacción. | Sí |
| `amount` | Valor que se va a reservar. Los dos últimos dígitos son la parte decimal (por ejemplo, `"10000"` = \$100.00). | No |
| `installments` | Cantidad de cuotas de la transacción de crédito. | No |
| `plan_id` | Plan de cuotas que se va a usar. Consulta [Reglas de cuotas](/es/app2app/reference-a2a/installment-rules). | No |
| `interest` | Indica si el plan incluye interés (`true`) o es sin interés (`false`). | No |
| `operationMode` | `"0"` para manual (calcula el terminal) o `"1"` para calculado (calcula la app). | No |
| `skipReceipt` | Define `"true"` para omitir la pantalla del comprobante del cliente. | No |
| `skipConfirmation` | Define `"true"` para omitir la pantalla de confirmación del detalle de cuotas. | No |
| `callerId` | Identificador único para correlacionar la solicitud con la respuesta. | No |
| `allowPrintCurrentTransaction` | Define `"false"` para recibir los datos del comprobante como `automationSlip`. | No |

Este bloque de código muestra cómo crear una preautorización:

```kotlin
private val REQUEST_CODE = 1001

private fun createPreAuth() {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/pre-auth"))

    intent.putExtra("operation", "0") // 0 = create
    intent.putExtra("amount", "10000") // $100.00
    intent.putExtra("originalAmount", "10000")
    intent.putExtra("installments", "1")
    intent.putExtra("plan_id", "plan_emisor")
    intent.putExtra("operationMode", "0")
    intent.putExtra("skipReceipt", "true")

    startActivityForResult(intent, REQUEST_CODE)
}
```

**Parámetros de respuesta**

| Parámetro | Descripción | Obligatorio |
| :--- | :--- | :--- |
| `result` | Estado de la transacción; `"0"` indica éxito. | Sí |
| `resultDetails` | Información adicional cuando la transacción falla. | No |
| `amount` | Valor procesado para la retención de la preautorización. | Sí |
| `authorizationRefCode` | Identificador de la preautorización. Guárdalo: lo envías como `reservation_id` para modificar, confirmar o eliminar la preautorización. | No |
| `inputType` | Método de lectura de la tarjeta (chip, contactless o banda magnética). | Sí |
| `authorizationCode` | Código de autorización de la transacción entregado por el emisor. | No |
| `nsu` | Código de autorización de la transacción de Getnet para el terminal. | No |
| `cardLastDigits` | Últimos 4 dígitos de la tarjeta usada. | No |
| `brand` | Marca de tarjeta (por ejemplo, Visa, Mastercard). | No |
| `gmtDateTime` | Marca de tiempo de la transacción en UTC 0 (MMDDhhmmss). | No |
| `automationSlip` | Datos del comprobante en formato JSON cuando `allowPrintCurrentTransaction` es `"false"`. | No |

Este es un ejemplo de cómo manejar la respuesta de la creación:

```kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val extras = data?.extras
        val result = extras?.getString("result")

        if (result == "0") {
            // SUCCESS: store the pre-authorization identifier
            val reservationId = extras?.getString("authorizationRefCode")
            val amount = extras?.getString("amount")

            // Store authorizationRefCode - you send it as reservation_id later
            saveReservationId(reservationId)
        } else {
            val errorDetails = extras?.getString("resultDetails")
            Log.e("PreAuth", "Pre-authorization failed: $errorDetails (Code: $result)")
        }
    }
}
```

Guarda el `authorizationRefCode` de la respuesta. Este identificador es obligatorio para confirmar, modificar o eliminar la preautorización. Si no lo envías en las operaciones siguientes, los fondos se liberan automáticamente cuando vence el período de retención.

## Paso 2: Confirma una preautorización

Después de entregar el servicio o el producto, confirma la preautorización para convertir la retención temporal en un pago final. Esta operación captura los fondos y completa la transacción.

**Parámetros de solicitud**

| Parámetro | Descripción | Obligatorio |
| :--- | :--- | :--- |
| `operation` | Define `"3"` para capturar los fondos preautorizados. | Sí |
| `reservation_id` | El `authorizationRefCode` recibido en el paso 1. | Sí |
| `amount` | Monto final actualizado que se va a capturar. Si lo omites, la app usa el valor retenido original. | No |

```kotlin
private fun confirmPreAuth(reservationId: String, finalAmount: String? = null) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/pre-auth"))

    intent.putExtra("operation", "3") // 3 = confirm
    intent.putExtra("reservation_id", reservationId)

    finalAmount?.let { intent.putExtra("amount", it) }

    startActivityForResult(intent, REQUEST_CODE)
}
```

Confirma el éxito verificando que `result` sea igual a `"0"` en `onActivityResult`.

## Modifica una preautorización

Para actualizar el monto retenido antes de la captura, envía `operation` en `"1"` junto con el `reservation_id`. Consulta [Modifica un pago](/es/app2app/post-payment-a2a/modify-payment) para ver el flujo completo.

## Elimina una preautorización

Para cancelar una preautorización y liberar los fondos retenidos, envía `operation` en `"2"` junto con el `reservation_id`.

```kotlin
private fun removePreAuth(reservationId: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/pre-auth"))

    intent.putExtra("operation", "2") // 2 = remove
    intent.putExtra("reservation_id", reservationId)

    startActivityForResult(intent, REQUEST_CODE)
}
```

## Consulta las preautorizaciones pendientes

Para listar las preautorizaciones pendientes, envía `operation` en `"4"`. Puedes acotar los resultados con los parámetros de filtro `filterReservationId`, `filterInitialDate`, `filterFinalDate`, `filterAuthorizationCode`, `filterCardLastDigits` y `filterAllowedBrands`. La respuesta devuelve una lista `pendingAuthorizations` con hasta las 30 preautorizaciones pendientes más recientes. Consulta [Parámetros de Deeplink](/es/app2app/reference-a2a/deeplink-parameters).

## Siguientes pasos

* [Modifica un pago](/es/app2app/post-payment-a2a/modify-payment) — Actualiza el monto de una preautorización.
* [Parámetros de Deeplink](/es/app2app/reference-a2a/deeplink-parameters) — Campos completos de solicitud y respuesta de la preautorización.
* [Códigos de resultado y estructuras de datos](/es/app2app/reference-a2a/result-codes-data-structure) — Lista completa de códigos de estado.