Documentação Técnica
de Integração

Protocolo de Comunicação para Concessionárias

Versão 1.0 | Novembro 2025

Sumário

1. Introdução

1.1. Sobre o Pedágio Eletrônico

O Pedágio Eletrônico é uma plataforma centralizada que atua como intermediário entre concessionárias de rodovias e motoristas, facilitando o pagamento de transações de passagens em pedágios do tipo NAVI (sem tag ou AVI recusado).

Através do portal unificado (www.pedagioeletronico.com.br), motoristas podem visualizar e pagar suas pendências de múltiplas concessionárias em um único lugar, com suporte a diversos meios de pagamento (PIX, cartão de crédito, carteira digital).

1.2. Objetivo da Integração

Esta documentação descreve o protocolo técnico para que concessionárias de rodovias possam integrar seus sistemas ao Pedágio Eletrônico, permitindo:

1.3. Benefícios para Concessionárias

Principais Vantagens:
  • Redução de Inadimplência: Portal centralizado aumenta taxa de pagamento
  • Automação: Integração elimina processos manuais e reduz custos operacionais
  • Visibilidade: Acompanhamento em tempo real do status de cada transação
  • Experiência do Usuário: Motoristas pagam todas as concessionárias em um único portal
  • Segurança: Protocolo garante integridade e previne fraudes
  • Escalabilidade: Arquitetura preparada para alto volume de transações

2. Visão Geral da Arquitetura

2.1. Componentes do Sistema

A arquitetura do Pedágio Eletrônico é composta pelos seguintes componentes principais:

flowchart LR subgraph Concessionaria["🏢 Concessionária"] CONC[Sistema da
Concessionária] end subgraph Messaging["📨 Mensageria"] MQ[RabbitMQ
AMQP] end subgraph PedagioEletronico["⚡ Pedágio Eletrônico"] PE[Portal & API
REST/HTTP] end subgraph Payment["💳 Pagamento"] GP[Gateway de
Pagamento] end subgraph User["👤 Usuário"] MOT[Motorista] end CONC -->|"1. PASSAGEM
(mensageria)"| MQ MQ -->|"2. Processa"| PE PE -->|"3. PASSAGEM_PROCESSADA
(mensageria)"| MQ MQ -->|"4. Notifica"| CONC MOT -->|"5. Acessa Portal"| PE PE -->|"6. POST /pedidos/criar
(HTTP)"| CONC PE -->|"7. POST /transacoes/autorizar
(HTTP)"| CONC PE -->|"8. GET /pedidos/:id
(HTTP)"| CONC PE -->|"9. Processar
Pagamento"| GP GP -->|"10. Confirmação"| PE style PE fill:#7C3AED,stroke:#6D28D9,color:#fff,stroke-width:3px style MQ fill:#F59E0B,stroke:#D97706,color:#fff,stroke-width:3px style GP fill:#10B981,stroke:#059669,color:#fff,stroke-width:3px style CONC fill:#3B82F6,stroke:#2563EB,color:#fff,stroke-width:3px style MOT fill:#EC4899,stroke:#DB2777,color:#fff,stroke-width:3px

2.2. Modelo Híbrido de Comunicação

A integração utiliza um modelo híbrido que combina comunicação assíncrona e síncrona para otimizar performance e garantir consistência:

Tipo Tecnologia Uso Latência
Assíncrona RabbitMQ (AMQP) Envio de passagens e notificações de pagamento Eventual (até 36h)
Síncrona REST API (HTTP/JSON) Lock de transações e autorizações em tempo real Tempo real (<500ms)
Por que um modelo híbrido? A comunicação assíncrona é ideal para operações de lote e notificações que não requerem resposta imediata, enquanto a comunicação síncrona garante validações em tempo real durante o processo de pagamento, prevenindo problemas como dupla cobrança.

3. Tipos de Dados e Enumerações

Esta seção detalha todos os tipos enumerados (enums) e estruturas de dados utilizados no protocolo de integração. Estes tipos são comuns a ambos os protocolos de comunicação: mensageria assíncrona (RabbitMQ) e REST API síncrona (HTTP).

Importante: Utilize esta seção como referência ao implementar tanto o envio de mensagens via RabbitMQ quanto as chamadas REST. Os valores e formatos aqui descritos devem ser respeitados em todas as integrações.

3.1. Status de Pedido

Valor Descrição Transição Permitida Lock Ativo?
PENDENTE Pedido criado, aguardando pagamento PAGO, EXPIRADO, CANCELADO ✅ Sim (15 minutos)
PAGO Pedido pago com sucesso Estado final ❌ Não
EXPIRADO Lock expirou sem pagamento (após 15min) Estado final ❌ Não
CANCELADO Pedido cancelado manualmente (erro, fraude, etc) Estado final ❌ Não

