Nfe - Nota Fiscal Eletronica

[quote=evandromib]AGAraujo ainda nao entendi aonde está o erro usando o axis2 para o PR , sendo que para todos os outros estados estão rodando a um bom tempo em homologação e produção
sabe me dizer o q o serviço do PR esta diferenciado do restante , será realmente só problema no namespace, ah realmente a necessidade de se trocar a atual rotina feita com axis2 por envelope:
o que é estranho pq se a solicitação que envio para sefaz com a nota estivesse fora do padrao ele nao retornaria um numero de recibo
e sim a msg 215 - falha no schema XML que é diferente tb da msg 225 - falha no schema do Lote XML e esse erro é uma má formaçao do documento dentro das tag …
a msg 215 - falha no schema XML é um retorno da consulta de Retorno e nao da transmissão do Lote[/quote]

Cabra,

perae deixa analisar o que “falou” agora.
Você tem software rodando para todos os estados em homologaçaõ e produção e só dá erro no PR?
Isto é na geração 2G?
Se for está muito estranho mesmo!!! Se você tem a mesma implementação, sem tirar nem por, rodando para os outros, isto está mais do que estranho, e não tem nada haver com Axis2.
No teste que fiz com o Axis o mesmo erro que dá no CE, dá no PR e RS (ambiente de homologação).
Então começo a pensar que não pode ser realmente a mesma implementação!!!

Faça assim… mostre como vc esta fazendo em um estado que dá certo e como está fazendo em um estado que não dá certo e vamos analisando… Meu tempo esta meio curto esses dias, mas vamos nos ajudando que dará certo.

[quote=AGAraujo]Felipe se tiver comentado o código, pode mandá-lo inteirinho… sem problemas… acho que ajudará muito o pessoal…
[/quote]

Abri um novo tópico mostrando como consumir o WS.
segue http://www.guj.com.br/java/233399-nfe-v200—veja-como-consumir-o-ws/1#1201070

rs vc acabou de descobrir minha revolta rs

vou tentar explicar como esta rodando minha aplicação , eu uso a msm aplicação para clientes de qquer estado o que muda é q pego a UF do cliente e na função retorna qual o endereço (http) devo enviar NfeRecepcao2Stub(http).nfeRecepcaoLote2(dado,cabE);
entao tenho a msm aplicação para qquer estado , do que me passaram aqui na empresa Ceara, Maranhao , Bahia , Minas - estao funcionando RS nao sei te dizer agora, nao fiz teste la o q me passaram de problema foi do PR
como o historico desse SEFAZ nao é dos melhores fico mais desconfiado ainda

[quote=evandromib]rs vc acabou de descobrir minha revolta rs

vou tentar explicar como esta rodando minha aplicação , eu uso a msm aplicação para clientes de qquer estado o que muda é q pego a UF do cliente e na função retorna qual o endereço (http) devo enviar NfeRecepcao2Stub(http).nfeRecepcaoLote2(dado,cabE);
entao tenho a msm aplicação para qquer estado , do que me passaram aqui na empresa Ceara, Maranhao , Bahia , Minas - estao funcionando RS nao sei te dizer agora, nao fiz teste la o q me passaram de problema foi do PR
como o historico desse SEFAZ nao é dos melhores fico mais desconfiado ainda[/quote]

Então vamos fazer como o velho Jack… supondo que tudo este 100% e só mude a URL, mostre ai qual a saida do SOAP para um estado que está ok e a saída para um que não está.

Então AGAraujo, pelo que o evandromib falou ,ele não imprimiu o envelope antes de enviar, só antes de mandar pro parse…
faz assim evandromib, uma linha antes de chamar o stub.nfeRecepcaoLote2:

irá imprimir somente o xml como abaixo:

aqui ja da pra ver que vai dar pau. Mas pelo jeito PR é um dos poucos que validão o namespace no elemento NFe…
testa ai

bom nao entendi mto bem o q vc quer que eu mostre mais vamos la

envia a solicitação–

resposta da solicitação ja convertendo ela em DOM

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document docs = builder.parse(new InputSource(new StringReader([b]result.getExtraElement().toString()[/b])));

e verificar no docs o que veio na tag qual foi a ocorrencia ( tanto pra certo , como para errado )

[quote=alves.Felipe]Então AGAraujo, pelo que o evandromib falou ,ele não imprimiu o envelope antes de enviar, só antes de mandar pro parse…
faz assim evandromib, uma linha antes de chamar o stub.nfeRecepcaoLote2:

irá imprimir somente o xml como abaixo:

