Pix copia e cola (BR Code)
O payload BR Code por trás do QR Code Pix e do Pix copia e cola.
Validar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca28 casos falham
- Ruby, biblioteca23 casos falham
- Rust, biblioteca25 casos falham
- .NET, biblioteca29 casos falham
- Erlang, biblioteca
Valida o payload de um BR Code Pix contra o Manual de Padrões para Iniciação do Pix v2.10.0 e, onde o manual é omisso, o EMV QRCPS-MPM em que ele se baseia. A função verifica a forma da chave, não se ela está registrada no DICT.
- Estrutura: TLV bem formado com todo tamanho de
01a99, o indicador de formato000201como primeiro objeto e o CRC-16 (63) como último objeto de nível superior, inteiro e conferindo com o payload. Oito caracteres finais que só parecem6304e um checksum (dentro de outro objeto, por exemplo) não contam como o CRC. Um CRC em hexadecimal minúsculo é aceito, como na 2.4.0 (nenhuma fonte oficial define maiúsculas ou minúsculas). - Um ID de objeto não pode se repetir no mesmo nível (o EMV dá a cada objeto um ID por nível), quaisquer que sejam os valores, mesmo com um CRC que confere. Até a 2.4.0 o último ID repetido prevalecia. Só payloads forjados repetem um ID.
- Objetos obrigatórios: código de categoria (
52) com 4 dígitos, moeda (53)986, país (58)BRem maiúsculas, nome do recebedor (59) com no máximo 25 caracteres e cidade (60) com no máximo 15. Só o tamanho é verificado: nenhum dos manuais do Pix restringe os caracteres do nome e da cidade (o EMV os classifica comoans), então um nome com acentos é aceito, emborapixPayload.generatereduza ambos a ASCII imprimível. - O primeiro template Merchant Account Information (IDs 26 a 51) que traz o GUI
br.gov.bcb.pix(sem diferenciar maiúsculas de minúsculas) é o verificado, e um template sem o GUI é ignorado. Ele contém exatamente um entre: uma chave Pix na forma do DICT, comopixKey.getInfoa retorna (sem máscara, e-mail ou UUID em minúsculas, telefone com+55), opcionalmente com o ISPB de 8 dígitos de um facilitador de Pix Saque (fss, 26-03); ou uma location do PSP (26-25), host e caminho com no máximo 77 caracteres, nunca junto de umfss. O host tem rótulos separados por ponto, com letras, dígitos e hífens, e ao menos um ponto, e o caminho aceita só caracteres de caminho de URL (sem esquema, porta, query string ou espaço em branco). - O objeto
01é opcional. Quando presente, deve ser11ou12. - O valor (
54) tem dígitos com um.decimal opcional (98.73,98e98.são aceitos), no máximo 2 casas e 13 caracteres. Zero só é aceito em um Pix Saque (comfss) ou junto de uma location do PSP; um payload só com chave precisa de valor maior que zero. - O Additional Data Field Template (
62) com o txid (62-05) é obrigatório ("sempre presente em um BR Code", §2.6). O txid é***(sem txid) ou de 1 a 25 letras e dígitos (§2.6.2). Assim, num payload estático o-do exemplo do Manual do BR CodeRP12345678-2019fica excluído. - Junto de uma location do PSP, só a presença do 62-05 é verificada. O §2.7 diz que txid ou valor preenchidos num BR Code dinâmico devem ser ignorados, então um payload dinâmico com 62-05 preenchido continua válido.
- Templates não reservados (IDs 80 a 99) são ignorados. Um QR Code composto do Pix Automático que também traz uma chave ou uma location de pagamento é lido como um payload comum; um que traz só a recorrência, sem chave nem location de pagamento, é inválido.
- A 2.4.0 verificava sobretudo a estrutura. Aceitava payload sem
62, txid com-,_ou espaços ou com mais de 25 caracteres, chave com máscara ou em maiúsculas, chave de telefone sem+55, nome ou cidade acima dos limites, código de país em minúsculas, código de categoria que não tem 4 dígitos e objeto com tamanho00. Rejeitava um valor com.e sem decimais (98.). - Um valor que não é string é inválido. Espaços nas pontas do payload são ignorados.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | boolean |
Valida um payload de BR Code Pix (a string por trás de um QR Code Pix e do "Pix copia e cola") pelo Manual de Padrões para Iniciação do Pix e, onde ele é omisso, pela especificação EMV de QR Code em que ele se apoia.
- O payload precisa começar pelo format indicator
000201. - A estrutura TLV, o CRC-16 e os objetos obrigatórios (format indicator, category code de 4 dígitos, moeda, país, nome e cidade do recebedor) são verificados. Um ID de objeto não pode se repetir no mesmo nível, e o CRC (
63) precisa ser o último objeto do payload, não oito caracteres dentro de outro. - Um template "Merchant Account Information" (IDs 26 a 51) precisa trazer o GUI
br.gov.bcb.pixcom uma chave (estático) ou a URL do PSP (dinâmico), nunca os dois. - A chave vem na forma do DICT (§2.5.1): a que
getPixKeyInfodevolve sem mudar, então12345678909passa e123.456.789-09não. Se ela está registrada não dá para saber pelo payload. A URL do PSP tem no máximo 77 caracteres (§2.5.2). - O nome do recebedor tem no máximo 25 caracteres e a cidade no máximo 15; o país é
BRem maiúsculas. Os caracteres deles não são restritos (nenhum dos manuais restringe, e o EMV os tipa comoans), então um nome com acento é aceito, emborageneratePixPayloadreduza os dois a ASCII imprimível. - Nenhum manual do BCB diz se o CRC ou o
BRpodem estar em minúsculas: a única regra de caixa que eles dão é a do GUI, e todos os exemplos oficiais escrevem os dois em maiúsculas. Aceitar CRC em minúsculas (1d3d) e rejeitarbrsão escolhas desta biblioteca, como na 2.4.0. - O objeto
01(Point of Initiation Method) é opcional e precisa ser11ou12quando presente. - O objeto
62(Additional Data Field) é obrigatório e traz otxid(62-05), "sempre presente em um BR Code":***ou de 1 a 25 letras e dígitos (§2.6.2); com URL do PSP qualquer valor vale, já que o §2.7 manda o pagador ignorá-lo. O-do exemploRP12345678-2019do Manual do BR Code está fora do conjunto de caracteres do Pix do §2.6.2, então esse exemplo estático é rejeitado. - Um valor (
54) é feito de dígitos com um.opcional e no máximo duas casas decimais (98.73,98e98.são os exemplos do EMV), com no máximo 13 caracteres, e maior que zero, exceto num BR Code de Pix Saque (fssde 8 dígitos no subobjeto 26-03) e junto de uma URL do PSP, em que a API Pix lhe dá0.00(o Manual do BR Code traz"0"entre os exemplos). - Os Unreserved Templates (IDs 80 a 99) são ignorados.
import { isValidPixPayload } from '@brazilian-utils/brazilian-utils';
isValidPixPayload(
'00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-426655440000' +
'5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D'
); // true
isValidPixPayload('00020126580014br.gov.bcb.pix...'); // false (CRC quebrado)Fonte: Manual do BR Code, Manual de Padrões para Iniciação do Pix.
Código: brazilian-utils/javascriptTeste com JavaScript isValidPixPayload
Casos de teste compartilhados (69) e o resultado em cada biblioteca pixPayload.isValid
Gerar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca17 casos falham
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
Gera o payload de um BR Code Pix. Informe exatamente uma chave (estático) ou uma URL do PSP (dinâmico). Caso contrário, a função retorna null.
params(GeneratePixPayloadParams):keyouurl(exatamente um),merchantNameemerchantCity(obrigatórios) e, opcionalmente,amount,txidedescription. Um valor que não é objeto retornanull.- Com
keyo payload é estático (o objeto01fica de fora, então ele pode ser pago mais de uma vez) e a chave é normalizada comopixKey.getInfofaz. Uma chave quepixKey.getInforejeita retornanull, então uma chave de e-mail com&retornanull. - Com
urlo payload é dinâmico (Point of Initiation12) e não pode trazeramountnemtxid: qualquer um dos dois retornanull.urlé a location do PSP (campo 26-25): um host seguido opcionalmente de um caminho, sem esquema (pix.example.com/qr/v2/1234), com no máximo 77 caracteres. O host tem rótulos separados por ponto, com letras, dígitos e hífens (um hífen nunca abre nem fecha um rótulo), e ao menos um ponto, e o caminho aceita só caracteres de caminho de URL (um%só como início de um octeto codificado,%41). Um esquema (https://...), uma porta, uma query string, espaço em branco, um host sem ponto, ou umaurlvazia ou que não é string, retornanull. merchantNameemerchantCitysão obrigatórios:nullquando um deles falta, está em branco ou fica vazio após a redução. Eles são reduzidos a ASCII imprimível (sem acentos), truncados em 25 e 15 caracteres e, depois do truncamento, ficam sem espaços nas pontas.amounté escrito com duas casas decimais. Um valor que não sobrevive a isso (0.005,123.456), ou que é zero, negativo, não finito ou maior que 13 caracteres depois de escrito (9999999999.99é o maior) retornanull. O ruído de ponto flutuante depois da segunda casa, como em0.1 + 0.2(escrito0.30), é aceito.txidtem de 1 a 25 letras e dígitos (padrão***, sempre escrito no campo 62-05). Qualquer outra coisa,***inclusive, retornanull.descriptionperde os acentos como o nome e a cidade. Ela é escrita no campo 26-02, no espaço que sobra dos 99 caracteres do template depois do GUI e da chave ou URL, e nunca com mais de 72 caracteres, sem espaços nas pontas depois do truncamento, e é descartada quando não sobra nada.- Todo payload que a função retorna é aceito por
pixPayload.isValid: a chave na forma do DICT, o txid 62-05 sempre escrito, nome e cidade dentro dos limites e um valor maior que zero, epixPayload.getInfoo lê de volta. - Pix Saque (
fss), templates não reservados (IDs 80 a 99) e QR Codes compostos do Pix Automático nunca são escritos.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
params | GeneratePixPayloadParams | sim |
params.key | string | não |
params.url | string | não |
params.merchantName | string | sim |
params.merchantCity | string | sim |
params.amount | number | não |
params.txid | string | não |
params.description | string | não |
| retorna | string | null |
Gera o payload de um BR Code Pix. Exatamente um entre params.key e params.url deve ser informado; null é retornado quando ambos ou nenhum são informados.
- Parâmetros (
GeneratePixPayloadParams):keyouurl,merchantName,merchantCitye os opcionaisamount,txidedescription. - Com
keyo payload é estático e a chave é normalizada porgetPixKeyInfo. Comurlé dinâmico (objeto01definido como12) e não pode carregaramountnemtxid. urlé uma localização de PSP: host e caminho, sem esquema (pix.example.com/qr/v2/1234), com no máximo 77 caracteres.amountrecebe duas casas decimais;0.005,123.456ou um valor que arredonda para0.00é rejeitado.txidtem de 1 a 25 caracteres de[A-Za-z0-9](padrão***).merchantName,merchantCityedescriptionperdem os acentos e são truncados a 25, 15 e o que sobra do template.
import { generatePixPayload } from '@brazilian-utils/brazilian-utils';
generatePixPayload({
key: '123.456.789-09',
merchantName: 'Fulano de Tal',
merchantCity: 'Brasília',
amount: 123.45
});
// "00020126330014br.gov.bcb.pix0111123456789095204000053039865406123.455802BR5913Fulano de Tal6008Brasilia62070503***630479EE"
generatePixPayload({
url: 'pix.example.com/qr/v2/1234',
merchantName: 'Fulano de Tal',
merchantCity: 'Brasília'
});
// "00020101021226480014br.gov.bcb.pix2526pix.example.com/qr/v2/12345204000053039865802BR5913Fulano de Tal6008Brasilia62070503***6304FC66"
generatePixPayload({ merchantName: 'Fulano', merchantCity: 'Brasília' }); // null (nem key nem url)Fonte: Manual do BR Code, Manual de Padrões para Iniciação do Pix.
Código: brazilian-utils/javascriptTeste com JavaScript generatePixPayload
Casos de teste compartilhados (36) e o resultado em cada biblioteca pixPayload.generate
Decodificar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca26 casos falham
- Ruby, biblioteca13 casos falham
- Rust, biblioteca
- .NET, biblioteca17 casos falham
- Erlang, biblioteca
Decompõe o payload de um BR Code Pix em seus campos. Retorna null exatamente quando pixPayload.isValid retorna false, nunca um resultado parcial.
- Campos: nome e cidade do recebedor, point of initiation (dinâmico quando há uma location do PSP ou o objeto
01é12, estático nos outros casos, então um payload com chave e01=12é dinâmico) e a chave (estático) ou a URL (dinâmico). - Valor (um número, então
98.é lido como 98), txid, descrição (26-02) e o facilitador de saque de um Pix Saque (fss, o ISPB de 8 dígitos em 26-03) só aparecem quando o payload os traz. O marcador de txid***significa sem txid. - Com uma location do PSP, a função deixa de fora o valor e o txid, como o §2.7 do manual exige ("Se preenchidos, seu conteúdo deve ser ignorado").
- Todas as regras de
pixPayload.isValidvalem, então um payload sem o objeto62, com txid estático fora de 1 a 25 letras e dígitos ou com chave fora da forma do DICT retornanull. A 2.4.0 decompunha esses payloads. - Um ID de objeto repetido, um CRC que não é o último objeto de nível superior e toda outra regra de
pixPayload.isValidretornamnull, então o payload nunca é lido em parte. Um valor que não é string retornanull. - Um QR Code composto do Pix Automático que também traz uma chave ou uma location de pagamento é lido como um payload comum, sem a location da recorrência. Espaços nas pontas do payload são ignorados.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | PixPayloadInfo | null |
Interpreta um payload de BR Code Pix e retorna seus campos. Aceita o que isValidPixPayload aceita; para o resto retorna null, nunca um resultado parcial.
- Retorna um
PixPayloadInfo:merchantName,merchantCity,pointOfInitiationekey(estático) ouurl(dinâmico). amount,txid,descriptionewithdrawalFacilitator(ofssdo Pix Saque) só aparecem quando o payload os traz;txidfica ausente para o marcador***.pointOfInitiation(PixPointOfInitiation) é"dynamic"quando o payload traz uma localização de PSP (o QR Code dinâmico do manual do Pix, §2.4.2) ou se marca como de uso único com o objeto01="12"(§2.7.2); senão,"static". Um payload com chave e01="12"é, portanto,"dynamic";urlekeydistinguem os dois tipos de QR Code do manual.- Com localização de PSP,
amountetxidsão ignorados e ficam de fora, como manda o §2.7 do manual ("Se preenchidos, seu conteúdo deve ser ignorado").
import { getPixPayloadInfo } from '@brazilian-utils/brazilian-utils';
getPixPayloadInfo(
'00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-426655440000' +
'5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D'
);
// {
// merchantName: 'Fulano de Tal',
// merchantCity: 'BRASILIA',
// pointOfInitiation: 'static',
// key: '123e4567-e12b-12d1-a456-426655440000'
// }Fonte: Manual do BR Code, Manual de Padrões para Iniciação do Pix.
Código: brazilian-utils/javascriptTeste com JavaScript getPixPayloadInfo
Casos de teste compartilhados (33) e o resultado em cada biblioteca pixPayload.getInfo
Fontes oficiais
- bcb.gov.br/content/estabilidadefinanceira/…/ManualBRCode.pdf
- bcb.gov.br/content/estabilidadefinanceira/…/II_ManualdePadroesparaIniciacaodoPix.pdf
- github.com/bacen/pix-api
- bcb.gov.br/content/estabilidadefinanceira/…/API-DICT.html
- emvco.com/terms-of-use
Veja também Chave Pix
Atualizado em