3.2. Status de Passagem/Transação

Valor Descrição Quando Usar
PENDENTE Transação recebida, aguardando processamento Após envio via mensageria, antes de qualquer ação
LOCKED Transação lockada em um pedido ativo Durante os 15 minutos de lock do pedido
PAGO Transação paga e liquidada com sucesso Após receber PASSAGEM_PROCESSADA resultado=1 ou 6
CANCELADO Transação cancelada (estorno, duplicata, etc) Após receber PASSAGEM_PROCESSADA resultado=8
REJEITADO Transação rejeitada (dados inválidos) Após receber PASSAGEM_PROCESSADA resultado=3
INADIMPLENTE Transação virou inadimplência Após receber PASSAGEM_PROCESSADA resultado=7

3.3. Meio de Pagamento

Código Nome Descrição Tempo Confirmação
0 PIX Pagamento instantâneo via PIX Tempo real (segundos)
1 Cartão de Crédito Pagamento via cartão de crédito Imediato (autorização)
2 Carteira Digital Saldo em carteira do Pedágio Eletrônico Imediato
3 Arrecada+ Liquidação via parceiro externo (bancos, apps) Variável (até 48h)
4 Boleto Bancário Pagamento via boleto 1-3 dias úteis
5 Débito em Conta Débito automático em conta corrente Processamento noturno

3.4. Sentido de Via

Código Descrição Exemplo
N Norte Sentido crescente da rodovia (ex: SP → RJ)
S Sul Sentido decrescente da rodovia (ex: RJ → SP)
L Leste Sentido leste da rodovia
O Oeste Sentido oeste da rodovia

3.5. Categorias de Veículo

ID Código Nome/Descrição Rótulo Nº Eixos Rodado Duplo
0 INDEF Categoria indefinida INDEF 0 Não
1 CAT01 Automóvel, Caminhonete e Furgão CAT 1 2 Não
2 CAT02 Caminhão (leve e Trator) e Furgão CAT 2 2 Sim
3 CAT03 Automóvel e Caminhonete com semi-reboque CAT 3 3 Sim
4 CAT04 Caminhão (c/ reboque e Trator c/ semi-reboque) CAT 4 4 Sim
5 CAT05 Caminhão (c/ reboque e Trator c/ semi reboque) CAT 5 5 Sim
6 CAT06 Caminhão (c/ reboque e Trator c/ semi-reboque) CAT 6 6 Sim
7 CAT07 Automóvel ou Caminhonete com semi-reboque CAT 7 3 Não
8 CAT08 Automóvel ou Caminhonete com reboque CAT 8 4 Não
9 CAT09 Motocicleta CAT 9 1 Não
11 CAT11 Motocicleta CAT 11 1 Não
12 CAT12 Dois eixos rodagem dupla (ônibus) CAT 12 2 Sim
14 CAT14 Tres eixos rodagem dupla (ônibus) CAT 14 3 Sim
16-48 CAT16-48 Categoria 6 + 10 a 42 eixos duplos CAT 6+10 a 6+42 16-48 Sim
61-69 CAT61-69 Categoria 6 + 1 a 9 eixos duplos CAT 6+1 a 6+9 7-15 Sim
ℹ️ Informação sobre Categorias:
A categoria do veículo é utilizada exclusivamente para exibição no extrato do cliente. Ela não afeta o cálculo de valores ou processamento de pagamentos.

3.6. Formato de Timestamps

Padrão Unix Timestamp (UTC-0):
  • Formato: Inteiro de 64 bits (long)
  • Unidade: Segundos desde 01/01/1970 00:00:00 UTC
  • Timezone: Sempre UTC-0 (sem ajuste de fuso horário)
  • Exemplo: 1731427200 = 12/11/2025 14:00:00 UTC
  • Conversão BRT → UTC: Adicione 3 horas ao horário de Brasília
Exemplo de conversão:
# Passagem em 12/11/2025 às 14:30 BRT (horário de Brasília)
from datetime import datetime, timezone, timedelta

# Horário local BRT (UTC-3)
hora_brt = datetime(2025, 11, 12, 14, 30, 0)

# Converter para UTC (adicionar 3 horas)
hora_utc = hora_brt + timedelta(hours=3)  # 17:30 UTC

# Gerar timestamp Unix
timestamp = int(hora_utc.timestamp())  # 1731427200

3.7. Formato de Valores Monetários

Sempre em Centavos (Inteiro):
  • Tipo: Inteiro de 32 ou 64 bits (int/long)
  • Unidade: Centavos de Real (BRL)
  • Conversão: Multiplicar valor em reais por 100
  • Precisão: Sem casas decimais (evita erros de arredondamento)
Exemplos:
  • R$ 12,50 → 1250
  • R$ 0,50 → 50
  • R$ 100,00 → 10000
  • R$ 8,75 → 875