aqui ja da pra ver que vai dar pau. Mas pelo jeito PR é um dos poucos que validão o namespace no elemento NFe…
testa ai[/quote]

Bom… se o problema for apenas esse você já deu a solução… O estranho é funcionar em outros estados com este erro… pois é uma norma a implementação da validação desse campo. Em outras palavras, teria que dar erro em todos os WS. Deixa ele se explicar então…
Vou ter que sair daqui a 30 minutos e ai, possivelmente, só a semana que vem… Depois postem ai qual era realmente o erro e a solução para eu poder acompanhar e fazer o registro… Se for como Felipe disse, a solução já foi postada!

t+

[quote=AGAraujo]
Bom… se o problema for apenas esse você já deu a solução… O estranho é funcionar em outros estados com este erro… pois é uma norma a implementação da validação desse campo. Em outras palavras, teria que dar erro em todos os WS. Deixa ele se explicar então…
Vou ter que sair daqui a 30 minutos e ai, possivelmente, só a semana que vem… Depois postem ai qual era realmente o erro e a solução para eu poder acompanhar e fazer o registro… Se for como Felipe disse, a solução já foi postada!

t+[/quote]
acredito que é… pq eu estava usando Axis2 para consumir a NFe 2.00 do SVRS… na verdade ainda esta rodando em produção…
mas ja arranquei o Axis2, mas ainda não coloquei em produção…

[quote=evandromib]bom nao entendi mto bem o q vc quer que eu mostre mais vamos la

envia a solicitação–

resposta da solicitação ja convertendo ela em DOM

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document docs = builder.parse(new InputSource(new StringReader([b]result.getExtraElement().toString()[/b])));

e verificar no docs o que veio na tag qual foi a ocorrencia ( tanto pra certo , como para errado )
[/quote]

O que estava falando era o conteúdo do SOAPMessage ou SAXSource ou JAXBElement de saída e entrada. Tipo:

//Envelope para saída e para entrada
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Header>
    <nfeCabecMsg xmlns="{schemaURI}">
    ...
    </nfeCabecMsg>
</Header>
<Body>
    <nfeDadosMsg xmlns="{schemaURI}">
    ...
    </nfeDadosMsg>
</Body>
</Envelope>

bom dever isso q o felipe disse msm , verifiquei dpois do parse e realmente tinha removido um namespace da tag
o que ocorre nos outros estados é que a verificação de namespace tem q estar pelo menos em umas das tag ou entao dpois do parse uma dessas duas tiver os WS aceitam e justamente o do PR se exige nas duas tag , tive um problema assim parecido na versao 1.10 mais era pq nao passa o namespace para a tag e realmente dava erro como agora ja estava passando ache q nao estava removendo o parse justamente na hora de enviar o Lote , vou fazer algumas modificaçoes e posto o resultado mais tarde
valeu pessoal foi de grande valor a ajuda

[quote=alves.Felipe][quote=AGAraujo]
Bom… se o problema for apenas esse você já deu a solução… O estranho é funcionar em outros estados com este erro… pois é uma norma a implementação da validação desse campo. Em outras palavras, teria que dar erro em todos os WS. Deixa ele se explicar então…
Vou ter que sair daqui a 30 minutos e ai, possivelmente, só a semana que vem… Depois postem ai qual era realmente o erro e a solução para eu poder acompanhar e fazer o registro… Se for como Felipe disse, a solução já foi postada!

t+[/quote]
acredito que é… pq eu estava usando Axis2 para consumir a NFe 2.00 do SVRS… na verdade ainda esta rodando em produção…
mas ja arranquei o Axis2, mas ainda não coloquei em produção…[/quote]

Só para lembrar: o serviço do RS é implementado em .NET, bem como o de outros estado, assim como o do PR é em Java. Os erros de comunicação podem ser os mais diferentes possíveis, inclusive o de incompatibilidade.

O que quero dizer é: apesar de na teoria não haver diferença, pois trata-se de comunicação independente de plataforma, a implementação real dos serviços são diferentes, sendo que existem diferenças entre como o Glassfish, o JBOSS (Apache) e o IIS recebem uma mensagem SOAP e a entrega para a aplicação servidora processar estes dados (o tal do binding). Porém se você tentar fazer o mais simples possível (apenas como manda o figurino), por exemplo, como uma aplicação PHP faz, o recebimento será sempre o mesmo, e possívelmente, para o qual eles realmente estão preparados. E a única maneira de saber se o código está indo 100% simples é lendo o SOAPMessage.
Só como exemplo: meu sistema enviava para o Ceará sem os namespace corretos na versão 1.10 e funcionava tranquilo… por que??
Imagino que era porque eu usava a mesma tecnlogia deles (apenas uma hipotese), já uma outra empresa aqui que implementava em C# não conseguia… Lei de Murph eu acho!!


