Alguem comunica com o ws da nfe usando node?

Pessoal, depois de bater cabeça por um tempo, eu consegui pegar as ideias de alguns e finalmente consegui botar para rodar, este código funfou 100%

const fs = require('fs');
const soap = require('soap');

const args = {
  distDFeInt: {
    attributes: {
      xmlns: 'http://www.portalfiscal.inf.br/nfe',
      versao: '1.01',
    },
    tpAmb: 1,
    cUFAutor: 29,
    CNPJ: '01234567891231',
    distNSU: {
      ultNSU: '000000000000000'
    }
  }
}

var options = {
  wsdl_options: {
    rejectUnauthorized: false,
    strictSSL: false,
    pfx: fs.readFileSync('./certs/certificadoDB.pfx'),
    passphrase: '1234',
  }
}

const url = 'https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl';

soap.createClient(url, options, (err, client) => {
  err && console.log('ERRO1', err)

  client.setSecurity(new soap.ClientSSLSecurityPFX('./certs/certificadoDB.pfx', '1234', {
    rejectUnauthorized: false,
    strictSSL: false,
    securityOptions: 'SSL_OP_NO_SSLv3',
    forever: true
  }));

  client.nfeDistDFeInteresse({ nfeDadosMsg: args }, (err, result) => {
    err && console.log('ERRO2', err)

    console.log('>>>\n', JSON.stringify(result, null, 4), '\n<<<');
  })

})


Só trazendo aqui uma outra implementação que eu fiz para a nota carioca (prefeitura RJ) utilizando basicamente só o axios (envelopado pela lib easy-soap-request).

const soapRequest = require(‘easy-soap-request’);
const fs = require(“fs”)
const https = require(“https”)

const url = ‘https://homologacao.notacarioca.rio.gov.br/WSNacional/nfse.asmx?WSDL’;
const headers = {
‘Content-Type’: ‘text/xml; charset=utf-8’,
‘soapAction’: ‘http://notacarioca.rio.gov.br/CancelarNfse’,
};

// example data
const xml = <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <CancelarNfseRequest xmlns="http://notacarioca.rio.gov.br/"> <inputXML>teste</inputXML> </CancelarNfseRequest> </soap:Body> </soap:Envelope>;

const extraOpts = {
httpsAgent: new https.Agent({
pfx: fs.readFileSync("./path/to/certificate.pfx"),
passphrase: “senhaDoCertificado”,
})
}

// usage of module
soapRequest({url, headers, xml, extraOpts}).then(({response: {body, statusCode}}) => {
console.log(body);
}).catch((errorBody) => {
console.error(errorBody);
})

Espero que traga alguma alternativa pra quem estava com o problema. Lidar com esses sistemas antigos pode ser uma dor de cabeça, principalmente pra quem tá usando linguagens mais atuais.

Olá, Pablo.
Eu estou fazendo um método parecido para CTe, mas estou sempre tendo este erro:
Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1497:34)
at TLSSocket.emit (events.js:315:20)
at TLSSocket._finishInit (_tls_wrap.js:932:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:706:12) {
code: ‘UNABLE_TO_GET_ISSUER_CERT_LOCALLY’,

Poderia me ajudar?

Olá Tiago.

Estou tentando executar esse exemplo e recebo a seguinte mensagem:

Error: unable to get issuer certificate
at TLSSocket.onConnectSecure (node:_tls_wrap:1530:34)
at TLSSocket.emit (node:events:390:28)
at TLSSocket._finishInit (node:_tls_wrap:944:8)
at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:725:12) {

Tentei instalar certificados e o problema continua.
Existe alguma configuração para fazer no firefox ?

O que me ajudou foi fazer a requisição via axios, o uso do SoapClient mais atrapalhava do que ajudava

const response = await axios.post(URL, body, {
        headers: {
          'Content-Type': 'text/xml;charset=utf-8',
          SOAPAction: ACTION,
        },
        httpsAgent: new https.Agent({
          pfx: fs.readFileSync(filePathCertificate),
          passphrase: certificatePassphrase,
          rejectUnauthorized: false,
        }),
      })

Esse ano eu tive que fazer a integração de um sistema em Node com os WS da Sefaz de Distribuição de DF-e e Evento de Manifestação do Destinatário, então acabei criando uma biblioteca e publiquei no NPM. Para quem quiser testar na sua aplicação ou olhar o código para desenvolver uma solução própria, vou deixar o repositório do GitHub.

2 curtidas