4. Comunicação Assíncrona (Mensageria)

As mensagens assíncronas são trocadas via RabbitMQ utilizando o protocolo AMQP. Este modelo é inspirado no protocolo ARTESP 001/14, adaptado para o contexto do Pedágio Eletrônico.

4.1. Mensagem PASSAGEM

Direção: Concessionária → Pedágio Eletrônico
Descrição: Notifica uma transação de passagem sem tag (NAVI) detectada pela concessionária
Prazo de envio: Até 24 horas após a passagem
Fila: passagens.{concessionariaId}

Estrutura da Mensagem

{
  "concessionariaId": 123,
  "osaId": 0,
  "sequencial": 1000,
  "passagemId": "253052020300000451",
  "placa": "ABC1D23",
  "datahora": 1731427200,
  "praca": 101,
  "nomePraca": "P01 - ARUJÁ",
  "pista": 3,
  "sentido": "N",
  "catDetectada": 2,
  "catCobrada": 2,
  "valor": 1250,
  "reenvio": 0
}

Descrição dos Campos

Campo Tipo Obrigatório Descrição
concessionariaId Integer Sim Identificador único da concessionária no sistema
osaId Integer Sim ID do Pedágio Eletrônico (sempre 0)
sequencial Integer Sim Número sequencial da mensagem (incrementa a cada envio)
passagemId String Sim Identificador único da passagem (imutável, usado como chave)
placa String Sim Placa do veículo no formato Mercosul (AAA1N23) ou antigo (AAA1234)
datahora Integer Sim Timestamp Unix UTC-0 (segundos desde 01/01/1970)
praca Integer Sim Identificador da praça de pedágio
nomePraca String Sim Nome descritivo da praça (exibido ao motorista)
pista Integer Sim Número da pista onde ocorreu a passagem
sentido String(1) Sim Sentido da via: N (Norte), S (Sul), L (Leste), O (Oeste)
catDetectada Integer Sim Categoria detectada pelo sistema (1-9)
catCobrada Integer Sim Categoria efetivamente cobrada (1-9)
valor Integer Sim Valor em centavos (ex: 1250 = R$ 12,50)
reenvio Integer Sim Contador de reenvios (0 = primeiro envio, 1+ = reenvios)
Atenção - Conversão de Horário: O campo datahora deve estar sempre em UTC-0. Se sua concessionária opera em UTC-3 (horário de Brasília), adicione 3 horas ao horário local antes de converter para timestamp Unix.

Exemplo: Passagem às 14:30 BRT = 17:30 UTC = 1731427200 (timestamp)
Valores Monetários: Todos os valores devem ser enviados em centavos (multiplicar por 100). Isso evita problemas de precisão com números decimais.
Exemplo: R$ 12,50 = 1250 centavos

4.2. Mensagem PASSAGEM_PROCESSADA

Direção: Pedágio Eletrônico → Concessionária
Descrição: Resposta sobre o status de processamento de uma passagem
Prazo de envio: Até 36 horas após receber a PASSAGEM
Fila: processadas.{concessionariaId}

Estrutura da Mensagem

{
  "concessionariaId": 123,
  "osaId": 0,
  "sequencial": 2000,
  "passagemId": "253052020300000451",
  "resultado": 1,
  "motivoNaoComp": 0,
  "pagamento": 1731513600,
  "valorPago": 1250,
  "meioPagamento": 0
}

Descrição dos Campos

Campo Tipo Obrigatório Descrição
passagemId String Sim ID da passagem (mesmo enviado na mensagem PASSAGEM)
resultado Integer Sim Código do resultado (ver tabela abaixo)
motivoNaoComp Integer Sim Motivo quando resultado=3 (ver tabela abaixo)
pagamento Integer Não Timestamp UTC quando foi pago (se aplicável)
valorPago Integer Não Valor efetivamente pago em centavos
meioPagamento Integer Não 0: PIX, 1: Cartão, 2: Carteira, 3: Arrecada+

4.3. Códigos de Resultado

Código Nome Descrição Ação da Concessionária
0 Sem resultado Status desconhecido ou erro no processamento Aguardar nova notificação ou consultar via API
1 Compensado Passagem aceita e será paga Marcar como PAGO no sistema
2 Compensado outro valor Aceita com valor diferente do enviado Verificar campo valorPago e ajustar
3 Não compensado Rejeitada (ver motivoNaoComp) Analisar motivo e corrigir se necessário
4 Provisionado Em processamento pelo Pedágio Eletrônico Aguardar nova notificação com resultado final
5 Compensado previamente Passagem já foi paga anteriormente Verificar se já está marcada como paga
6 Liquidado por outro meio Pago em outro parceiro (ex: banco, app) Marcar como PAGO (outro canal)
7 Inadimplente Transação virou inadimplência Aplicar processo de cobrança padrão
8 Cancelado Transação cancelada (ex: estorno) Cancelar no sistema interno
Regra da Última Compensação: Se uma passagem receber múltiplas mensagens PASSAGEM_PROCESSADA (ex: primeiro resultado=4 "Provisionado", depois resultado=1 "Compensado"), sempre prevaleça o último resultado recebido. Utilize o campo sequencial para ordenar as mensagens.

