Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QR Forge

Gerador de QR Code para PIX, WhatsApp, WiFi, contato e outros formatos.

Desenhar o código já é problema resolvido, com encoders maduros disponíveis há anos. A dificuldade está em montar a string que vai dentro dele. QR de PIX usa estrutura EMV com CRC16. Senha de WiFi com ponto e vírgula corta o payload no meio. Número de WhatsApp com parêntese gera link quebrado.

seus dados  ->  @srtecc/qr-forge  ->  encoder (qrcode)  ->  QR
                monta o payload       desenha

Formatos

Formato Padrão Ponto de atenção
PIX BR Code (EMV) CRC16/CCITT-FALSE, acento no nome, tamanho em bytes
WhatsApp wa.me Sinal de mais e parênteses quebram o link. Nono dígito brasileiro
WiFi WIFI: Ponto e vírgula e dois pontos na senha exigem escape
Contato vCard 3.0 Exige CRLF. Vírgula e ponto e vírgula precisam ser escapados
Site URL Sem esquema, o celular interpreta como texto e não abre
Texto, E-mail, SMS, Localização, Evento

No terminal

Sem servidor e sem navegador. O QR aparece no próprio console.

npx @srtecc/qr-forge-cli pix \
  --chave contato@exemplo.com \
  --nome "Padaria" --cidade "João Pessoa" --valor 49,90
 ▄▄▄▄▄▄▄  ▄ ▄▄▄ ▄▄ ▄ ▄ ▄▄ ▄▄▄   ▄▄ ▄▄▄▄▄▄▄
 █ ▄▄▄ █ ▄█▀▀█▀▀▄▀ ██▀█▀▄█▀▀▄▀ ▄▄█ █ ▄▄▄ █
 █ ███ █ █ ▀█▀▄ ▀ ▄█▀ ▄ █▄  ▀▀▀██  █ ███ █
 █▄▄▄▄▄█ █ ▄ █ ▄ ▄ ▄ █▀▄▀▄▀▄ ▄▀█▀█ █▄▄▄▄▄█

conteudo: 00020101021126440014br.gov.bcb.pix0122contato@exemplo.com...

Atencao
  ! Acentos removidos. O padrão do Banco Central aceita apenas ASCII.

Salvar em arquivo, ou usar dentro de um script:

qr-forge wifi --ssid MinhaRede --senha segredo123 --png rede.png
qr-forge url exemplo.com.br --so-texto > link.txt
qr-forge ler "00020101021126..."     # decodifica e confere o CRC

O payload sai em stdout e os avisos em stderr, então redirecionar grava só o código e mantém os avisos visíveis. qr-forge --ajuda lista todos os tipos.

Aplicativo web

Interface em Next.js com prévia ao vivo e download em PNG ou SVG.

A geração acontece inteiramente no navegador. Chave PIX e senha de WiFi não saem da máquina, não existe servidor recebendo esses dados, e o código é aberto para conferência.

Os códigos gerados são estáticos e não expiram. Vários serviços gratuitos criam um QR que aponta para o redirecionador deles, e o código impresso para de funcionar quando a assinatura acaba.

Todo ajuste automático aparece na tela. Se o nome foi reduzido para 25 caracteres, se um acento foi removido, ou se parece faltar o nono dígito no celular, o aviso é exibido junto com a prévia.

Executando

npm install
npm run dev     # compila a biblioteca e sobe o app em localhost:3000
npm test        # 61 testes
npm run cli -- --ajuda   # experimenta o terminal sem instalar nada

Biblioteca

npm install @srtecc/qr-forge qrcode
import { pix } from '@srtecc/qr-forge';
import QRCode from 'qrcode';

const { payload, avisos } = pix({
  chave: 'contato@exemplo.com',
  nome: 'Padaria Açúcar e Canela',   // resulta em PADARIA ACUCAR E CANELA
  cidade: 'João Pessoa',
  valor: 49.9,
});

console.log(avisos);
// ["Acentos removidos. O padrão do Banco Central aceita apenas ASCII."]

await QRCode.toFile('pix.png', payload);

Cada construtor devolve { payload, avisos } e lança exceção quando os dados tornariam o QR inválido. Nenhum payload quebrado é devolvido em silêncio.

Também lê códigos existentes:

import { lerPix } from '@srtecc/qr-forge';

const dados = lerPix(payloadRecebido);
// { chave, nome, cidade, valor, txid, usoUnico, crcValido }

crcValido: false indica que o código foi alterado depois de gerado, o que identifica um BR Code adulterado para desviar o pagamento.

Estrutura

packages/core/     biblioteca de payloads, sem dependência de runtime
  src/pix/         CRC16 e codificação TLV do EMV
  src/payloads/    um construtor por formato
  src/util/        normalização de texto e telefone
  test/            51 testes
packages/cli/      linha de comando, consome o core
apps/web/          Next.js, consome o core

O core não tem dependência de runtime. Código que monta payload de pagamento não deveria arrastar árvore de dependências. O qrcode, que desenha, é dependência apenas de quem renderiza: o CLI e o site.

Os três compartilham a mesma lógica de payload, então o código gerado no terminal é byte a byte igual ao gerado no navegador.

Licença

MIT.

About

Gerador de QR Code para PIX, WhatsApp, WiFi, contato e outros formatos. Monta o payload certo e roda no navegador.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages