Como funciona o ISO8583: o protocolo por trás dos pagamentos
20 de outubro de 2025
O que é ISO8583
ISO8583 é um padrão internacional para troca de mensagens em transações financeiras eletrônicas. Quando você passa seu cartão em um terminal POS, a mensagem que viaja entre o terminal, o adquirente, a bandeira e o banco emissor segue (quase sempre) esse padrão.
Desenvolvido originalmente pela ISO (International Organization for Standardization), o padrão define a estrutura, o formato e o significado de cada campo em uma mensagem de transação financeira — mas é suficientemente flexível para que cada rede (Visa, Mastercard, Elo, redes nacionais) defina variações próprias.
Estrutura de uma mensagem ISO8583
Uma mensagem ISO8583 é composta por três partes:
[ MTI ] [ Bitmap ] [ Data Elements ]
1. MTI — Message Type Indicator (4 dígitos BCD ou ASCII)
O MTI identifica a versão do protocolo, a classe, a função e o originador da mensagem.
0200 → Autorização (Authorization Request)
0210 → Resposta de Autorização (Authorization Response)
0400 → Estorno (Reversal Request)
0800 → Network Management Request
Decomposição do MTI 0200:
0— versão ISO8583:19872— Financial Transaction (classe)0— Request (função)0— Acquirer (originador)
2. Bitmap (8 ou 16 bytes)
O bitmap é um mapa de bits que indica quais campos de dados (Data Elements) estão presentes na mensagem. Cada bit representa um DE (Data Element):
- Primary Bitmap (8 bytes / 64 bits): cobre os DEs 1 a 64
- Secondary Bitmap (8 bytes / 64 bits): cobre os DEs 65 a 128 — presente quando o bit 1 do primary bitmap está ativado
Se o bit 3 está em 1, o DE 3 (Processing Code) está presente na mensagem.
Bitmap em hex: F2 30 05 80 20 C0 80 00
Em binário: 1111 0010 0011 0000 0000 0101 1000 0000
DE1–DE8 DE9–DE16 DE17–DE24 DE25–DE32
3. Data Elements (DEs)
São os campos da transação. Cada DE tem um número, um tipo e um tamanho definido pelo padrão.
| DE | Nome | Tipo | Tamanho | |----|------|------|---------| | 2 | Primary Account Number (PAN) | LLVAR | até 19 | | 3 | Processing Code | n | 6 | | 4 | Transaction Amount | n | 12 | | 7 | Transmission Date & Time | n | 10 | | 11 | System Trace Audit Number (STAN) | n | 6 | | 22 | POS Entry Mode | n | 3 | | 37 | Retrieval Reference Number (RRN) | an | 12 | | 39 | Response Code | an | 2 | | 41 | Card Acceptor Terminal ID | ans | 8 | | 49 | Currency Code | n | 3 |
Fluxo de uma transação de débito/crédito
Cliente (cartão)
→ POS Terminal
→ Adquirente (0200)
→ Bandeira (Visa/Mastercard/Elo)
→ Banco Emissor
← Resposta (0210) com Response Code
← Repasse da resposta
← Autorização ou negativa
← Resultado na tela
O Response Code (DE 39) é crítico:
00— Aprovada05— Não honrada (generic decline)51— Saldo insuficiente54— Cartão vencido55— PIN incorreto96— System malfunction
Tipos de formato de campo
ISO8583 define formatos fixos e variáveis:
- n — numérico (
6= 6 dígitos) - an — alfanumérico
- ans — alfanumérico + caracteres especiais
- b — binário
- LLVAR — tamanho variável, prefixado com 2 dígitos indicando o comprimento
- LLLVAR — tamanho variável, prefixado com 3 dígitos
Exemplo: PAN (DE 2) é LLVAR n..19 — os primeiros 2 bytes indicam o comprimento do PAN, seguido do PAN numérico de até 19 dígitos.
Implementando com jPOS (Java)
jPOS é a biblioteca open-source de referência para ISO8583 em Java:
ISOMsg msg = new ISOMsg();
msg.setMTI("0200");
msg.set(2, "4111111111111111"); // PAN
msg.set(3, "000000"); // Processing Code (compra débito)
msg.set(4, "000000001000"); // Valor: R$ 10,00
msg.set(11, "000001"); // STAN
msg.set(22, "051"); // POS Entry Mode: chip + PIN
msg.set(41, "TERM0001"); // Terminal ID
msg.set(49, "986"); // BRL
ISOPackager packager = new ISO87APackager();
byte[] packed = packager.pack(msg);
Desafios práticos
Variações entre redes: O padrão é extensível e cada rede define usos próprios para campos privados (DE 48, DE 55 para dados EMV, etc.). Isso significa que uma integração com Cielo é diferente de uma com Rede ou GetNet.
Campos binários e criptografia: DE 52 (PIN Block) e DE 55 (ICC Data / EMV) são campos binários que requerem tratamento especial. O PIN Block em especial exige operações criptográficas com a chave de sessão do HSM.
Timeouts e reversões: Toda transação não respondida dentro do timeout deve gerar uma mensagem de reversão (MTI 0400) para garantir consistência financeira — caso contrário, o cliente pode ser debitado sem aprovação.
Conclusão
ISO8583 é um protocolo robusto e bem estabelecido, mas com curva de aprendizado significativa. A complexidade real não está no formato em si, mas nas variações entre redes, na criptografia de PIN, no tratamento de EMV e na lógica de fallback e reversão necessária para garantir consistência financeira em produção.
Se você está construindo um gateway de pagamento ou integrando com uma rede adquirente, jPOS (Java) é o ponto de partida mais sólido no ecossistema open-source.
Gostou do conteúdo?
Se você está construindo um sistema nesta área, podemos ajudar. Fale com um especialista.
Agendar Consultoria