4.4. Motivos de Não Compensação

Quando resultado = 3 (Não compensado), o campo motivoNaoComp indica a razão:

Código Descrição Possível Causa
0 Sem motivo específico Erro genérico ou não categorizado
400 Passagem inválida/duplicada passagemId já existe no sistema
401 Placa inválida Formato incorreto (deve ser AAA1234 ou AAA1N23)
402 Praça não cadastrada praca não está configurada no sistema
403 Pista inválida Número de pista fora do range válido
404 Valor inválido Valor zerado, negativo ou muito alto
405 Horário inválido datahora no futuro ou muito antiga
5 Transação repetida Reenvio sem incrementar campo reenvio
6 Passagem enviada fora do prazo Enviada após 24h da passagem

5. Comunicação Síncrona (REST API)

A concessionária deve disponibilizar os seguintes endpoints REST para que o Pedágio Eletrônico possa realizar operações em tempo real durante o processo de pagamento do motorista.

Base URL da Concessionária:
Sandbox: https://sandbox-api.concessionaria.com.br
Produção: https://api.concessionaria.com.br

5.1. Criar Pedido e Lockar Transações

POST /api/v1/pedidos/criar
Descrição: Cria um pedido de pagamento e "locka" as transações especificadas por 15 minutos, impedindo liquidação por outros canais.

Headers Obrigatórios

Authorization: Basic {token_base64}
X-Concessionaria-Id: 123
Content-Type: application/json
X-Idempotency-Key: 03d82e99-e97f-484b-99e2-65e35d9116d6

Request Body

{
  "concessionariaId": 123,
  "passagens": [
    "253052020300000451",
    "253052020300000452",
    "253052020300000453"
  ],
  "placaVeiculo": "ABC1D23",
  "chaveIdempotencia": "03d82e99-e97f-484b-99e2-65e35d9116d6"
}

Response 201 Created

{
  "pedidoId": "PED-2025-06-00001",
  "status": "PENDENTE",
  "valorTotal": 3750,
  "passagens": [
    {
      "passagemId": "253052020300000451",
      "valor": 1250,
      "praca": "P01 - ARUJÁ",
      "data": "2025-11-12T10:30:00Z",
      "status": "LOCKED"
    },
    {
      "passagemId": "253052020300000452",
      "valor": 1250,
      "praca": "P02 - GUARULHOS",
      "data": "2025-11-12T11:15:00Z",
      "status": "LOCKED"
    },
    {
      "passagemId": "253052020300000453",
      "valor": 1250,
      "praca": "P01 - ARUJÁ",
      "data": "2025-11-12T14:20:00Z",
      "status": "LOCKED"
    }
  ],
  "expiracaoLock": "2025-11-12T15:45:00Z",
  "linkPagamento": "https://portal.pedagioeletronico.com.br/pagar/PED-2025-06-00001",
  "chaveIdempotencia": "03d82e99-e97f-484b-99e2-65e35d9116d6"
}

Possíveis Erros

Status Código Descrição
400 PASSAGENS_VAZIAS Array de passagens está vazio
400 PASSAGEM_NAO_ENCONTRADA Uma ou mais passagens não existem
403 PASSAGEM_JA_PAGA Uma ou mais passagens já foram pagas
403 PASSAGEM_LOCKED Uma ou mais passagens estão lockadas por outro pedido
Importante - Idempotência: Use o campo chaveIdempotencia (UUID único) para garantir que múltiplas requisições com a mesma chave retornem o mesmo resultado, evitando criação de pedidos duplicados.
Lock de 15 minutos: Durante o período de lock, a concessionária deve garantir que essas transações não sejam liquidadas por outros meios (outros parceiros, atendimento manual, etc). Após 15 minutos sem confirmação de pagamento, o lock expira automaticamente.

5.2. Consultar Status de Pedido

GET /api/v1/pedidos/{pedidoId}
Descrição: Consulta o status atual de um pedido existente.

Path Parameters

pedidoId String Identificador do pedido retornado no POST /pedidos/criar

Response 200 OK

