Getnet DocsGetnet Docs

Crie um pagamento parcelado com planos

Este guia mostra como processar pagamentos com cartão de crédito parcelados usando o Getnet Payment App. Você pode deixar o terminal calcular os juros (modo Manual) ou enviar o valor final já calculado pelo seu próprio sistema (modo Calculado).

Antes de começar

Antes de seguir os passos, você precisa de:

  • Getnet Payment App instalado no terminal.
  • Usar cartão de crédito como meio de pagamento (paymentMethod="1").
  • O estabelecimento precisa estar autorizado para os planos de parcelamento específicos na configuração do seu Tax Engine.

Os parâmetros de parcelamento se aplicam somente a transações com cartão de crédito. Eles não valem para débito, QR Code ou voucher.

Como funciona

Quando um cartão de crédito é detectado, o terminal valida o plano solicitado contra as configurações autorizadas do estabelecimento por meio de um Tax Engine. Entender essa validação ajuda você a prever o comportamento do terminal:

EtapaCondiçãoComportamento do terminal
SeleçãoSe os parâmetros planId ou installments estiverem ausentesO terminal exibe uma tela de seleção para o operador escolher o plano manualmente.
Validação do planoSe o planId informado corresponder à resposta do Tax EngineO terminal pula a tela de seleção de plano.
Validação das parcelasSe o valor de installments for compatível com a resposta do Tax EngineO terminal pula a tela de seleção de parcelas e segue para a confirmação.
AjusteSe o plano solicitado não estiver autorizado ou divergir do Tax EngineO terminal obriga o usuário a selecionar manualmente uma opção válida e autorizada.

Passo 1: escolha o modo de operação

Antes de iniciar a transação, defina o operationMode. Esse parâmetro controla como os valores da transação são calculados:

Modo de operaçãoValorComportamento
Manual“0” (padrão)O terminal calcula os valores finais da transação com base em regras de negócio internas e nos dados que o usuário informa em tempo real durante o fluxo de pagamento.
Calculado“1”A aplicação de terceiros é responsável por fazer os cálculos e enviar o valor final; o terminal recebe os dados sem aplicar nenhuma modificação.

Se o operationMode não for especificado, o terminal assume o modo manual ("0").

Passo 2: crie o pagamento parcelado

Para processar um pagamento parcelado, você precisa criar um Intent com a operação de pagamento e incluir os parâmetros específicos de parcelamento.

Como funciona a validação de plano e parcelas

O terminal faz uma validação em duas etapas contra o Tax Engine:

  1. Validação do plano: se o planId que você envia corresponder aos planos autorizados do estabelecimento retornados pelo Tax Engine, o terminal pula a tela de seleção de plano.

  2. Validação das parcelas: depois de validar o plano, se o valor de installments for compatível com a resposta do Tax Engine para aquele plano, o terminal também pula a tela de seleção de parcelas.

Somente quando as duas validações passam o terminal segue direto para a tela de confirmação. Se qualquer uma falhar, o terminal pede que o usuário selecione manualmente uma opção válida e autorizada.

A tabela abaixo lista os parâmetros que você pode enviar no Intent:

ParâmetroTipoDescriçãoObrigatório
amountStringValor da transação com duas casas decimais implícitas (por exemplo, “10000” = $100.00).Sim
originalAmountStringValor em moeda local para realizar a transação.Sim
tipStringValor da gorjeta a ser somado ao total da transação. A representação decimal é a mesma do parâmetro amount (por exemplo, “500” = $5.00).Não
waiterCodeStringCódigo do garçom para atribuição da gorjeta. Obrigatório se uma gorjeta for informada.Condicional
receiptCodeStringCódigo de identificação a ser impresso no recibo.Sim
callerIdStringIdentificador único para correlacionar a requisição com a resposta.Sim
paymentMethodStringMeio de pagamento: "1" para Cartão, "2" para QR Code. Se não for especificado, o usuário será solicitado a escolher.Não
installmentsStringNúmero de parcelas desejado. Aplicável somente a transações de crédito.Não
planIdStringID do plano de parcelamento. Consulte os planos disponíveis para o seu mercado.Não
interestStringIndica se o plano de parcelamento tem juros ("true") ou é sem juros ("false").Não
operationModeStringDefine o modo de cálculo: "0" para manual (o terminal calcula) ou "1" para calculado (a aplicação calcula). Consulte o guia Estratégia de cálculo de juros.Não
skipConfirmationStringDefina como "true" para pular as telas de confirmação dos detalhes do parcelamento; "false" (padrão) exibe a tela normalmente - o usuário precisa interagir para prosseguir.Não
skipReceiptStringDefina como "true" para suprimir a tela de visualização do recibo do cliente após a aprovação. "false" (padrão) exibe a tela normalmente.Não
allowPrintCurrentTransactionStringDefina como "true" para a Getnet cuidar da impressão do recibo (comportamento padrão), "false" para receber os dados brutos do recibo. Consulte o guia Responsabilidade de impressão.Não

