renatomb / php_qrcode_pix

Implementação da geração de QRCode do Pix em PHP
https://dinheiro.tech/qr-code-pix
Creative Commons Zero v1.0 Universal
199 stars 74 forks source link

Pix inválido se "descrição" maior que X caracteres #4

Closed ivanobom closed 3 years ago

ivanobom commented 3 years ago

Primeiramente eu gostaria de parabenizá-lo por ter disponibilizado este projeto.

Pelo que eu li na documentação do PIX, o campo "descrição" possui um limite de 100 caracteres. Porém percebi que usando mais de 37 caracteres na descrição a validação do QR-CODE mostra como inválido. Ao gerar um QR-CODE pelo seu formulário no index.php eu percebi que ele trunca automaticamente a descrição em 37 caracteres.

Comparando as linhas geradas para 37 e 38 caracteres, vi que a diferença aparece no começo da linha, mudando um 99 para 100

00020126990014BR.GOV.BCB.PIX0136fd141433... (37 caracteres na descrição) 000201261000014BR.GOV.BCB.PIX0136fd141433... (38 caracteres na descrição)

Em um outro teste, usando o e-mail como ID do PIX, vi que trunca com 53 caracteres, mas com isso vi que na verdade o limite não é a quantidade de caracteres da descrição, mas sim o total de 99 caracteres depois do 99, como mostrado em negrito na linha abaixo:

00020126990014BR.GOV.BCB.PIX0120teste12#teste.com.br0253teste de descricao com varios caracteres para ver ate5204000053039865404

Aparentemente é necessário fazer algum ajuste quando passa de 99, mas não faço idéia como fazer tal correção. Poderia me ajudar com isso?

Obrigado. Ivan

renatomb commented 3 years ago

Entendi seu problema, deixe-me tentar te ajudar. Considere o seguinte:

O padrão EMV estabelece 2 dígitos para o campo e 2 dígitos para o tamanho. Dessa forma não há como ter tamanho maior que 99. Com isso o 100 já seria inválido pois na verdade o tamanho seria 10 e o último 0 já seria o primeiro byte de dados.

Com relação ao campo descrição, na verdade ele disputa com os outros do 26. Uma vez que o 26 contém:

Dessa forma, considerando que a "família"/gui 26 só pode ter 99 caracteres... Onde:

Diante disso, a descrição pode ter no máximo (99-18-4-4-tamanho dos caracteres da chave pix).

Exemplos: Para a chave doe@r3n4t0.cyou que possui 15 bytes, temos 99-18-8-15 = 58 bytes disponíveis para usar na descrição. Já para a chave 2ab23963-d925-413c-9d81-2cbefeee1bd1 que possui 36 bytes, temos 99-18-8-36 = 37 bytes disponíveis para usar na descrição.

Isso já está considerado neste trecho do código do site do live demo / gerador de qr code do pix: https://github.com/renatomb/php_qrcode_pix/blob/f407efff0d4b98f77a731236cecf89af7eba1557/index.php#L110-L116

Espero ter te ajudado, caso não tenha compreendido completamente recomendo que verifique a página 4 do Manual de Padrões para Iniciação do Pix.

ivanobom commented 3 years ago

Muito obrigado pelos esclarecimentos.