{
  "pedidoId": "PED-2025-06-00001",
  "status": "PAGO",
  "valorTotal": 3750,
  "dataCriacao": "2025-11-12T15:30:00Z",
  "dataPagamento": "2025-11-12T15:42:00Z",
  "chaveIdempotencia": "03d82e99-e97f-484b-99e2-65e35d9116d6",
  "passagens": [
    {
      "passagemId": "253052020300000451",
      "valor": 1250,
      "status": "PAGO"
    },
    {
      "passagemId": "253052020300000452",
      "valor": 1250,
      "status": "PAGO"
    },
    {
      "passagemId": "253052020300000453",
      "valor": 1250,
      "status": "PAGO"
    }
  ]
}

Status Possíveis

  • PENDENTE - Pedido criado, aguardando pagamento (lock ativo)
  • PAGO - Pedido pago com sucesso
  • EXPIRADO - Lock expirado sem pagamento (após 15min)
  • CANCELADO - Pedido cancelado manualmente

Possíveis Erros

Status Código Descrição
404 PEDIDO_NAO_ENCONTRADO Pedido não existe no sistema

5.3. Autorizar Liquidação de Transação

POST /api/v1/transacoes/autorizar
Descrição: Solicita autorização para liquidar uma transação específica. Chamado no momento exato em que o motorista confirma o pagamento.

Request Body

{
  "concessionariaId": 123,
  "passagemId": "253052020300000451",
  "pedidoId": "PED-2025-06-00001",
  "valor": 1250,
  "meioPagamento": 0,
  "timestampPagamento": 1731513600
}

Response 200 OK (Autorizado)

{
  "autorizado": true,
  "transacaoId": "TXN-2025-00001234",
  "mensagem": "Transação autorizada para liquidação",
  "timestamp": 1731513600
}

Response 403 Forbidden (Não Autorizado)

{
  "autorizado": false,
  "motivo": "TRANSACAO_JA_LIQUIDADA",
  "mensagem": "Esta transação já foi paga em outro canal",
  "timestamp": 1731513600
}

Motivos de Recusa

Código Descrição
TRANSACAO_JA_LIQUIDADA Passagem já foi paga anteriormente
PASSAGEM_NAO_ENCONTRADA passagemId não existe no sistema
PEDIDO_EXPIRADO Lock do pedido expirou (após 15min)
VALOR_DIVERGENTE Valor enviado difere do valor da passagem
PASSAGEM_NAO_LOCKED Passagem não está no pedido informado
Tratamento de Erro Crítico: Se este endpoint retornar 403, o Pedágio Eletrônico NÃO processará o pagamento. É essencial que a concessionária valide rigorosamente antes de autorizar, pois uma autorização incorreta pode resultar em dupla cobrança.

6. Fluxo de Integração Completo

6.1. Diagrama de Sequência

sequenceDiagram participant C as Concessionária participant MQ as RabbitMQ participant PE as Pedágio Eletrônico participant M as Motorista participant GP as Gateway Pagamento Note over C: Veículo passa sem tag C->>MQ: PASSAGEM MQ->>PE: Entrega mensagem PE->>MQ: PASSAGEM_PROCESSADA (resultado=4 Provisionado) MQ->>C: Entrega notificação Note over M: Acessa portal M->>PE: Seleciona transações PE->>C: POST /pedidos/criar C-->>PE: 201 Created (pedidoId + lock 15min) M->>PE: Preenche dados de pagamento loop Para cada passagem PE->>C: POST /transacoes/autorizar C-->>PE: 200 OK (autorizado=true) end PE->>GP: Processa pagamento GP-->>PE: Pagamento confirmado PE->>MQ: PASSAGEM_PROCESSADA (resultado=1 Compensado) MQ->>C: Entrega notificação final Note over C: Marca como PAGO

6.2. Passo a Passo Detalhado

Passo 1: Detecção de Passagem NAVI

A concessionária detecta uma passagem sem tag ou AVI recusado em uma de suas praças de pedágio. O sistema de detecção captura: placa, data/hora, valor, categoria, praça e pista.

Passo 2: Envio da Mensagem PASSAGEM

A concessionária envia uma mensagem PASSAGEM via RabbitMQ para a fila passagens.{concessionariaId}. Este envio deve ocorrer até 24h após a passagem.

{
  "passagemId": "253052020300000451",
  "placa": "ABC1D23",
  "datahora": 1731427200,
  "valor": 1250,
  ...
}
Passo 3: Processamento pelo Pedágio Eletrônico

O Pedágio Eletrônico recebe a mensagem, valida os dados e armazena a transação. Em seguida, envia uma resposta PASSAGEM_PROCESSADA com resultado=4 (Provisionado), indicando que a transação foi aceita e está aguardando pagamento.

Passo 4: Motorista Acessa o Portal

O motorista acessa o portal do Pedágio Eletrônico, consulta suas pendências por placa e visualiza a transação disponível para pagamento.

Passo 5: Criação de Pedido e Lock

O Pedágio Eletrônico chama POST /api/v1/pedidos/criar na API da concessionária, informando quais passagens o motorista deseja pagar. A concessionária "locka" essas transações por 15 minutos, retornando um pedidoId.

