ouro.capital
||
pix

Certificação de QR Code PIX: Como validar o payload contra a spec EMVCo

2024-08-27·9 min read·Matheus Feijão

Ponto-chave

Validar a string do QR Code Pix exige conformidade estrita com o padrão EMVCo em formato TLV e cálculo preciso do CRC16. Falhas na geração do payload resultam em perdas diretas de conversão e sanções do Banco Central para participantes do SPI.

Imagine a cena. Black Friday, 14h00. O pico de tráfego do seu e-commerce atinge o ápice histórico. Os clientes enchem os carrinhos, chegam ao checkout, escolhem pagar com Pix. O sistema gera o QR Code na tela. O cliente abre o app do Nubank, Itaú ou Mercado Pago, aponta a câmera e recebe uma mensagem fria: "QR Code Inválido". A conversão despenca para zero. O dinheiro fica na mesa.

Nós vemos isso acontecer com uma frequência assustadora no mercado brasileiro. Gateways de pagamento novatos, subadquirentes que escalam rápido demais e varejistas que decidem internalizar a infraestrutura de pagamentos frequentemente tropeçam na mesma pedra: a formatação do payload do Pix.

O Banco Central do Brasil não inventou a estrutura do QR Code do zero. A autarquia adotou o padrão global da EMVCo — o consórcio formado por Visa, Mastercard, Américan Express e outros gigantes. Isso garante interoperabilidade internacional, mas traz uma exigência técnica rígida. Um único caractere fora do lugar, um espaço em branco invisível ou um cálculo de hash malfeito, e a transação morre antes mesmo de nascer no Sistema de Pagamentos Instantâneos (SPI).

Se você opera um sistema que gera cobranças via Pix, a certificação e validação contínua desse payload não é um luxo. É o alicerce da sua operação. Vamos dissecar a anatomia dessa string, os erros mais caros que o mercado comete e como construir um pipeline de validação à prova de balas.

A anatomia implacável do Payload EMVCo no Pix

A específicação EMVCo baseia-se em um modelo chamado TLV: Tag, Length, Value (Etiqueta, Tamanho, Valor). Cada pedaço de informação dentro do QR Code segue essa tríade exata. Você declara do que se trata (Tag), quantos caracteres a informação tem (Length) e o dado em si (Value).

Pegue o início de qualquer Pix Copia e Cola válido. Você sempre verá 000201. O que isso significa na prática?

  • Tag 00 (Payload Format Indicator)
  • Length 02 (O valor tem dois caracteres)
  • Value 01 (A versão do payload)

O Manual de Padrões para Iniciação do Pix do BACEN exige uma hierarquia rigorosa dessas tags. Um gerador de QR Code precisa montar um quebra-cabeça onde os blocos de dados principais incluem:

Tag 26 (Merchant Account Information): É aqui que a mágica do Pix acontece. Dentro da Tag 26, temos sub-tags (um TLV dentro de outro TLV). Obrigatório conter a GUI (br.gov.bcb.pix) e a chave Pix do recebedor.

Tag 52 (Merchant Category Code - MCC): O código da categoria do lojista. Muitos gateways usam 0000 para transações genéricas, mas o BACEN tem apertado o cerco para que lojistas usem o MCC real (como 5411 para supermercados), fácilitando o monitoramento de fraudes pelo COAF.

Tag 53 (Transaction Currency): Para o Brasil, o código ISO 4217 é sempre 986 (Real brasileiro).

Tag 54 (Transaction Amount): O valor da transação. Ponto de atenção: o separador decimal precisa ser um ponto (.), não uma vírgula. 150.00 é válido, 150,00 quebra o parser do banco recebedor.

Tag 58 (Country Code): Sempre BR.

Tag 59 (Merchant Name) e Tag 60 (Merchant City): O nome do recebedor e a cidade. Aqui mora um perigo silencioso: caracteres especiais. A específicação original EMVCo é sensível a encodings. O BACEN exige que o nome não ultrapasse 25 caracteres. Se o seu lojista se chama "João da Silva & Irmãos Ltda", você precisa sanitizar essa string.

Tag 63 (CRC16): O carrasco dos desenvolvedores. O Cyclic Redundancy Check. Falaremos dele em detalhes a seguir.

Por que a validação falha? Os erros mais caros do mercado

Na nossa análise das integrações de PSPs (Provedores de Serviços de Pagamento) de médio porte, identificamos que 80% das falhas de leitura de QR Code derivam de três erros fundamentais de implementação.

O cálculo corrompido do Length em UTF-8

A específicação dita que o campo Length deve representar o número de caracteres do valor. O problema ocorre quando desenvolvedores usam funções nativas de linguagens de programação (como o .length do JavaScript ou strlen no PHP) sem considerar a codificação.

Caracteres acentuados em UTF-8 ocupam mais de um byte. Se o nome da cidade é "São Paulo", contar os bytes pode resultar em um número diferente de contar os caracteres. O app do banco emissor vai ler o campo Length, extrair a quantidade exata de caracteres informada e, se a contagem estiver errada, vai engolir parte da próxima Tag, corrompendo toda a cadeia TLV.

O temido CRC16-CCITT

A Tag 63 encerra o QR Code e serve como um selo de integridade matemática. Ela deve ser obrigatoriamente a última tag da string. O valor do CRC16 é um hash de 4 caracteres alfanuméricos gerado a partir de toda a string anterior a ele (incluindo o 6304 que inicia a própria tag 63).

