Skip to content

Apoiar o projeto

Seu apoio ajuda a manter este projeto. As contribuições ajudam a custear a infraestrutura, manter a documentação e dedicar tempo a correções, testes e melhorias. Qualquer valor é bem-vindo.

QR Code Pix para apoiar o projeto, com valor livre. O mesmo código está disponível no campo Pix Copia e Cola abaixo.

Pix com valor livre

RecebedorMILTON COSME DA SILVA JUN

Confira o recebedor e escolha o valor no aplicativo do seu banco.

Certificado A1 e assinatura ​

O certificado A1 permite assinar XML e autenticar operações fiscais. A versão inicial aceita PFX/P12 com senha; certificado A3 não faz parte do escopo.

gerarXml e validar podem ser chamados sem A1. assinar, transmitir, consultar, cancelar, cartaCorrecao e inutilizar exigem certificado.

Como informar o A1 ​

Você pode carregar o arquivo em memória:

ts
import { readFile } from 'node:fs/promises';
import { criarEmissor } from 'cosmemilton-acbr-node';

const senha = process.env.NFE_A1_SENHA;
if (senha === undefined) throw new Error('Configure NFE_A1_SENHA');

const emissor = criarEmissor({
  cnpj: 'CNPJ_DO_EMITENTE', // substitua por 14 dígitos
  uf: 'CE',
  modelo: 55,
  ambiente: 2,
  certificado: { pfx: await readFile('./certificado.pfx'), senha }
});

Ou informar o caminho do arquivo:

ts
certificado: { arquivo: './certificado.pfx', senha }

Escolha pfx ou arquivo. O campo arquivo é lido pela API quando a operação é preparada; use um caminho absoluto quando o diretório de execução puder variar. O limite do PFX é 2 MiB. CNPJ do emitente e identidade fiscal do documento precisam corresponder ao certificado utilizado.

O fragmento acima mostra a configuração para sua integração e precisa de dados próprios. Ele não deve ser aplicado ao CNPJ sintético do primeiro guia com um certificado real.

Assinar, conferir e salvar ​

A sequência abaixo parte de uma instância emissor configurada e de xml com os dados completos de sua integração. Ela assina e valida localmente, sem chamar transmissão:

ts
import { writeFile } from 'node:fs/promises';

try {
  const assinado = await emissor.assinar(xml);
  if (!assinado.sucesso || !assinado.xmlBase64) {
    throw new Error(assinado.codigo ?? assinado.xMotivo ?? assinado.estado);
  }

  const xmlAssinado = Buffer.from(assinado.xmlBase64, 'base64').toString('utf8');
  const validado = await emissor.validar(xmlAssinado);
  if (!validado.sucesso) {
    throw new Error(validado.codigo ?? validado.xMotivo ?? validado.estado);
  }

  await writeFile('./nota-assinada.xml', Buffer.from(assinado.xmlBase64, 'base64'));
} finally {
  await emissor.fechar();
}

Validar o schema confere a estrutura; não comprova que os impostos estão corretos nem que a SEFAZ autorizou a nota. Não altere os bytes do XML depois da assinatura.

Onde guardar senha e certificado ​

Use o mecanismo de segredos do seu servidor. A variável NFE_A1_SENHA é lida pela sua aplicação; não é uma configuração automática da biblioteca. Evite armazenar PFX e senha em código, repositório ou logs.

A API envia o certificado e a senha ao processo fiscal pelas pipes, sem colocá-los nos argumentos. Isso não elimina a responsabilidade da aplicação por proteger as credenciais em seu ambiente.

Continue em NF-e e NFC-e ou consulte a configuração.

Projeto independente · gratuito · LGPL-2.1-or-later