Passo 6: Preenchimento de Dados de Pagamento

O motorista preenche os dados de pagamento no portal (PIX, cartão de crédito, etc).

Passo 7: Autorização de Liquidação

Para cada passagem do pedido, o Pedágio Eletrônico chama POST /api/v1/transacoes/autorizar. A concessionária valida:

Se tudo estiver correto, retorna autorizado: true.

Passo 8: Confirmação de Pagamento

O Pedágio Eletrônico processa o pagamento com o gateway de pagamento. Após confirmação, marca internamente as transações como pagas.

Passo 9: Notificação Final

O Pedágio Eletrônico envia mensagens PASSAGEM_PROCESSADA com resultado=1 (Compensado) via RabbitMQ para a fila processadas.{concessionariaId}.

{
  "passagemId": "253052020300000451",
  "resultado": 1,
  "pagamento": 1731513600,
  "valorPago": 1250,
  "meioPagamento": 0
}
Passo 10: Concessionária Marca como PAGO

A concessionária recebe a notificação e marca a transação como PAGA em seu sistema interno, fechando o ciclo.

Auditoria Completa: Todo o fluxo é rastreável através de logs, sequenciais de mensagens, pedidoId e chaves de idempotência, permitindo auditoria completa e reconciliação financeira.

7. Especificações Técnicas

7.1. Autenticação e Segurança

OAuth 2.0 Client Credentials

A autenticação utiliza o fluxo OAuth 2.0 Client Credentials. A concessionária receberá credenciais (client_id e client_secret) do Pedágio Eletrônico.

Obtendo um Token

curl -X POST https://api.pedagioeletronico.com.br/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id=sua_client_id" \
  -d "client_secret=seu_client_secret"

Resposta:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}

Usando o Token

Inclua o token no header Authorization de todas as requisições:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
X-Concessionaria-Id: 123
Content-Type: application/json
Renovação de Token: Tokens expiram em 1 hora. Implemente renovação automática antes da expiração para evitar interrupções no serviço.

Comunicação Segura

7.2. Configuração de Mensageria

RabbitMQ - Detalhes de Conexão

Parâmetro Sandbox Produção
Host mq-sandbox.pedagioeletronico.com.br mq.pedagioeletronico.com.br
Porta 5671 (AMQPS) 5671 (AMQPS)
Virtual Host /concessionarias /concessionarias
Exchange pedagio.transacoes pedagio.transacoes
Protocolo AMQP 0.9.1 AMQP 0.9.1

Filas Dedicadas

Cada concessionária possui filas dedicadas:

Configurações Recomendadas

{
  "prefetch_count": 10,
  "heartbeat": 60,
  "connection_timeout": 30000,
  "auto_ack": false,
  "durable": true,
  "persistent": true
}
Acknowledgment Manual: Configure auto_ack: false e só faça ACK após processar a mensagem com sucesso. Isso garante que mensagens não sejam perdidas em caso de erro.

7.3. Sincronização de Tempo

É crítico que os servidores da concessionária estejam sincronizados via NTP para garantir consistência nos timestamps.

Servidores NTP Recomendados (Brasil)

Configurar NTP no Linux

# Instalar chrony
sudo apt-get install chrony

# Editar /etc/chrony/chrony.conf
server ntp.usp.br iburst
server a.ntp.br iburst
server b.ntp.br iburst

# Reiniciar serviço
sudo systemctl restart chrony

# Verificar sincronização
chronyc tracking
Precisão Mínima: A diferença de relógio entre concessionária e Pedágio Eletrônico não deve exceder 1 segundo. Desvios maiores podem causar rejeição de mensagens.

7.4. Rate Limiting

Para garantir estabilidade, os seguintes limites são aplicados:

Operação Limite Janela
Mensagens PASSAGEM 1.000 mensagens Por minuto
POST /pedidos/criar 100 requisições Por minuto
POST /transacoes/autorizar 500 requisições Por minuto
GET /pedidos/:id 200 requisições Por minuto

Ao exceder o limite, a resposta será:

HTTP/1.1 429 Too Many Requests
{
  "error": "RATE_LIMIT_EXCEEDED",
  "message": "Limite de requisições excedido",
  "retry_after": 60
}
Backoff Exponencial: Implemente backoff exponencial ao receber 429, aguardando retry_after segundos antes de tentar novamente.

8. Ambientes e Credenciais

Ambiente Sandbox (Testes)

Componente URL/Host
REST API https://sandbox-api.pedagioeletronico.com.br
OAuth https://sandbox-api.pedagioeletronico.com.br/oauth/token
RabbitMQ mq-sandbox.pedagioeletronico.com.br:5671
Portal https://sandbox.pedagioeletronico.com.br

Ambiente Produção

