Pagamentos
Métodos do PosPinpad para pagamentos com cartão, voucher, PIX e captura de cartão.
createPayment()
suspend fun createPayment(
type: TransactionType,
amount: Long,
paymentMethod: PaymentMethod?,
installments: Int,
installmentsInterest: Boolean? = false,
metadata: TransactionMetadata = TransactionMetadata.EMPTY
)
Inicia o fluxo de pagamento completo (captura de cartão → PIN → processamento → resultado). O resultado chega em onTransactionCompleted.
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
type | TransactionType | AUTHORIZATION (venda) ou PRE_AUTHORIZE (pré-autorização) |
amount | Long | Valor em centavos (1000 = R$ 10,00) |
paymentMethod | PaymentMethod? | CREDIT, DEBIT ou VOUCHER. null deixa o tipo ser definido pelo cartão. PIX usa createPixPayment |
installments | Int | Número de parcelas (1 = à vista). Ignorado em VOUCHER |
installmentsInterest | Boolean? | true = parcelado com juros (emissor); false = sem juros (lojista). Ignorado em VOUCHER |
metadata | TransactionMetadata | Dados do app que seguem até o gateway. Veja Configuração |
O terminal escolhe o adquirente pela bandeira e pelo produto do cartão. O nome de quem processou volta em receipt.acquirerName.
Sem terminalInitialization(), a chamada dispara onAppError(SdkErrorCode.TERMINAL_NOT_INITIALIZED, ...) e lança IllegalStateException.
Fluxo de callbacks (cartão):
onStartGetCard()— aguardando cartão; instruções ao portador chegam poronUiNotifyonRequestMenuSelection(...)/onRequestUserInput(...)— quando o cartão exige escolha ou dado do operadoronStartGetPinCoordinates(setPinCoordinates)— só na primeira senha do processo: o app fornece as coordenadas do PINonPinEntry(pinMask, message, amount)— atualização da máscaraonPinError(...)— senha offline incorreta (se aplicável)onTransactionCompleted(result)— resultado final- Se
result.requiresCardRemovalfortrue(cartão lido pelo chip, em qualquer status), chameremoveCard()e peça a retirada
Exemplos:
// Crédito à vista — R$ 50,00
posPinpad.createPayment(
type = TransactionType.AUTHORIZATION,
amount = 5000L,
paymentMethod = PaymentMethod.CREDIT,
installments = 1
)
// Crédito parcelado — R$ 300,00 em 3x sem juros
posPinpad.createPayment(
type = TransactionType.AUTHORIZATION,
amount = 30000L,
paymentMethod = PaymentMethod.CREDIT,
installments = 3,
installmentsInterest = false
)
// Débito — R$ 25,00
posPinpad.createPayment(
type = TransactionType.AUTHORIZATION,
amount = 2500L,
paymentMethod = PaymentMethod.DEBIT,
installments = 1
)
// Voucher — R$ 25,00 (sempre à vista)
posPinpad.createPayment(
type = TransactionType.AUTHORIZATION,
amount = 2500L,
paymentMethod = PaymentMethod.VOUCHER,
installments = 1
)
// Pré-autorização — R$ 100,00
posPinpad.createPayment(
type = TransactionType.PRE_AUTHORIZE,
amount = 10000L,
paymentMethod = PaymentMethod.CREDIT,
installments = 1
)
Voucher
Voucher é sempre à vista: com paymentMethod = VOUCHER, o SDK força 1 parcela sem juros e ignora installments e installmentsInterest. Ofereça a opção só quando getAvailableProducts(PaymentMethod.VOUCHER) não vier vazia. O saldo, quando a adquirente informa, vem em result.voucherBalance, inclusive em vendas negadas.
createPixPayment()
suspend fun createPixPayment(amount: Long, metadata: TransactionMetadata = TransactionMetadata.EMPTY)
Gera um pagamento PIX (QR Code). O payload chega por onPixQrCodeGenerated(qrCode, transactionId, amount, expiresInSeconds).
- PIX aprovado chega em
onTransactionCompleted. - QR Code expirado, inválido, não autorizado ou não pago dentro da validade chega como
onAppError(SdkErrorCode.PP_CANCEL, mensagem), com o motivo emmensagem. - O terminal acompanha o pagamento enquanto o QR Code for válido (validade definida pelo backend, informada em
expiresInSeconds; 2 minutos quando não informada), mais alguns segundos de folga.
Para cancelar um PIX, cancele o Job da coroutine que chamou createPixPayment (cancelPayment() não interrompe o PIX). O SDK continua consultando o status em segundo plano, para não perder um pagamento feito no último instante.
pixJob = lifecycleScope.launch { posPinpad.createPixPayment(2000L) }
// Operador desistiu
pixJob?.cancel()
cancelPayment()
fun cancelPayment()
Cancela a leitura de cartão em andamento e libera qualquer espera por cartão, coordenadas ou senha. O fluxo termina com onAppError(SdkErrorCode.PP_CANCEL, ...). Não cancela o PIX (veja createPixPayment()) e não há o que cancelar depois que a transação foi enviada ao autorizador. Exige o terminal inicializado.
getTransactionLimits()
fun getTransactionLimits(
transactionType: TransactionType,
paymentMethod: PaymentMethod,
installments: Int = 1
): TransactionLimits?
Consulta os limites configurados para uma operação (valor mín./máx., parcelas, valor por parcela), derivados da inicialização. É local: sem rede e sem cartão. Use antes de iniciar o pagamento para validar localmente.
- Retorna
nullquando a combinação não tem limite configurado ou a carga não foi feita. ApenasCREDIT/DEBITretornam valores. - Nos limites retornados, campos com
0significam "sem limite": compare só quando o limite for maior que zero.
val limites = posPinpad.getTransactionLimits(TransactionType.AUTHORIZATION, PaymentMethod.CREDIT, installments = 3)
val acimaDoMaximo = limites != null &&
limites.maxTransactionValueCents > 0 && valor > limites.maxTransactionValueCents
Veja TransactionLimits e o exemplo completo em Exemplos.
getAvailableProducts()
fun getAvailableProducts(paymentMethod: PaymentMethod): List<ProductInfo>
Produtos da carga de inicialização para o tipo informado. getAvailableProducts(PaymentMethod.VOUCHER) só devolve produtos quando a carga habilita voucher para o estabelecimento (merchant.voucherEnabled = true) e traz produtos voucher. Caso contrário, a lista vem vazia: não ofereça a opção.
Captura de Cartão
waitForCard()
suspend fun waitForCard(
waitContact: Boolean,
waitMagneticStripe: Boolean,
waitContactless: Boolean,
timeoutSeconds: Int
): CardReadType?
Aguarda um evento de cartão fora de um fluxo de pagamento por até timeoutSeconds. Retorna o tipo de leitura (CHIP, CONTACTLESS, MAGSTRIPE) ou null no timeout. Útil para melhorar a UX antes de iniciar a transação.
removeCard()
suspend fun removeCard()
Aguarda a retirada do cartão de chip. Chame sempre que result.requiresCardRemoval for true — inclusive em transações negadas ou com erro.
O tempo de espera do cartão nos fluxos de pagamento é configurável com setCardReadTimeouts. Veja Configuração.