Pular para o conteúdo principal

Cartões de teste

O cartão de toda pessoa é um número de teste oficial de um provedor de pagamento. Um número qualquer que passa no Luhn não serve: o sandbox não sabe o que fazer com ele, e ele pode ser o de um cartão de verdade. Desde a versão 0.5.0 do core, você escolhe o provedor e o cenário: a Stripe ou a Pagar.me, e o que deve acontecer com a cobrança.

Sem escolher nada, o cartão é o aprovado da stripe: o Visa 4242 4242 4242 4242 ou o Mastercard 5555 5555 5555 4444.

Só o cartão muda​

O cenário muda o número, a bandeira e os campos provedor e cenario do cartão. O resto da pessoa é o mesmo da semente, inclusive a validade e o CVV:

botai pessoa --semente 42 --hoje 2026-10-05 --cartao pagarme --cenario recusado | grep -A11 '"cartao": {'
"cartao": {
"bandeira": "visa",
"numero": "4000000000000028",
"numeroFormatado": "4000 0000 0000 0028",
"titular": "MARCIO C RODRIGUES",
"validade": "11/28",
"mes": "11",
"ano": "28",
"cvv": "388",
"provedor": "pagarme",
"cenario": "recusado"
}

Sem as opções, a semente 42 dá o mesmo Márcio, com o Mastercard 5555555555554444, a mesma validade 11/28 e o mesmo CVV 388. Fora do cartão, nenhum campo muda:

diff <(botai pessoa --semente 42 --hoje 2026-10-05 | grep -v -E '"(bandeira|numero|numeroFormatado|provedor|cenario)"') \
<(botai pessoa --semente 42 --hoje 2026-10-05 --cartao pagarme --cenario recusado \
| grep -v -E '"(bandeira|numero|numeroFormatado|provedor|cenario)"') \
&& echo "a mesma pessoa"
a mesma pessoa

O filtro tira também os "numero" do RG, do celular e do endereço, que são iguais dos dois lados.

Stripe​

CenárioNúmeroO que a Stripe faz
aprovado (padrão)4242 4242 4242 4242 ou 5555 5555 5555 4444aprova a cobrança
recusado4000 0000 0000 0002recusa genérica (card_declined, generic_decline)
pendente4000 0027 6000 3184pede a autenticação 3D Secure em toda cobrança e espera por ela antes de cobrar
recusado-saldo4000 0000 0000 9995recusa por saldo insuficiente (card_declined, insufficient_funds)
recusado-roubado4000 0000 0000 9979recusa por cartão roubado (card_declined, stolen_card)
recusado-perdido4000 0000 0000 9987recusa por cartão perdido (card_declined, lost_card)
recusado-expirado4000 0000 0000 0069recusa por cartão expirado (expired_card), mesmo com a validade no futuro
recusado-cvc4000 0000 0000 0127recusa por CVC incorreto (incorrect_cvc), com qualquer CVV
erro-processamento4000 0000 0000 0119erro de processamento (processing_error)

Os códigos entre parênteses são o code e o decline_code que a API da Stripe devolve no modo de teste. No aprovado, a semente escolhe entre o Visa e o Mastercard; os outros cenários são Visa.

Pagar.me​

CenárioNúmeroO que o simulador da Pagar.me faz
aprovado4000 0000 0000 0010toda operação aprova: o pedido e a cobrança ficam pagos
recusado4000 0000 0000 0028toda transação é não autorizada: o pedido e a cobrança falham
pendente4000 0000 0000 0036fica processando e depois aprova: o pedido fica pago
pendente-recusado4000 0000 0000 0044fica processando e depois falha
pendente-cancelado4000 0000 0000 0051fica pendente e depois o pedido e a cobrança são cancelados
chargeback4000 0000 0000 0069é paga e depois passa para chargeback

Todos são Visa. O simulador pede validade no futuro, e a do Botaí é sempre de 12 a 59 meses depois do hoje. Ficaram de fora os dois cenários do simulador que falham só no cancelamento (4000 0000 0000 0077 e 4000 0000 0000 0093).

Documentado

O que cada provedor faz com cada número vem da documentação dele, conferida em 2026-10-09: docs.stripe.com/testing e o simulador de cartão de crédito da Pagar.me. Ninguém rodou estes números contra o sandbox da Stripe ou da Pagar.me. O que os testes do core provam: o número de cada cenário, a bandeira, o Luhn (os 16 números passam) e que a mesma semente dá a mesma pessoa em qualquer cenário.

O mesmo número em dois provedores​

O 4000 0000 0000 0069 é o recusado-expirado da Stripe e o chargeback da Pagar.me. O número sozinho não diz o cenário: quem diz é o par provedor e cenario do cartão, que sai no JSON e nas colunas cartao_provedor e cartao_cenario do CSV e do SQL.

Em cada porta​

PortaUma pessoaUm lote
CLI--cartao e --cenario--cartao e --cenarios recusado:10,aprovado:2
Servidorcartao e cenariocartao e cenarios
Bibliotecacartao: { provedor, cenario }cartao: { provedor, cenarios: { recusado: 10, … } }
FixturebotaiCartao: { provedor, cenario }—
Extensãonão escolhe: usa o padrão (stripe, aprovado)—

Os detalhes estão em Cartões de teste na CLI, na API HTTP, em Gerar uma pessoa, em Gerar um lote e nas opções do fixture.

No lote, os cenários saem em grupos, na ordem dada, e a pessoa i continua sendo a da semente S/i. E-mail, CPF e CNPJ não se repetem no lote inteiro, como num lote sem cenários (Lote e unicidade).

Cenário errado​

Um provedor ou um cenário que não existe, ou um cenário que o provedor não tem, é erro de uso, com a lista do que vale:

botai pessoa --cartao pagarme --cenario recusado-cvc
botai: --cenario: cenário desconhecido "recusado-cvc" para o provedor pagarme (use aprovado, recusado, pendente, pendente-recusado, pendente-cancelado, chargeback)

O provedor e o cenário aceitam qualquer caixa (Stripe, PAGARME) e saem em minúsculas.

O formato 2​

O cartão ganhou provedor e cenario na 0.5.0, e por isso o envelope passou ao formato 2, com um esquema novo. Veja Envelope e esquema.