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
| Formato | Padrão | Ponto de atenção |
|---|---|---|
| PIX | BR Code (EMV) | CRC16/CCITT-FALSE, acento no nome, tamanho em bytes |
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 |
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 CRCO 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.
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.
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 nadanpm install @srtecc/qr-forge qrcodeimport { 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.
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.
MIT.