Nfe - Nota Fiscal Eletronica

Dae gujarada… to começando um projeto de NFE, e já li as 28 páginas aqui deste tópico.

Uma dúvida ainda sobre a questão dos XSDs que a receita disponibiliza: Tinha gente falando disso, mas era
lá por meados de 2009. Enfim… vocês que já estão mais avançados no desenvolvimento, poderiam me
informar se os XSDs da receita estão corretos e se funciona certinho utilizar os plugins que convertem
os XSDs nas classes pra montar XML ??

Pergunto isso porque eu vejo que muitos estão montando tudo na mão.

Valeuu

tchê…
os xsd no meu cas utilizo só para validar os xmls que anteriormente montei.
os xsds junto com uma biblioteca que citaram por ai nesse topico ajuda voce a criar os beans nescessários ara gerar os xmls da nota e de outros serviços…
eu particularmente fiz todos beans no braço!!!
nao usei biblioteca…
achei que fcaria muito amarrado aquela biblioteca…
eu uso aqui no sistema os beans que gerei no braço e a biblioteca XStream para criar os xmls…
e esses xmls eu valido coms os xsds…
acho que respondi sua pergunta… ou não…hehe

certo… é que tem um framework chamado JAXB que faz exatamente isso… voce passa o XSD e ele monta os beans

talvez fosse mais fácil fazer dessa forma… aí minha preocupação seria somente em passar os dados corretos da NFe, mas o XML seria montado corretamente… o problema é que eu li por aí que esses XSDs não são confiáveis… uma pergunta melhor seria: se o XML passar na validação do XSD ele vai passar na validação do WebService ???

Uma outra pergunta: eu ainda não tenho o certificado, mas li que tem um programa que a própria receita disponibiliza que assina e envia os XMLs. Então eu poderia criar os XMLs e utilizar este programa pra testar sem ter o certificado???
Valeuu

carlos.scuna , com relação aos xsd’s eu sempre validei as nfs’ com ele, e sempre que deu certo pra mim, deu certo no ws… então creio que sejam os mesmo…

com relação ao programa do governo, eu acho que mesmo nele vc precisa de um certificado, e se nao me engano depois que vc assina a nota com ele, nao da pra “exportar” pra ser enviada com outra aplicação, sugiro que faca tudo sem depender de outra aplicação, ja esta no começo do seu desenvolvimento.

Ok… muito obrigado.

Pessoal,
To com uma dúvida vocês estão utilizando o webservice de SP, pois eu estou e está acusando alguns erros estranhos.

No meu caso está aparecendo o seguinte :

<retConsReciNFe xmlns=“http://www.portalfiscal.inf.br/nfe” versao=“2.00”><tpAmb>2</tpAmb><verAplic>SP_NFE_PL_006</verAplic><nRec>351000013429091</nRec><cStat>104</cStat><xMotivo>Lote processado</xMotivo><cUF>35</cUF><protNFe versao=“2.00”><infProt><tpAmb>2</tpAmb><verAplic>SP_NFE_PL_006</verAplic><chNFe>35100362515952000103550000000100041579130563</chNFe><dhRecbto>2010-03-16T08:20:42</dhRecbto><cStat>204</cStat><xMotivo>Rejeição: Duplicidade de NF-e</xMotivo></infProt></protNFe></retConsReciNFe>

So que está nota fiscal nunca foi enviada…E eu tentei com diversos nº que tbm nunca foram enviados…

se alguem puder me ajudar…agradeço.

Pessoal estou tendo um problema…
estou tendo o seguinte retorno

Status : 297
Motivo : Rejeição: Assinatura difere do calculado

Alguém tem idéia do que pode ser ??

Valew

leonardoanselmo2007

uma coisa é certa essa nota chegou no sefaz , essas coisas ocorria comigo as vezes pq eu colocava a função q envia a nota para o sefaz e tb colocava essa funçao em um System.out.print(); para visualizar o q era envia entao tinha na execução do programa 2 envios da msm nota procura no seu codigo se nao tem algo mandando essa nota 2 vezes , ou sendo enviado em um lote que ela se repita

outra coisa tb é na formação da sua chave , pq são 9 digitos que representa sua numeração de nota no sefaz

35|10|03|62515952000103|55|000|000010004|1|57913056|3

