Recusas de Pagamento
Visão Geral
A criação de uma cobrança na Selectwin é assíncrona. Quando você chama POST /v1/transactions
(ou cria/renova uma Assinatura), a API responde imediatamente com
201 Created e a transação nasce com status: "pending". A cobrança junto ao adquirente é
processada em segundo plano.
Por isso, uma recusa de cartão normalmente NÃO chega como um erro HTTP síncrono nessa chamada. O resultado da cobrança — incluindo uma recusa — aparece de duas formas:
- No objeto da transação, cujo
statuspassa afailed(recusa). - Em um webhook: a recusa dispara o evento
transaction.failed(ver Catálogo de Eventos).
Como acompanhar o resultado da cobrança
| Sinal | Onde aparece | Significado |
|---|---|---|
status: "pending" | resposta 201 da criação | Cobrança ainda em processamento |
status: "approved" | objeto da transação + webhook transaction.approved | Pagamento aprovado |
status: "failed" | objeto da transação + webhook transaction.failed | Cobrança recusada |
Os status possíveis de uma transação incluem pending, pre-authorized, approved, failed,
refused, canceled, refunded, chargeback, dispute, fraud-review, analyzing e awaiting.
O motivo da recusa (payment.refused)
Quando a cobrança falha, o objeto da transação (e o payload do webhook transaction.failed) traz o motivo em
payment.refused. Nas demais transações o campo é null.
{
"status": "failed",
"payment": {
"refused": {
"code": "insufficientFundsError",
"type": "cardError",
"category": "payment",
"message": "Insufficient funds or limit.",
"displayMessage": "Saldo ou limite insuficiente para realizar esta compra. Verifique o limite disponível ou use outro cartão.",
"reversible": false
}
}
}| Campo | O que é |
|---|---|
code | Código estável da recusa (tabela abaixo). É por ele que você deve decidir. |
type | cardError · invalidRequestError · processingError |
category | Quem precisa agir: payment (o cartão/emissor recusou) · validation (dados enviados inválidos) · businessRule (a loja não pode receber este pagamento) · processing (não foi possível processar — não é culpa do comprador) |
message | Texto curto em inglês. Pode mudar — não decida por ele. |
displayMessage | Texto em português, pronto para mostrar ao comprador. |
reversible | true quando uma nova tentativa do mesmo pagamento pode dar certo. |
Os textos são sempre da Selectwin. A resposta bruta da adquirente ou do processador nunca é exposta — nem na API, nem no webhook, nem no painel.
code | category | Significado |
|---|---|---|
insufficientFundsError | payment | Saldo ou limite insuficiente |
expiredCardError | payment | Cartão vencido |
invalidCardNumber | payment | Número do cartão inválido |
invalidExpiryMonth / invalidExpiryYear | payment | Validade incorreta |
invalidSecurityCode | payment | Código de segurança (CVV) inválido |
invalidPinCode | payment | Senha do cartão incorreta |
invalidPaymentInformation | payment | Dados do cartão inválidos (campo não identificado) |
cardDeclined | payment | Recusa do banco emissor, sem motivo detalhado |
authorizationRefused | payment | Autorização negada pelo emissor |
cardCustomerNotAssociated | payment | Não há cartão ativo para cobrar — o comprador precisa informar o cartão de novo |
invalidParameters | validation | Dados informados para o pagamento são inválidos |
sellerAuthorizationRefused | businessRule | A loja não está habilitada para receber pagamentos no momento |
paymentMethodUnavailable | businessRule | A forma de pagamento não está disponível para a loja |
cardValidationUnavailable | processing | O cartão não pôde ser validado neste momento (proteção contra teste de cartão na loja) — o emissor não foi consultado; vale tentar de novo mais tarde ou usar outra forma de pagamento |
paymentProcessingError | processing | O pagamento não pôde ser processado (indisponibilidade ou falha de processamento) — vale tentar de novo |
O envelope de erro 402 (Payment Required)
Em superfícies síncronas de pagamento, uma falha de processamento pode retornar HTTP 402 com o
envelope de erro padrão (os mesmos campos de qualquer erro — status, statusCode, category,
code, message, resource; ver Tratamento de Erros):
{
"error": {
"status": "Payment Required",
"statusCode": 402,
"category": "payment",
"code": "paymentDeclined",
"message": "The payment was declined by the issuer.",
"resource": "payments"
}
}Boas Práticas
- Não faça polling para descobrir o resultado — escute os webhooks
transaction.approved/transaction.failed(ver Proibição de Polling). - Keye no
error.code(em respostas de erro síncronas) e nostatusda transação, não no texto demessage(que pode mudar). - Em caso de recusa (
failed), para cobrar de novo inicie uma nova transação — idealmente com outro cartão ou forma de pagamento. - Teste os cenários com os Cartões de Teste (ex.: o cartão de
failed) antes de ir para produção.
Notas
- Forma de pagamento indisponível para a conta: a transação termina
failed, compayment.refused.code: "paymentMethodUnavailable"(no objeto da transação e no webhooktransaction.failed). - O catálogo de
error.codepor recurso (com o status HTTP de cada um) está em Catálogo de Códigos de Erro.
Atualizado em 17 de outubro de 2026