# Crie um pagamento pré-autorizado

Este guia mostra como processar uma transação de pré-autorização com o Getnet Payment App. A pré-autorização retém temporariamente um valor no cartão de crédito do cliente para uma captura futura. É comum em reservas de hotel ou aluguel de carros, quando o valor final pode variar.

## Antes de começar

Antes de seguir os passos, você precisa de:

* Getnet Payment App instalado no terminal.
* Conhecimento dos códigos de plano de parcelamento, se aplicável.

## Como funciona

Todas as ações de pré-autorização usam a URI `getnet://payment/v1/pre-auth`. O parâmetro `operation` seleciona a ação:

| `operation` | Ação | Descrição |
| :--- | :--- | :--- |
| `"0"` | Criar | Reserva o valor no cartão. |
| `"1"` | Modificar | Atualiza uma pré-autorização existente. |
| `"2"` | Remover | Cancela uma pré-autorização. |
| `"3"` | Confirmar | Captura o valor reservado. |
| `"4"` | Consultar | Lista as pré-autorizações pendentes. |

<Callout type="warning">

a operação de criação retorna um `authorizationRefCode`. Esse valor é o identificador da pré-autorização. Você o envia de volta como `reservation_id` para modificar, confirmar ou remover a pré-autorização. Guarde-o após cada criação.

</Callout>

## Passo 1: crie uma pré-autorização

Para reservar um valor no cartão do cliente, envie um Intent com `operation` definido como `"0"`.

**Parâmetros de requisição**

| Parâmetro | Descrição | Obrigatório |
| :--- | :--- | :--- |
| `operation` | Defina como `"0"` para criar a pré-autorização. | Sim |
| `originalAmount` | Valor em moeda local para realizar a transação. | Sim |
| `amount` | Valor a reservar. Os dois últimos dígitos são a parte decimal (ex.: `"10000"` = \$100.00). | Não |
| `installments` | Número de parcelas da transação de crédito. | Não |
| `plan_id` | Plano de parcelamento a ser usado. Consulte [Regras de parcelamento](/pt/app2app/reference-a2a/installment-rules). | Não |
| `interest` | Indica se o plano tem juros (`true`) ou é sem juros (`false`). | Não |
| `operationMode` | `"0"` para manual (o terminal calcula) ou `"1"` para calculado (o app calcula). | Não |
| `skipReceipt` | Defina como `"true"` para pular a tela de comprovante do cliente. | Não |
| `skipConfirmation` | Defina como `"true"` para pular a tela de confirmação dos detalhes de parcelamento. | Não |
| `callerId` | Identificador único para correlacionar a requisição com a resposta. | Não |
| `allowPrintCurrentTransaction` | Defina como `"false"` para receber os dados do comprovante em `automationSlip`. | Não |

O bloco de código abaixo mostra como criar uma pré-autorização:

```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 resposta**

| Parâmetro | Descrição | Obrigatório |
| :--- | :--- | :--- |
| `result` | Status da transação; `"0"` indica sucesso. | Sim |
| `resultDetails` | Informação adicional quando a transação falha. | Não |
| `amount` | Valor processado na reserva da pré-autorização. | Sim |
| `authorizationRefCode` | Identificador da pré-autorização. Guarde-o — você o envia como `reservation_id` para modificar, confirmar ou remover a pré-autorização. | Não |
| `inputType` | Forma de leitura do cartão (chip, aproximação ou tarja magnética). | Sim |
| `authorizationCode` | Código de autorização da transação fornecido pelo emissor. | Não |
| `nsu` | Código de autorização da transação Getnet para o terminal. | Não |
| `cardLastDigits` | Últimos 4 dígitos do cartão usado. | Não |
| `brand` | Bandeira do cartão (ex.: Visa, Mastercard). | Não |
| `gmtDateTime` | Data e hora da transação em UTC 0 (MMDDhhmmss). | Não |
| `automationSlip` | Dados do comprovante em JSON quando `allowPrintCurrentTransaction` é `"false"`. | Não |

Veja um exemplo de tratamento da resposta de criação:

```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)")
        }
    }
}
```

Guarde o `authorizationRefCode` retornado na resposta. Esse identificador é obrigatório para confirmar, modificar ou remover a pré-autorização. Se você não informá-lo nas operações seguintes, o valor é liberado automaticamente quando o prazo da reserva expira.

## Passo 2: confirme a pré-autorização

Depois de entregar o serviço ou o produto, confirme a pré-autorização para transformar a reserva temporária em pagamento definitivo. Essa operação captura o valor e conclui a transação.

**Parâmetros de requisição**

| Parâmetro | Descrição | Obrigatório |
| :--- | :--- | :--- |
| `operation` | Defina como `"3"` para capturar o valor pré-autorizado. | Sim |
| `reservation_id` | O `authorizationRefCode` recebido no Passo 1. | Sim |
| `amount` | Valor final atualizado a capturar. Se omitido, o app usa o valor originalmente reservado. | Não |

```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)
}
```

Confirme o sucesso verificando se `result` é igual a `"0"` em `onActivityResult`.

## Modifique uma pré-autorização

Para atualizar o valor reservado antes da captura, envie `operation` definido como `"1"` junto com o `reservation_id`. Consulte [Modifique um pagamento](/pt/app2app/post-payment-a2a/modify-payment) para ver o fluxo completo.

## Remova uma pré-autorização

Para cancelar uma pré-autorização e liberar o valor reservado, envie `operation` definido como `"2"` junto com o `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)
}
```

## Consulte as pré-autorizações pendentes

Para listar as pré-autorizações pendentes, envie `operation` definido como `"4"`. Você pode restringir os resultados com os parâmetros de filtro `filterReservationId`, `filterInitialDate`, `filterFinalDate`, `filterAuthorizationCode`, `filterCardLastDigits` e `filterAllowedBrands`. A resposta traz uma lista `pendingAuthorizations` com até as 30 pré-autorizações pendentes mais recentes. Consulte [Parâmetros de deeplink](/pt/app2app/reference-a2a/deeplink-parameters).

## Próximos passos

* [Modifique um pagamento](/pt/app2app/post-payment-a2a/modify-payment) — atualize o valor de uma pré-autorização.
* [Parâmetros de deeplink](/pt/app2app/reference-a2a/deeplink-parameters) — campos completos de requisição e resposta da pré-autorização.
* [Códigos de resultado e estruturas de dados](/pt/app2app/reference-a2a/result-codes-data-structure) — lista completa dos códigos de status.