O bloco de código a seguir mostra um exemplo de como criar um pagamento parcelado:

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"))
    
    // Mandatory for Payment
    intent.putExtra("amount", "10000") // $100.00
    intent.putExtra("originalAmount", "10000")
    intent.putExtra("callerId", "123456")
    intent.putExtra("receiptCode", "654321")
    
    // Specific for Installments and Plans
    intent.putExtra("installments", 5) 
    intent.putExtra("planId", "plan_emisor")
    intent.putExtra("interest", "false")
    intent.putExtra("operationMode", "1") // Calculated mode
    intent.putExtra("skipConfirmation", "false")
    
    startActivityForResult(intent, REQUEST_CODE)
}

Passo 3: trate a resposta

Depois que o cliente conclui a transação, o Getnet Payment App devolve os detalhes finais do plano confirmado para a sua aplicação via onActivityResult.

Parâmetros de resposta

A tabela a seguir lista os parâmetros de resposta que você recebe:

ParâmetroTipoDescrição
resultStringResultado da transação: "0" indica sucesso. Consulte a referência Códigos de resultado para todos os códigos.
resultDetailsStringMensagem detalhada sobre o resultado da transação (por exemplo, “APPROVED”, descrições de erro)
amountStringValor final da transação com duas casas decimais implícitas
tipStringValor da gorjeta somado à transação (se informado)
waiterCodeStringCódigo do garçom para atribuição da gorjeta (se informado)
receiptCodeStringCódigo de identificação impresso no recibo
callerIdStringIdentificador único enviado na requisição para correlacionar com a resposta
nsuStringCódigo de autorização da transação na Getnet - único por terminal (não pode se repetir no mesmo dia)
authorizationCodeStringCódigo de autorização fornecido pelo emissor do cartão
paymentTypeStringTipo de pagamento usado: crédito, débito, voucher etc.
brandStringBandeira do cartão (por exemplo, “VISA”, “MASTERCARD”)
cardBinStringPrimeiros 8 dígitos do cartão (BIN)
cardLastDigitsStringÚltimos 4 dígitos do cartão usado
inputTypeStringMétodo de leitura do cartão: "021" (tarja magnética), "051" (chip), "071" (chip por aproximação), "801" (tarja magnética - fallback)
gmtDateTimeStringData e hora GMT da transação (formato: MMDDhhmmss, GMT UTC 0)
installmentsStringNúmero de parcelas confirmado para a transação
planIdStringPlano de parcelamento selecionado ou validado durante a transação
interestStringIndica se houve juros: "true" (com juros) ou "false" (sem juros)
automationSlipStringDados do recibo em formato JSON (retornado quando allowPrintCurrentTransaction = "false"). Consulte o guia Responsabilidade de impressão.

O bloco de código a seguir mostra um exemplo de tratamento da resposta:

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: Extract transaction details
            val installments = extras?.getString("installments")
            val planId = extras?.getString("planId")
            val interest = extras?.getString("interest")
            val nsu = extras?.getString("nsu")
            val authCode = extras?.getString("authorizationCode")
            val amount = extras?.getString("amount")
            
            Log.d("Payment", "Payment approved with $installments installments")
            Log.d("Payment", "Plan: $planId, Interest: $interest")
            Log.d("Payment", "NSU: $nsu, Auth Code: $authCode")
        } else {
            // FAILURE: Handle error
            val errorDetails = extras?.getString("resultDetails")
            Log.e("Payment", "Payment failed: $errorDetails (Code: $result)")
        }
    }
}

Exemplo de resposta bem-sucedida:

{
  "result": "0",
  "resultDetails": "APPROVED",
  "amount": "10000",
  "installments": "5",
  "planId": "plan_emisor",
  "interest": "false",
  "callerId": "123456",
  "nsu": "57003",
  "authorizationCode": "004433"
}

Próximos passos