O algoritmo exigido pelo BACEN é o CRC16-CCITT-FALSE (Polinômio 0x1021, valor inicial 0xFFFF). O erro clássico das fintechs iniciantes é usar bibliotecas genéricas de CRC que implementam o polinômio padrão do protocolo ARC ou Modbus. O resultado? O gerador cria o QR Code, a imagem aparece bonitinha na tela, mas o hash final não baté com o cálculo feito pelo aplicativo do banco do pagador. Transação recusada na hora.

Campos obrigatórios ausentes em QR Codes Dinâmicos

No QR Code Estático, o valor da transação (Tag 54) é opcional. O cliente pode digitar o valor. Já no QR Code Dinâmico — aquele gerado via API Pix para e-commerces, que expira e tem conciliação automática —, a estrutura muda. A Tag 26 deixa de carregar a chave Pix diretamente e passa a carregar uma URL (o payload JSON hospedado no banco recebedor).

Muitas plataformas falham na validação prévia dessa URL. O BACEN exige que a URL do QR Dinâmico comece com https:// (nunca http://) e seja acessível externamente. Se o seu gerador montar o TLV corretamente, mas a URL embutida estiver mal formatada ou offline, o app do banco não conseguirá baixar o payload final (o JWS com as informações de cobrança).

Ferramentas e processos de certificação (O "Como Fazer")

Você não pode depender do acaso. Validar payloads exige um pipeline de certificação automatizado antes que qualquer código vá para produção.

1. Parsers TLV reversos

A primeira ferramenta no seu arsenal deve ser um parser EMVCo. Em vez de testar lendo o QR Code com o seu celular pessoal (prática amadora ainda comum em muitas startups), você precisa de um script que pegue a string final e tente desmontá-la de trás para frente.

O parser deve:

  1. Identificar os dois primeiros caracteres (Tag).
  2. Ler os dois seguintes (Length).
  3. Extrair os próximos N caracteres baseados no Length (Value).
  4. Repetir até o fim da string.

Se sobrar um único caractere no final que não faça parte de uma estrutura TLV, a string inteira deve ser rejeitada pelo seu pipeline de CI/CD.

2. Validação estrita de Sandbox do BACEN

O Banco Central disponibiliza manuais exaustivos e ambientes de homologação. Se você é um participante direto ou indireto do SPI, sua obrigação é rodar baterias de testes contra os validadores oficiais.

O DICT (Diretório de Identificadores de Contas Transacionais) e os simuladores do BACEN retornam códigos de erro específicos. O código ISPB incorreto na URL do QR Dinâmico, por exemplo, gera rejeição imediata. Construa suítes de testes unitários que forcem erros deliberados (CRC errado, tags fora de ordem, valores acima do limite) para garantir que seu sistema saiba lidar com a recusa.

3. Bibliotecas Open Source homologadas

Não reinvente a roda se não precisar. Grandes players do mercado brasileiro já abriram o código de excelentes geradores e validadores. Bibliotecas em Python, Go e Node.js mantidas pela comunidade open banking do Brasil costumam estar em dia com as atualizações do Manual do Pix.

Ainda assim, audite o código dessas bibliotecas. Verifique a função de cálculo do CRC16. Passe strings de teste conhecidas do manual do BACEN e valide se o hash gerado baté exatamente com o exemplo oficial.

Implicações práticas: O que acontece se você ignorar a spec?

O impacto de um gerador de QR Code não conforme vai muito além do atrito com o usuário final.

Primeiro, a perda financeira direta. No e-commerce, o Pix já representa mais de 40% das transações em grandes varejistas. Um checkout fora do ar por 30 minutos devido a um deploy com parser quebrado significa milhões de reais perdidos em vendas não convertidas.

Segundo, o risco regulatório. O Departamento de Competição e de Estrutura do Mercado Financeiro (DECEM) do Banco Central monitora ativamente as taxas de falha de iniciação de pagamento. Se o seu PSP apresenta um índice anormal de rejeições por "QR Code Inválido", você entra no radar da supervisão.

A Resolução BCB nº 1 e suas atualizações são claras. Participantes que degradam a experiência do usuário ou sobrecarregam a rede com requisições malformadas estão sujeitos a penalidades. O BACEN pode aplicar multas pesadas e, em casos de reincidência grave e negligência técnica, suspender temporariamente a conexão da instituição com o SPI. Para uma fintech de pagamentos, ser desconectada do Pix equivale a fechar as portas.

O futuro da validação: Pix Automático e NFC

A específicação do Pix não é um artefato estático de museu. Ela é viva e respira no ritmo das inovações do sistema financeiro brasileiro.

Com a chegada do Pix Automático (agendado para revolucionar pagamentos recorrentes), novas tags EMVCo entrarão no jogo. O payload precisará comportar parâmetros de periodicidade, limites de valor por ciclo e identificadores de contrato de recorrência. O seu pipeline de validação construído hoje precisa ser modular o suficiente para aceitar essas novas regras amanhã sem reescrever todo o core do gerador.

Além disso, a iniciação via NFC (Aproximação) altera a dinâmica de entrega do payload. Em vez de ler uma imagem, o celular recebe a string TLV via radiofrequência de uma maquininha (POS). A tolerância a latência e erros de parsing nesse cenário é ainda menor. Uma string malformada na aproximação gera uma falha de handshake que frustra o cliente físicamente na boca do caixa.

A certificação e validação de QR Codes Pix separa os amadores dos profissionais na infraestrutura financeira. Escovar bits, calcular CRCs perfeitos e respeitar o padrão EMVCo de forma religiosa garante que, quando o cliente final apontar a câmera, o dinheiro flua sem barreiras. Essa é a verdadeira engenharia invisível que sustenta o ecossistema financeiro do Brasil.

Perguntas Frequentes

MF

Matheus Feijão

CEO & Fundador — ouro.capital

Especialista em fintech e criptoativos desde 2002. CEO da ouro.capital.