nessa chave a nota é 000010004 verifica se por algum motivo nao se repetiu esse numero em algum teste q vc fez

sobre a duvida do guilherme_ha

é erro na assinatura do xml
exemplo no arquivo vc pode mexer em qualquer tag fora do grupo que nao é acusado nenhuma interferencia de asssinatura verifica se por algum motivo foi alterado o conteudo das tags desse grupo
no meu codigo para mandar o xml eu faço a leitura do arquivo e armazeno ele numa variavel para poder enviar nesse caso o meu xml era escrito respeitando a quebra de linha e qdo estava acumulando na variavel o que estava escrito no arquivo estava td saindo na msm linha isso dava erro de Assinatura difere do calculado
qquer coisa msm q seja um pequeno espaço no xml altera na assinatura

Evandromib o problema era esse mesmo…enviava 2 vezes, vc teve algum problema com o ipi como a mensagem de rejeição abaixo:

“Total do IPI(id:W12) difere do somatorio do valor dos itens(id:O14)”

Conferir esses 2 campos e estão exatamente com o mesmo valor…

se alguem puder me ajudar sou muito grato.

evandromib, minha função de assinatura tbm faz isso que vc faz… pega o arquivo.xml abre e assina e ja envia…
estranho que na outra versão funcionava sem problemas…
so mudei o método de envio… a minha classe que assina esta igual e nao foi alterada…

Bem vou dar mais uma procurada… se souber de mais alguma dica…!

Valew…

[quote=guilherme_ha]Pessoal estou tendo um problema…
estou tendo o seguinte retorno

Status : 297
Motivo : Rejeição: Assinatura difere do calculado

Alguém tem idéia do que pode ser ??

Valew[/quote]

Isso geralmente acontece quando tem dois ou mais espacos entre caracteres.
Se tiver uma string assim: “ABC DE” a assinatura vai ser diferente do calculado.

Alencar

leonardoanselmo2007, bem estranho
mais qdo vou enviar o arquivo eu leio ele assinado ja , transfiro o conteudo para uma variavel e mando usando aqueles metodos
nao assino o conteudo do xml e ja envio o processo de assinatura faço separado
mais é estranho nao funcionar provavelmente é algum espaço perdido

leonardoanselmo2007 , ja tive esse problemas sim , IPI , ICMS , que nao bate com o valor total , algumas notas estao passando mais ainda nao entendi mto bem essa soma tendo q se somo na calculadora da certo com o valor total informado , tem q ve o tipo do icms pq tem algumas condições que nao soma no valor total da nota
mais do IPI to meio perdido tb

Boa tarde pessoal,

alguém tem o método de assinatuira da NFE que esteja funcionando ? Peguei vários aqui no forum mais cada um dá um erro diferente.
O Unico que nã deu erro ficaa voltando a mesma mensagem que o ( guilherme_ha ) está tendo:

Status : 297
Motivo : Rejeição: Assinatura difere do calculado

o Estranho é que eu faço o XML começando assim : <?xml version="1.0" encoding="UTF-8" ?>

Mais quando olho o arquivo assinado o começo tá assim: <?xml version="1.0" encoding="UTF-8" standalone="no"?>

Alguém pode ajudar ?
Obrigado,
Dankshit

cara faz isso aqui que esse Standalone não aparece mais

doc.setXmlStandalone(true);

Fala pessoal,

Blz evandromib , consegui resolver esse problema do STANDALONE,
mais continuo com o mesmo problema de :

Status : 297
Motivo : Rejeição: Assinatura difere do calculado

Se alguem tiver algum metodo de assinatura funcionando, agradeço a ajuda.

Tbm ainda estou com esse problema…
retirei todos os espaços em branco duplos… mas mesmo assim da o erro…

Já nao sei mais o que fazer…
alguem ja passou desse ponto :???

Pessoal, o miolo do método de assinatura está abaixo.
Notem que as variáveis locais devem ser carregadas conforme seu gosto, tipo usarToken para mim é
um boolean que informa o uso de A3, etc…

Espero que entendam.
Qualquer coisa, mandem msg em pvt.

