Problemas envio da NFE: 588 - Rejeição: não é permitida a presença de caracteres

entao tb sempre utilizei o axis2 e sempre funcionou dentro desses parametros

qdo eu tiro a tag

retorna java.lang.Exception: org.apache.axis2.databinding.ADBException: Unexpected subelement nRec

assinando pelo meu programa volta erro 588
se assino o xml com o programa do governo , volta erro de 225 - falha no schema de lote nfe

ta complicado a coisa rs

Bom, tenta manter então essa tag, segue algumas coisas q fiz aqui, tenta implementar e ve se resolve:

antes de assinar

xmlNfe = xmlNfe.replaceAll("\n", "") .replaceAll("\r", "") .replaceAll("\t", "") .replaceAll(" ", " ") .replaceAll(" ", " ") .replaceAll("> <", "><") .replaceAll(" </", "></") .replaceAll("> ", ">") .trim();

No seu assinador, se for parecido com o meu, existe um objeto transformer, q exporta o xml, eu setei alguns parametros:

[code] ByteArrayOutputStream os = new ByteArrayOutputStream();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "no");
trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
trans.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
trans.setOutputProperty(OutputKeys.METHOD, "xml");
trans.transform(new DOMSource(docs), new StreamResult(os));

return new String(os.toByteArray(),Charset.forName("UTF-8")).trim();
[/code]

Valeu Rafael

fiz a remoção dos “\n” quebra de linha antes de assinar e consegui transmitir tranquilo e receber o protocolo de autorização sem erro

obrigado pela dicas se precisar estamos por aqui ( no aguardo de mais problemas rs )

Salve galera …

estava com este mesmo problema e percebi que ao enviar o lote, no final tinha uma quebra de linha antes da última tag para fechar o XML de envio de lote, no caso a tag (na versão antiga da NFe funfava, na 2.0 não).

daí pra resolver fiz o básico, retirei a quebra de linha do XML com um:

replaceAll("\n", “”)

mas … não funcionou … continuou o mesmo problema … quando eu visualizava o XML dentro do netbeans aparecia sem a quebra de linha, mas se eu “colava” o XML em um editor de texto a quebra de linha aparecia … (glub !!)

pois resolvi o problema substituindo a mesma linha do replace por esta sintaxe:

.replaceAll( System.getProperty(“line.separator”), “” )

daí funfou … ah, e as quebras de linhas geradas na assinatura do XML não interferiram em nada … este foi o meu problema quebra de linha e o replace que não funfou direito nao sei pq …

abs!!

André, existem quebras de linhas compostas por \r (CR ou carriage return) também
eu mandei um código logo acima q arranca "tudo essas m…" pra falar o bom português"

1. xmlNfe = xmlNfe.replaceAll("\n", "") 2. .replaceAll("\r", "") 3. .replaceAll("\t", "") 4. .replaceAll(" ", " ") 5. .replaceAll(" ", " ") 6. .replaceAll("> <", "><") 7. .replaceAll(" </", "></") 8. .replaceAll("> ", ">") 9. .trim();

Pessoal,

O meu arquivo eu gero normal e transmito com os \n da assinatura e autoriza normalmente.

O problema que eu tive com a Sefaz SP foi com um XML que eu estava enviando com a tag com espaços.

Ex:


<email>                       </email>

Porém resolvendo isso. Todas as notas foram autorizadas.

[]s

Boa tarde!

Estou enfrentando o mesmo problema.

Observando as especificações, foi publicada uma nota técnica (NT2010_009) que inclui a validação 588. Vide link: http://www.nfe.fazenda.gov.br/PORTAL/docs/NT2010.009.pdf. Neste mesmo documento está especificado que a princípio, esta validação seria feita apenas no ambiente de homologação.

Contudo, removi do xml enviado todas as formatações bem como os caracteres de edição informados na nota técnica e o problema persistiu.

Observei que a assinatura continha caracteres de retono de carro “\n” e também os removi do xml enviado. Porém a SEFAZ rejeitou a nota porque a assinatura difere da calculada - era de se esperar este resultado.

Já abri um chamado para a SEFAZ-GO (já que não tenho o endereço de e-mail dos responsáveis pelo SCAN) questionando sobre este problema, mas gostaria de saber se alguém já conseguiu solucionar este problema? poderiam dar um help?

Agradeço antecipadamente.

Att.

Bom, incrível como a comunidade java é desunida, aposto que muitos já conseguiram solucionar este problema , mas cada um que se vire né?!

Nem adianta falar que já postou que resolveu utilizando isso ou aquilo. Fazer somente isso e nada é a mesma coisa. Como diz Linus Torvalds: “show me the code”.