Componente URL/Host
REST API https://api.pedagioeletronico.com.br
OAuth https://api.pedagioeletronico.com.br/oauth/token
RabbitMQ mq.pedagioeletronico.com.br:5671
Portal https://www.pedagioeletronico.com.br

Obtenção de Credenciais

Para obter credenciais de integração:

  1. Entre em contato com o time de integração: integracao@pedagioeletronico.com.br
  2. Forneça as seguintes informações:
    • Razão social da concessionária
    • CNPJ
    • Nome e email do responsável técnico
    • IPs dos servidores que farão integração (para whitelist)
    • Lista de praças de pedágio e respectivos IDs
  3. Você receberá:
    • concessionariaId - Identificador único
    • client_id e client_secret - Para OAuth
    • Credenciais RabbitMQ (usuário e senha)
    • Documentação adicional específica

Processo de Homologação

Checklist de Homologação:
  1. ✅ Integração funcional no ambiente Sandbox
  2. ✅ Envio de pelo menos 50 mensagens PASSAGEM de teste
  3. ✅ Recepção e processamento correto de PASSAGEM_PROCESSADA
  4. ✅ Implementação dos 3 endpoints REST funcionais
  5. ✅ Testes de autorização (casos de sucesso e erro)
  6. ✅ Validação de sincronização de relógio (NTP)
  7. ✅ Teste de idempotência
  8. ✅ Teste de expiração de lock (15 minutos)
  9. ✅ Documentação de monitoramento e logs implementada
  10. ✅ Plano de contingência documentado

Após aprovação nos testes de Sandbox, será agendado o Go-Live para ambiente de produção com acompanhamento do time técnico.

9. Tratamento de Erros

9.1. Política de Retry (Reenvio)

Para Mensageria (RabbitMQ)

Implemente retry exponencial com backoff para mensagens que falharam:

import time

def enviar_com_retry(mensagem, max_tentativas=3):
    """
    Envia mensagem com retry exponencial
    """
    for tentativa in range(max_tentativas):
        try:
            enviar_passagem(mensagem)
            return True
        except Exception as e:
            if tentativa < max_tentativas - 1:
                # Backoff exponencial: 2^tentativa segundos
                tempo_espera = 2 ** tentativa
                print(f"⚠️  Tentativa {tentativa + 1} falhou. Aguardando {tempo_espera}s...")
                time.sleep(tempo_espera)
            else:
                print(f"❌ Falha após {max_tentativas} tentativas")
                # Logar erro para análise manual
                raise e

Para REST API

Recomendações de retry por código de status:

Status HTTP Retry? Estratégia
408 Request Timeout ✅ Sim Retry imediato até 3x
429 Too Many Requests ✅ Sim Aguardar retry_after segundos
500 Internal Server Error ✅ Sim Retry com backoff exponencial
502, 503, 504 Gateway/Service ✅ Sim Retry com backoff exponencial
400 Bad Request ❌ Não Corrigir payload e reenviar
401 Unauthorized ❌ Não Renovar token e tentar novamente
403 Forbidden ❌ Não Avaliar motivo (ex: transação já paga)
404 Not Found ❌ Não Verificar dados (ex: pedidoId inválido)

9.2. Circuit Breaker

Implemente o padrão Circuit Breaker para proteger sua aplicação de falhas em cascata quando a API do Pedágio Eletrônico estiver indisponível:

stateDiagram-v2 [*] --> Fechado Fechado --> Aberto: Falhas > Limite Aberto --> MeioAberto: Timeout MeioAberto --> Fechado: Sucesso MeioAberto --> Aberto: Falha Fechado --> Fechado: Sucesso
Bibliotecas Recomendadas:
  • Python: pybreaker
  • Node.js: opossum
  • Java: resilience4j

9.3. Logging e Monitoramento

Logs Obrigatórios

Registre em logs estruturados (JSON) as seguintes informações:

Evento Campos Mínimos
Envio de PASSAGEM timestamp, passagemId, sequencial, valor, status
Recebimento de PASSAGEM_PROCESSADA timestamp, passagemId, resultado, valorPago
Chamada REST API timestamp, endpoint, method, statusCode, latency
Erros timestamp, errorType, message, stackTrace, context

Métricas para Monitorar

Alertas Críticos: Configure alertas para:
  • Taxa de erro > 5% em 5 minutos
  • Fila RabbitMQ com mais de 1000 mensagens pendentes
  • Latência de API > 5 segundos
  • Falha na sincronização NTP (desvio > 1 segundo)

10. Perguntas Frequentes (FAQ)

❓ O que acontece se eu enviar a mesma passagem duas vezes?

Se você enviar a mesma passagemId duas vezes (com reenvio=0 nas duas), a segunda mensagem será rejeitada com resultado=3 e motivoNaoComp=400 (Passagem inválida/duplicada). Se for um reenvio legítimo (ex: timeout), incremente o campo reenvio para 1, 2, etc.