Alencar

        // previne contra &, < e >
        xml = Utils.caracterToHTML(xml);

        try {
            // gera o DOM XMLSignatureFactory que sera usado para gerar o
            // envelope
            // com.sun.org.apache.xalan.internal.xsltc.DOM
            String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
            fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());

            // cria uma referencia ao envelope e define o algoritmo SHA1
            Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null, null);

            // cria o SignedInfo que sera assinado
            SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));

            // gera o KeyInfo
            X509Certificate certif;
            if (!usarToken) {
                certif = (X509Certificate) this.getCertificateFromFile(file, alias, senhaContainer);
            } else {
                certif = (X509Certificate) this.getCertificateFromToken(senhaContainer);
            }
            KeyInfoFactory kif = fac.getKeyInfoFactory();
            List x509Content = new ArrayList();
            x509Content.add(certif.getSubjectX500Principal().getName());
            x509Content.add(certif);
            X509Data xd = kif.newX509Data(x509Content);
            KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

            // instancia o documento a ser assinado
            ByteArrayInputStream xmlSource = new ByteArrayInputStream(xml.getBytes("UTF-8"));
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder docBuilder = dbf.newDocumentBuilder();

            doc = docBuilder.parse(xmlSource);

            // cria o DOMSignContext informando a private key
            DOMSignContext dsc = new DOMSignContext(pk, doc.getDocumentElement());

            // cria a assinatura do xml
            XMLSignature signature = fac.newXMLSignature(si, ki);

            // assina o xml
            signature.sign(dsc);

            return XMLUtils.DocumentToString(doc);
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception(e.getMessage());
        }

Cola ai o trecho do codigo que vc le o arquivo e manda para transmitir ?

Cara meu esquema de assinar esta igual ao seu… e mesmo assim esta retornando assinatura difere do calculado!!

Fala pessoal,

Estou com uma duvida, com este codigo acima a TAG ficou fora do tá certo isso ?

O final do meu arquivo ficou assim:

Eu estou montando o arquivo XML assim:

<?xml version="1.0" encoding="UTF-8"?>
<msgDados>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe Id="NFe35100307206673000141550010001842031003051087" versao="2.00">
<ide> ......
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"></Signature>
</NFe>
</msgDados>

Se eu não colocar a TAG sempre da erro na hora do envio do XML ao WebService. ( Unexpected subelement NFe )

Carrego o XML para envio assim:

 public String getXmlContent(String xmlFile) {
	String retorno = "";
	try {
	  BufferedReader reader = new BufferedReader(new FileReader(xmlFile));
	  String aux = null;
	  while ((aux = reader.readLine()) != null) {
		retorno += aux;
	  }
	  reader.close();
	} catch (FileNotFoundException e) {
	  e.printStackTrace();
	} catch (IOException e) {
	  e.printStackTrace();
	}
	return retorno;
  }




public String enviarNFeWebService(String caminhoXML, String cod_uf, String tpAmb) {

	String retRecepcao = null;
	// Carrega o arquivo XML
	String nfeDadosMsg = getXmlContent(caminhoXML);

	try {
	  NfeCabecMsg nfeCabec = new NfeRecepcao2Stub.NfeCabecMsg();
	  nfeCabec.setCUF(cod_uf);
	  nfeCabec.setVersaoDados("2.00");
	  NfeCabecMsgE nfeCabecE = new NfeRecepcao2Stub.NfeCabecMsgE();
	  nfeCabecE.setNfeCabecMsg(nfeCabec);

	  NfeRecepcao2Stub.NfeDadosMsg nfeDados = new NfeRecepcao2Stub.NfeDadosMsg();
	  ByteArrayInputStream XMLString = new ByteArrayInputStream(nfeDadosMsg.getBytes());
	  XMLStreamReader XML = XMLInputFactory.newInstance().createXMLStreamReader(XMLString);
	  nfeDados = NfeRecepcao2Stub.NfeDadosMsg.Factory.parse(XML);
	  NfeRecepcao2Stub nfeStub = new NfeRecepcao2Stub();
	  NfeRecepcaoLote2Result res = nfeStub.nfeRecepcaoLote2(nfeDados, nfeCabecE);
	  retRecepcao = res.getExtraElement().toString();

	} catch (Throwable e1) {
	  e1.printStackTrace();
	  return null;
	}

	System.out.print(retRecepcao);
	return retRecepcao;
  }