Pois eh galera, sobre este erro, o meu XML não continha os caracteres de edição conforme o SCAN validara (isso mesmo, essa rejeição só aparecia no ambiente de homologação do SCAN).

Como sempre, a SEFAZ não respondeu à minhas dúvidas e tive que me virar - novamente…

O problema de rejeição 588 só acontecia porque o algorítimo e componentes que utilizava para assinar (ou assassinar[i], como preferir…) o XML gerava a assinatura com caracteres de quebra de linha entre as tags internasdo elemento <signature>. Os valores das tags de assinatura podem ter quebras de linha ("\n") normalmente, mas entre as tags JAMAIS isso deve acontecer.

Enfim, utilizava a api Apache org.apache.xml.security para assinar (com o erro) e substitui o código pelos componentes do próprio java (javax.xml.crypto.dsig) e a coisa funfou…

No meu caso eu utilizo o HSM para manter o certificado mas depois de obtido, não muda em nada para quem adota outros modelos de certificados.

Final Code:


//Assina o xml da nota....o parâmetro xml contém todo o arquivo xml &lt;NFe&gt;...&lt;/NFe&gt; preenchido
//O parâmetro tagname contém o nome da tag infNFe e o parâmetro nome possui o cnpj do emitente para que seja possível
//encontrar o certificado do cnpj no cache....
// O restante é bem legível
private static String signX(String xml, String tagname, String nome) throws Exception {

			//Converte a string do xml em um objeto Document
			Document document = DOMUtils.stringToDocument(xml);
			
			Key key = KeyStoreBuilder.get(nome).getKey();
			
			X509Certificate x509Certificate = getCertificadoDoBuffer(nome);
			
			XMLSignatureFactory sf = XMLSignatureFactory.getInstance("DOM");
			
			List&lt;Transform&gt; lt = new ArrayList&lt;Transform&gt;();

			Node infNFe = document.getElementsByTagName(tagname).item(0);
			
			((Element)infNFe).setIdAttribute("Id", true);
			
			String id = "#"+infNFe.getAttributes().getNamedItem("Id").getNodeValue();
			
			lt.add(sf.newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature", (TransformParameterSpec) null));
			lt.add(sf.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", (TransformParameterSpec) null));
			
			Reference ref = sf.newReference(id, sf.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null), lt, null, null);
			SignedInfo si = sf.newSignedInfo(sf.newCanonicalizationMethod("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", (C14NMethodParameterSpec) null), sf.newSignatureMethod("http://www.w3.org/2000/09/xmldsig#rsa-sha1", null), Collections.singletonList(ref));
			
			KeyInfoFactory kif = sf.getKeyInfoFactory();
			
			X509Data data = kif.newX509Data(Collections.singletonList(x509Certificate));
			KeyInfo ki = kif.newKeyInfo(Collections.singletonList(data));
			
			DOMSignContext sc = new DOMSignContext(key, document.getDocumentElement());
			javax.xml.crypto.dsig.XMLSignature signature = sf.newXMLSignature(si, ki); 
			
			signature.sign(sc);
			//Obtem somente o conteúdo da tag &lt;signature&gt; da estrutura Documento - neste ponto ela já foi gerada.
			//Converte o conteúdo da assinatura &lt;signature&gt; em string e devolve apenas a string da assinatura para o cliente - esta é a minha necessidade, pode não ser a sua!
			return DOMUtils.nodeToString(document.getDocumentElement().getElementsByTagName("Signature").item(0));
			
		}

Espero ter ajudado. Vou almoçar!!

bye!

A pergunta é meio antiga, mas é melhor responder mesmo assim.
Eu resolvi o problema removendo a identação do xml, conforme o exemplo abaixo:

Antes tava assim e dava erro:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:nfes="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"> <soap:Header> <nfes:nfeCabecMsg> <nfes:versaoDados>2.00</nfes:versaoDados> <nfes:cUF>41</nfes:cUF> </nfes:nfeCabecMsg> </soap:Header> <soap:Body> <nfes:nfeDadosMsg> <consStatServ versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe"> <tpAmb>2</tpAmb> <cUF>41</cUF> <xServ>STATUS</xServ> </consStatServ> </nfes:nfeDadosMsg> </soap:Body> </soap:Envelope>

Agora está assim e não dá mais erro:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:nfes="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><soap:Header><nfes:nfeCabecMsg><nfes:versaoDados>2.00</nfes:versaoDados><nfes:cUF>41</nfes:cUF></nfes:nfeCabecMsg></soap:Header><soap:Body><nfes:nfeDadosMsg><consStatServ versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><cUF>41</cUF><xServ>STATUS</xServ></consStatServ></nfes:nfeDadosMsg></soap:Body></soap:Envelope>

Mesmo que tardia fica a resposta para registro.