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.
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.
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
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, 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…!
[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.
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
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"?>
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());
}