# Pagamento com QR Code

Este guia mostra como iniciar e processar pagamentos com QR Code usando a integração App2App da Getnet em terminais Android. O pagamento com QR Code é uma opção sem contato que o cliente conclui pela carteira digital do celular.

## Antes de começar

Antes de começar, confirme que você tem:

* **Polling concluído**: faça uma [chamada de Polling](/pt/app2app/first-steps-a2a/create-polling-guide) (`getnet://payment/v1/polling`) para verificar se o Getnet Payment App está conectado corretamente e pronto para receber comandos.
* **Aplicativo Getnet instalado** no terminal.

> **Limitações de parâmetros**: recursos como gorjeta (`tip`), parcelamento (`installments`) e IDs de plano (`planId`) não são suportados no fluxo de QR Code. O Payment App ignora esses parâmetros se você enviá-los.

## Passo 1: configure e envie o Intent de pagamento

Para processar um pagamento com QR Code, configure o Intent com os parâmetros obrigatórios e defina `paymentMethod` como `"2"`.

A tabela abaixo descreve os parâmetros que você precisa incluir na requisição de pagamento:

| Parâmetro | Tipo | Obrigatório | Descrição |
| :--- | :--- | :--- | :--- |
| `amount` | String | Sim | Valor da transação (com duas casas decimais implícitas, ex.: "10000" = \$100.00) |
| `receiptCode` | String | Sim | ID impresso no comprovante para rastreamento do estabelecimento. |
| `callerId` | String | Não | Identificador único para correlacionar a requisição com a resposta |
| `paymentMethod` | String | Sim | Defina como `"2"` para disparar o fluxo de pagamento com QR Code |
| `skipReceipt` | String | Não | Defina como `"true"` para ocultar a tela de visualização do comprovante do cliente após a aprovação |
| `allowPrintCurrentTransaction` | String | Não | Defina como `"true"` para a Getnet cuidar da impressão do comprovante (padrão), `"false"` para receber os dados brutos do comprovante |

Veja a implementação completa:

```
private val REQUEST_CODE = 1001  

override fun onCreate(savedInstanceState: Bundle?) {      
    super.onCreate(savedInstanceState)
    
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/payment"))
    intent.putExtra("amount", "10000")           // $100.00
    intent.putExtra("receiptCode", "000123")
    intent.putExtra("callerId", "qr_payment_001")
    intent.putExtra("paymentMethod", "2")        // 2 = QR Code
    
    startActivityForResult(intent, REQUEST_CODE)
}
```

## Passo 2: acompanhe o fluxo de interface do terminal

Quando o Intent é enviado, o Getnet Payment App assume o controle da interface. Considere os seguintes comportamentos de tempo limite:

1. **Exibição do QR Code (Tela A)**: o terminal exibe o QR Code por 180 segundos. Se ninguém ler o código nesse período, a transação expira.

2. **Processamento (Tela B)**: após a leitura, o app aguarda até 60 segundos para a carteira externa autorizar o pagamento.

## Passo 3: extraia a resposta

O terminal Getnet devolve o resultado da transação pelo método `onActivityResult`.

Veja um exemplo de resposta de um pagamento com QR Code aprovado:

```
{
  "result": "0",
  "resultDetails": "APPROVED",
  "amount": "10000",
  "nsu": "57003",
  "callerId": "qr_payment_001",
  "authorizationCode": "004433",
  "gmtDateTime": "0115164500",
  "paymentType": "QRCODE"
}
```

**Parâmetros de resposta**

A resposta inclui os campos abaixo, com informações importantes da transação:

| Campo | Descrição |
| :--- | :--- |
| result | Código de status da transação: `"0"` (sucesso), `"1"` (negada), `"2"` (cancelada), `"3"` (erro), `"4"` (desconhecido) |
| resultDetails | Mensagem detalhada sobre o resultado da transação (ex.: "APPROVED", "TIMEOUT") |
| paymentType | Meio de pagamento usado. Em pagamentos com QR Code, o valor é `"QRCODE"` |
| nsu | Código de autorização da transação Getnet (NSU). Guarde esse valor para conciliação e reembolsos |
| authorizationCode | Código de autorização fornecido pelo processador de pagamento |
| amount | Valor final processado da transação |
| gmtDateTime | Data e hora GMT em que a transação foi processada (formato: MMDDhhmmss) |
| callerId | Repete o identificador único enviado na requisição original |

Veja como extrair esses campos no seu código:

```
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")                // "0" = Success
        val resultDetails = extras?.getString("resultDetails")  // e.g., "APPROVED"
        val nsu = extras?.getString("nsu")                      // Getnet Reference
        val authCode = extras?.getString("authorizationCode")   // Authorization Code
        val paymentType = extras?.getString("paymentType")      // Will be "QRCODE"
    }
}
```

## Próximos passos

Agora que você implementou pagamentos com QR Code, você pode:

- Aprender a processar [reembolso e cancelamento](/pt/app2app/core-concept-a2a/refund-and-cancellation) em transações com QR Code
- Implementar a [impressão personalizada de comprovantes](/pt/app2app/core-concept-a2a/printing-responsibility) com o parâmetro `automationSlip`
- Conhecer os [pagamentos em etapa única](/pt/app2app/payment-guides-a2a/create-single-step-payment) para acelerar o checkout