❓ Como funciona o lock de 15 minutos?

Quando o Pedágio Eletrônico chama POST /pedidos/criar, as transações especificadas ficam "reservadas" por 15 minutos. Durante esse período:

❓ E se o motorista pagar em outro canal durante o lock?

Isso não deveria acontecer se o sistema da concessionária respeitar o lock. Mas se acontecer, ao chamar POST /transacoes/autorizar, a concessionária deve retornar autorizado: false com motivo: "TRANSACAO_JA_LIQUIDADA". O Pedágio Eletrônico cancelará o pedido e não cobrará o motorista.

❓ Posso enviar passagens com mais de 24h?

Tecnicamente sim, mas a mensagem pode ser rejeitada com motivoNaoComp=6 (Passagem enviada fora do prazo). O ideal é enviar assim que possível após a passagem, de preferência em tempo real ou em lotes a cada hora.

❓ Como sei se uma transação foi efetivamente paga?

Você receberá uma mensagem PASSAGEM_PROCESSADA com resultado=1 (Compensado) ou resultado=6 (Liquidado por outro meio). Só marque como PAGO em seu sistema após receber essa confirmação.

❓ Preciso implementar todos os 3 endpoints REST?

Sim. Os endpoints são essenciais para o fluxo de pagamento:

❓ O que são "centavos" nos valores?

Para evitar problemas de precisão com números decimais, todos os valores monetários são representados em centavos (inteiro). Multiplique o valor em reais por 100:

❓ Preciso converter horários para UTC?

Sim! Todos os timestamps (datahora, pagamento, timestampPagamento) devem estar em UTC-0 (Unix timestamp). Se sua concessionária opera em horário de Brasília (UTC-3), adicione 3 horas ao horário local antes de converter.

❓ Qual a diferença entre resultado=1 e resultado=6?

Ambos significam que a transação foi paga e deve ser marcada como PAGA no seu sistema.

❓ Como testar a integração antes do Go-Live?

Use o ambiente Sandbox:

  1. Solicite credenciais de sandbox ao time de integração
  2. Configure sua aplicação para apontar para as URLs de sandbox
  3. Envie pelo menos 50 transações de teste
  4. Teste todos os cenários: sucesso, erros, lock, autorização, etc.
  5. Valide os logs e métricas
  6. Solicite homologação oficial

❓ Onde encontro suporte técnico?

Entre em contato com o time de integração:

11. Glossário

Termo Definição
AMQP Advanced Message Queuing Protocol - Protocolo de mensageria usado pelo RabbitMQ
AVI Automatic Vehicle Identification - Identificação automática por tag eletrônica
Backoff Exponencial Estratégia de retry que aumenta exponencialmente o tempo de espera entre tentativas
Circuit Breaker Padrão de design que previne cascata de falhas ao "abrir o circuito" após múltiplos erros
Compensado Status indicando que uma transação foi aceita e será paga
Concessionária Empresa responsável pela administração de rodovias e praças de pedágio
Idempotência Propriedade que garante que múltiplas requisições idênticas tenham o mesmo efeito de uma única requisição
Lock Reserva temporária de transações (15 minutos) para prevenir dupla liquidação
NAVI Não-AVI - Passagem sem tag eletrônica ou com tag recusada
NTP Network Time Protocol - Protocolo para sincronização de relógios em rede
OAuth 2.0 Framework de autorização para acesso seguro a APIs
OSA Operador de Sistema de Arrecadação - No caso, o Pedágio Eletrônico (ID=0)
Passagem Evento de um veículo passando por uma praça de pedágio
Praça Instalação de cobrança de pedágio (contém múltiplas pistas)
Provisionado Status indicando que uma transação foi aceita e está em processamento
Rate Limiting Limitação da taxa de requisições para proteger o sistema de sobrecarga
Timestamp Unix Número de segundos desde 01/01/1970 00:00:00 UTC
UUID Universally Unique Identifier - Identificador único universal (128 bits)

12. Contato e Suporte

🤝 Time de Integração

Email:
integracao@pedagioeletronico.com.br

Telefone:
+55 (51) 99211-6696
Segunda a Sexta, 9h às 18h

🚨 Suporte

Portal:
suporte@pedagioeletronico.com.br

📚 Documentação

Portal de Desenvolvedores:
developers.pedagioeletronico.com.br

Status da API:
status.pedagioeletronico.com.br

📝 Feedback sobre esta documentação?
Ajude-nos a melhorar! Envie sugestões, correções ou dúvidas para docs@pedagioeletronico.com.br

Pronto para começar?

Entre em contato com nosso time de integração para obter suas credenciais e iniciar a homologação no ambiente Sandbox.

Solicitar Integração