Retorno do Ceara (WS2G)

X-Powered-By Servlet/2.5
Server Sun GlassFish Enterprise Server v2.1
Content-Type text/html; charset=iso-8859-1
Content-Length 0
Date Wed, 16 Feb 2011 18:06:29 GMT


Retorno do Parana

Server Apache-Coyote/1.1
X-Powered-By Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type text/xml
Transfer-Encoding chunked
Date Wed, 16 Feb 2011 18:02:25 GMT


Retorno do Rio Grande do Sul

Date Wed, 16 Feb 2011 18:05:09 GMT
Server Microsoft-IIS/6.0
X-Powered-By ASP.NET
X-AspNet-Version 2.0.50727
Cache-Control private, max-age=0
Content-Type text/xml; charset=utf-8
Content-Length 3224

Bom dia Galera

Bom como eu prometi Resolvi o probleminha de 215 - Falha no schema XML que ocorre no SEFAZ do PR sem precisar mudar minha aplicação para SAX conforme postado pelo alves.Felipe neste topico

no meu codigo antigo fazia do seguinte modo

        String nfeDadosMsg = arq_xml;	// a variavel arq_xml é o XML "073012-160211-env-lot.xml"  + as tag <nfeDadosMsg>        

        ByteArrayInputStream nfeDados = new ByteArrayInputStream(nfeDadosMsg.getBytes());
        XMLStreamReader streamDados = XMLInputFactory.newInstance().createXMLStreamReader(source);   
        NfeRecepcao2Stub.NfeDadosMsg dado = NfeRecepcao2Stub.NfeDadosMsg.Factory.parse(streamDados);  

        String http = Endereco(Integer.parseInt(cod_uf), tpAmb);
        NfeRecepcaoLote2Result result = new NfeRecepcao2Stub(http).nfeRecepcaoLote2(dado, cabE);

nessa rotina se perdia o atributo "xmlns=“http://www.portalfiscal.inf.br/nfe” da tag
neste trecho do codigo = ByteArrayInputStream nfeDados = new ByteArrayInputStream(nfeDadosMsg.getBytes());

para corrigir o codigo ficou assim


		DocumentBuilderFactory factoryy = DocumentBuilderFactory.newInstance();
		factoryy.setNamespaceAware(false);
		DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
		Document docs_uf = bf.newDocumentBuilder().parse(new InputSource(new StringReader(arq_xml)));

		Source source = new DOMSource(docs_uf);
      //  ByteArrayInputStream nfeDados = new ByteArrayInputStream(nfeDadosMsg.getBytes());

        XMLStreamReader streamDados = XMLInputFactory.newInstance().createXMLStreamReader(source);   
        NfeRecepcao2Stub.NfeDadosMsg dado = NfeRecepcao2Stub.NfeDadosMsg.Factory.parse(streamDados);  
     
       String http = Endereco(Integer.parseInt(cod_uf), tpAmb);
   
      NfeRecepcaoLote2Result result = new NfeRecepcao2Stub(http).nfeRecepcaoLote2(dado, cabE);

criei um Document da String arq_xml e usei DOMSource ao inves de ByteArrayInputStream

e resolvi a questão da perda do namespace , transmitir a nota e consegui o retorno desejado ( 100 - Autorizado o uso da NF-e )

bom antes de terminar gostaria de agradecer principalmente a alves.Felipe , AGAraujo pela troca de informaçoes
espero q ajude a todos
abraço

fala evandromib…
muito bom… agora com tantas opções, só não faz quem não quer :smiley:
faro

e ai evandromib…

Cara, voce me fez ficar com muito raiva…

Quando eu abandonei o uso do axis2 eu só não tinha feito essa linha…

Source source = new DOMSource(docs_uf); 

Mas, ta legal, velho, se continuar assim o mestre Yoda perde o lugar…

Abraço…

é Mackrophus só de pensar em ter q mudar td ja estava ficando com mta raiva rsrs

mais blz , 1 problema a menos e q venha os proximos ( e vao vir concerteza rs)

[quote=Mackrophus]e ai evandromib…

Cara, voce me fez ficar com muito raiva…

Quando eu abandonei o uso do axis2 eu só não tinha feito essa linha…

Source source = new DOMSource(docs_uf); 

Mas, ta legal, velho, se continuar assim o mestre Yoda perde o lugar…

Abraço…
[/quote]

