Voltar ao blog
Pagamentos 10 min

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:1987
  • 2 — 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 — Aprovada
  • 05 — Não honrada (generic decline)
  • 51 — Saldo insuficiente
  • 54 — Cartão vencido
  • 55 — PIN incorreto
  • 96 — 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
Como funciona o ISO8583: o protocolo por trás dos pagamentos — APCosta — APCosta