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. |
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.
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. | 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:
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:
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 |
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 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.
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.
Siguientes pasos
- Modifica un pago — Actualiza el monto de una preautorización.
- Parámetros de Deeplink — Campos completos de solicitud y respuesta de la preautorización.
- Códigos de resultado y estructuras de datos — Lista completa de códigos de estado.