Estou de viagem, mas não resisti a curiosidade de ver como resolveram… e adorei a resposta!!!
Cara pelo que vi você resolveu um problema de compatibilidade entre o cliente e o servidor e não o que seria enviado no SOAPMessage… Isso é demais… só mostra o quanto a SEFAZ ainda tem que evoluir!

Minha hipotese é: Por traz dos bastidores o DOM resolve para vc um schema compatível como o do servidor do Paraná, já que lá é AXIS e você também esta usando um cliente AXIS!! Provavelmente lá utiliza-se de DOM para recuperar os dados e como vc enviou com DOM, deu certinnn, certinnn!!! Cara, muito show mesmo!

Até a próxima!!!

Pessoal … to com uma seguinte duvida
aqui na empresa compramos um certificado A3 token da serasa

instalei. tudo certinho
mas as minhas buscas no forum… fala que pro certificado a3 tem que gerar um arquivo token.cfg
contendo o caminho da dll do token

mas ai é que ta o problema… o meu certificado não mandou dll nenhuma pro windows/system32/

o que eu faço??

e ai dudu_sps…

Cara seguinte…

Verifica se tem um programa de instalação do token, é muito provavel que essa dll esteja la no programa, qualquer coisa passa o modelo do token que eu do uma olhada…

[quote=dudu_sps]…
mas as minhas buscas no forum… fala que pro certificado a3 tem que gerar um arquivo token.cfg
contendo o caminho da dll do token

mas ai é que ta o problema… o meu certificado não mandou dll nenhuma pro windows/system32/
[/quote]

No próprio software de administração do token diz qual o provedor do pkcs11.
Se você adquiriu um token na Serasa, então ele deve ser Safenet e seu pkcs11.cfg deve ser assim:

name=eToken
library=c:\windows\system32\dkck201.dll
disabledMechanisms = {
      CKM_SHA1_RSA_PKCS
}

Alencar

ai pra voce assinar é assim…

[code] Provider p = new sun.security.pkcs11.SunPKCS11(“C:/aplicacao/conf/token.cfg”);
Security.addProvider§;

    KeyStore ks = null;   
    try {   
        ks = KeyStore.getInstance("PKCS11");   
    } catch (KeyStoreException e2) {   
        // TODO Auto-generated catch block   
        e2.printStackTrace();   
    }   
    try {   
        //ks.load(null, "safeweb".toCharArray());
    	ks.load(null, Utilitario.senhaCertCli().toCharArray());
    } catch (NoSuchAlgorithmException e) {   
        // TODO Auto-generated catch block   
        e.printStackTrace();   
    } catch (CertificateException e) {   
        // TODO Auto-generated catch block   
        e.printStackTrace();   
    } catch (IOException e) {   
        // TODO Auto-generated catch block   
        e.printStackTrace();   
    }   
       
    Enumeration<String> aliasesEnum = null;
	try {
		aliasesEnum = ks.aliases();
	} catch (KeyStoreException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	}   
	
    String alias = "";
    String aliasUso = "";
    	
    while (aliasesEnum.hasMoreElements()) {   
        alias = (String) aliasesEnum.nextElement();   
        System.out.println("alias " + alias);   
        try {
			if (ks.isKeyEntry(alias)) {
				aliasUso = alias;
			    break;   
			}
		} catch (KeyStoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   
    }   
       
    KeyStore.PrivateKeyEntry keyEntry = null;
	try {
		keyEntry = (PrivateKeyEntry) ks.getEntry(aliasUso, new KeyStore.PasswordProtection(Utilitario.senhaCertCli().toCharArray()));
	} catch (NoSuchAlgorithmException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	} catch (UnrecoverableEntryException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	} catch (KeyStoreException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	}   

    @SuppressWarnings("unused")
	X509Certificate cert = (X509Certificate) keyEntry.getCertificate();   
           
    System.setProperty("javax.net.ssl.keyStoreType", ks.getType());     
    System.setProperty("javax.net.ssl.keyStore", "NONE");   
    //Essa informação vc tem que pegar do cartão, senão da erro e não abre.   
    System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-eToken");     
    System.setProperty("javax.net.ssl.keyStorePassword", Utilitario.senhaCertCli());     
       
    System.setProperty("javax.net.ssl.trustStoreType", "JKS");   
    System.setProperty("javax.net.ssl.trustStore", nfe.keystore);//Aqui vem o arquivo criado através do comando keytool no passo 3   
    System.setProperty("javax.net.ssl.trustStorePassword", "senha");//Aqui a senha deste keystore		

[/code]

Seria legal voce juntar o primeiro script que passei pra buscar o certificado do sefaz, com esse, pq ai fica tudo automatico.

Espero ter ajudado…

Abraço.