Cartões de Teste
Quick Reference
Por que cartões de teste importam
| Sem testes sistemáticos | Com cartões de teste da A55 |
|---|---|
| Você descobre recusas em produção, com clientes reais | Você simula todos os resultados em sandbox antes do go-live |
| Cenários específicos (timeout, cartão expirado, cartão bloqueado) ficam sem teste | Uma mudança de dígito exercita qualquer cenário |
| QA leva dias de testes manuais com cartões | Teste em lote 9 cenários em uma única execução de script |
| Você não sabe como sua UI lida com falhas | Você vê exatamente como suas telas de erro se comportam |
Como o simulador funciona
Em sandbox, apenas o último dígito do número do cartão controla o resultado da transação. Os primeiros 15 dígitos podem ser quaisquer.
Regras:
- Use qualquer número de cartão plausível com 16 dígitos — apenas o último dígito importa.
- CVV: quaisquer 3 dígitos (ex.:
123). - Validade: qualquer data futura no formato
MM/AAAA(ex.:12/2030).
Resultados por último dígito
| Último dígito | Status | Código de retorno | Mensagem | Caso de uso |
|---|---|---|---|---|
| 0, 1, 4 | Autorizado | 4 ou 6 | Operação concluída com sucesso | Caminho feliz — teste pagamentos bem-sucedidos |
| 2 | Não autorizado | 05 | Não autorizado | Recusa genérica — teste tratamento de erros |
| 3 | Não autorizado | 57 | Cartão expirado | Teste a UX de cartão expirado |
| 5 | Não autorizado | 78 | Cartão bloqueado | Teste cartão bloqueado/sinalizado por fraude |
| 6 | Não autorizado | 99 | Timeout | Teste tratamento de timeout e retentativas |
| 7 | Não autorizado | 77 | Cartão cancelado | Teste a UX de cartão cancelado |
| 8 | Não autorizado | 70 | Problemas com cartão de crédito | Teste erro genérico de cartão |
| 9 | Aleatório | 4–99 | Sucesso ou timeout (aleatório) | Teste de caos — verifique a resiliência |
Use estes números prontos — altere apenas o último dígito:
| Cenário | Número do cartão |
|---|---|
| Confirmado | 4024 0071 5376 3191 |
| Recusado | 4024 0071 5376 3192 |
| Expirado | 4024 0071 5376 3193 |
| Bloqueado | 4024 0071 5376 3195 |
| Timeout | 4024 0071 5376 3196 |
Passo a passo: teste cada cenário
1. Teste um pagamento bem-sucedido
- cURL
- Python
- JavaScript
curl -s -X POST https://sandbox.api.a55.tech/api/v1/bank/wallet/charge/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"wallet_uuid": "YOUR_WALLET_UUID",
"merchant_id": "YOUR_MERCHANT_UUID",
"payer_name": "Test User",
"payer_email": "test@example.com",
"payer_tax_id": "12345678909",
"payer_cell_phone": "+5511999999999",
"installment_count": 1,
"installment_value": 100.00,
"currency": "BRL",
"due_date": "2026-12-31",
"description": "Sandbox test — confirmed",
"type_charge": "credit_card",
"card_name": "TEST USER",
"card_number": "4024007153763191",
"card_expiry_month": "12",
"card_expiry_year": "2030",
"card_cvv": "123"
}'
import requests
API_BASE = "https://sandbox.api.a55.tech/api/v1"
def create_test_charge(token: str, card_number: str, description: str):
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
payload = {
"wallet_uuid": "YOUR_WALLET_UUID",
"merchant_id": "YOUR_MERCHANT_UUID",
"payer_name": "Test User",
"payer_email": "test@example.com",
"payer_tax_id": "12345678909",
"payer_cell_phone": "+5511999999999",
"installment_count": 1,
"installment_value": 100.00,
"currency": "BRL",
"due_date": "2026-12-31",
"description": description,
"type_charge": "credit_card",
"card_name": "TEST USER",
"card_number": card_number,
"card_expiry_month": "12",
"card_expiry_year": "2030",
"card_cvv": "123",
}
resp = requests.post(f"{API_BASE}/bank/wallet/charge/", json=payload, headers=headers)
return resp.json()
result = create_test_charge(token, "4024007153763191", "Sandbox test — confirmed")
print(f"Status: {result['status']}")
const API_BASE = "https://sandbox.api.a55.tech/api/v1";
async function createTestCharge(token, cardNumber, description) {
const resp = await fetch(`${API_BASE}/bank/wallet/charge/`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
wallet_uuid: "YOUR_WALLET_UUID",
merchant_id: "YOUR_MERCHANT_UUID",
payer_name: "Test User",
payer_email: "test@example.com",
payer_tax_id: "12345678909",
payer_cell_phone: "+5511999999999",
installment_count: 1,
installment_value: 100.0,
currency: "BRL",
due_date: "2026-12-31",
description,
type_charge: "credit_card",
card_name: "TEST USER",
card_number: cardNumber,
card_expiry_month: "12",
card_expiry_year: "2030",
card_cvv: "123",
}),
});
return resp.json();
}
const result = await createTestCharge(token, "4024007153763191", "Sandbox test — confirmed");
console.log(`Status: ${result.status}`);
2. Teste um pagamento recusado
Altere apenas o último dígito para 2:
Cartão: 4024007153763192 → Código de retorno 05 (Não autorizado)
Sua aplicação deve exibir uma mensagem de erro adequada e permitir que o usuário tente novamente com outro cartão.
3. Teste um timeout
Altere o último dígito para 6:
Cartão: 4024007153763196 → Código de retorno 99 (Timeout)
Sua aplicação deve implementar lógica de retentativa com backoff exponencial e exibir um estado "aguarde".
Teste em lote de todos os cenários
Execute todos os 9 cenários em um único script para validar seu tratamento de erros.
- Python
- JavaScript
scenarios = [
("4024007153763190", "Confirmado (0)"),
("4024007153763191", "Confirmado (1)"),
("4024007153763192", "Recusado (2)"),
("4024007153763193", "Cartão expirado (3)"),
("4024007153763194", "Confirmado (4)"),
("4024007153763195", "Cartão bloqueado (5)"),
("4024007153763196", "Timeout (6)"),
("4024007153763197", "Cartão cancelado (7)"),
("4024007153763198", "Problemas no cartão (8)"),
("4024007153763199", "Aleatório (9)"),
]
for card_number, label in scenarios:
result = create_test_charge(token, card_number, f"Teste em lote — {label}")
print(f"{label:25s} → status={result.get('status', 'N/A'):15s} code={result.get('return_code', 'N/A')}")
const scenarios = [
["4024007153763190", "Confirmado (0)"],
["4024007153763191", "Confirmado (1)"],
["4024007153763192", "Recusado (2)"],
["4024007153763193", "Cartão expirado (3)"],
["4024007153763194", "Confirmado (4)"],
["4024007153763195", "Cartão bloqueado (5)"],
["4024007153763196", "Timeout (6)"],
["4024007153763197", "Cartão cancelado (7)"],
["4024007153763198", "Problemas no cartão (8)"],
["4024007153763199", "Aleatório (9)"],
];
for (const [cardNumber, label] of scenarios) {
const result = await createTestCharge(token, cardNumber, `Teste em lote — ${label}`);
console.log(`${label.padEnd(25)} → status=${(result.status || "N/A").padEnd(15)} code=${result.return_code || "N/A"}`);
}
Zero Auth em sandbox
O endpoint de zero-auth (POST /api/v1/bank/wallet/zeroauth/) usa o mesmo simulador do último dígito das cobranças. Os cartões de teste 3DS dedicados têm prioridade quando o número do cartão corresponde exatamente.
Pré-requisito: zeroauth_enabled deve estar true na configuração do merchant. Entre em contato com seu account manager para habilitar.
| Último dígito | is_valid | code típico | Caso de uso |
|---|---|---|---|
| 0, 1, 4 | true | 00, 4 ou 6 | Cartão aprovado na validação |
| 2 | false | 05 | Recusa genérica |
| 3 | false | 57 | Expirado / não permitido |
| 5 | false | 78 | Cartão bloqueado |
| 6 | false | 99 | Timeout / emissor indisponível |
| 7 | false | 77 | Cartão cancelado |
| 8 | false | 70 | Saldo insuficiente / problemas no cartão |
| 9 | Aleatório | 4 ou 99 | Teste de caos |
O endpoint sempre retorna HTTP 200 — verifique is_valid e code no corpo da resposta.
# Recusa — último dígito 2
curl -s -X POST https://sandbox.api.a55.tech/api/v1/bank/wallet/zeroauth/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"wallet_uuid": "YOUR_WALLET_UUID",
"holder_name": "TEST USER",
"card_number": "4024007153763192",
"expiry_month": "12",
"expiry_year": "2030",
"cvv": "123",
"brand": "visa"
}'
Resposta esperada: { "is_valid": false, "code": "05", ... }
Tokenização em sandbox
O endpoint de tokenização (POST /api/v1/bank/wallet/tokenization/) segue o mesmo simulador do último dígito. Falhas retornam HTTP 400 com card_tokenization_failed.
Pré-requisito: tokenization_enabled deve estar true na configuração do merchant.
| Último dígito | Resultado | HTTP | Caso de uso |
|---|---|---|---|
| 0, 1, 4 | Sucesso — retorna token_uuid | 200 | Caminho feliz |
| 2, 5, 7, 8 | declined | 400 | Cartão recusado no enrollment |
| 3 | not_eligible | 400 | Cartão não elegível (ex.: expirado) |
| 6 | retryable_error | 400 | Timeout — retentar com backoff |
| 9 | Sucesso ou timeout aleatório | 200 ou 400 | Teste de caos |
Use 4024007153763191 em card.number para tokenização bem-sucedida. Veja Tokenizar cartão para o formato completo da requisição.
Fluxo recomendado em sandbox
Teste a sequência completa validar → armazenar → cobrar:
Repita com ...3192 em cada etapa para validar o tratamento de recusas.
Limitações importantes
- Os códigos de retorno e mensagens do sandbox são simulados. As respostas em produção vêm de emissores e bandeiras reais — os códigos e mensagens serão diferentes.
- Nunca use números de cartão reais em sandbox. O simulador sobrescreve os resultados com base no último dígito, independentemente da validade do PAN.
- Se o seu gateway exige um formato de cartão específico (ex.: prefixo BIN), mantenha o último dígito conforme a tabela acima e ajuste os demais dígitos para atender ao gateway.
O simulador suporta autorização, captura (total e parcial), cancelamento, consulta de status, zero-auth e tokenização. Todos seguem as mesmas regras do último dígito (cartões de teste 3DS têm prioridade quando correspondem).