NFE V2.00 - Veja como consumir o WS

Etnão como o AGAraujo comentou… vou postar aqui um código feito por ele,
que corrige o problema de namespace que muitos estão tendo com o WS, acho que principalmento com o PR.

1 - Criar um novo projeto
2- Criar uma interface SefazServiceConfig

[code]package br.com.mysoft.mynfe.ws.application;

public interface SefazServiceConfig {
void setProperties();
String getWebServiceURL();
String getDefinitionsTargetNamespaceURI();
String getSchemaTargetNamespaceURI();
String getSoapActionURI();
String getServiceName();
String getPortName();
}[/code]3- Criar uma classe abstrata que implemente a interface acima[code]
package br.com.mysoft.mynfe.ws.application.impl;
/**

  • Classe abstrata responsável por setar as propriedades dos certificados

  • Arquivo: AbstractSefazServiceConfig.java

  • Data : 16/02/2011

  • Hora : 13:34:43
    */
    public abstract class AbstractSefazServiceConfig implements SefazServiceConfig
    {

    @SuppressWarnings(“unused”)
    private void setPropertiesA3(){
    Provider p = new SunPKCS11("{config for SUNPKCS 11 in config.cfg}");
    Security.addProvider§;
    Properties properties = System.getProperties();
    properties.setProperty(“java.protocol.handler.pkgs”, “com.sun.net.ssl.internal.www.protocol”);
    properties.setProperty(“javax.net.ssl.keyStoreType”, “PKCS11”);
    properties.setProperty(“javax.net.ssl.keyStore”,“NONE”);
    properties.setProperty(“javax.net.ssl.keyStoreProvider”, “SunPKCS11-SCR3310”);
    properties.setProperty(“javax.net.ssl.keyStorePassword”, “1234”);
    properties.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
    properties.setProperty(“javax.net.ssl.trustStore”, “{seu key store path}”);
    //
    try{
    KeyStore ks = KeyStore.getInstance(“PKCS11”);
    ks.load(null, “1234”.toCharArray()); //TODO password for keystore
    } catch (KeyStoreException e) {
    e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    } catch (CertificateException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    private void setPropertiesA1(){
    //preparar as propriedades
    Properties properties = System.getProperties();
    properties.setProperty(“java.protocol.handler.pkgs”, “com.sun.net.ssl.internal.www.protocol”);
    properties.setProperty(“javax.net.ssl.keyStoreType”, “PKCS12”);
    properties.setProperty(“javax.net.ssl.keyStore”,“cliente.pfx”);//Aqui vem o arquivo do certificado do seu cliente
    properties.setProperty(“javax.net.ssl.keyStorePassword”, “123456”);//Aqui a senha deste certificado
    properties.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
    properties.setProperty(“javax.net.ssl.trustStore”, “nfe.keystore”);//Aqui vem o arquivo criado através do comando keytool no passo 3
    properties.setProperty(“javax.net.ssl.trustStorePassword”, “123456”);
    properties.setProperty(“com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump”, “true”);
    //properties.setProperty(“javax.net.debug”, “all”); - for debug
    }

    @Override
    public final void setProperties() { setPropertiesA1();}
    [/code]4- Criar uma classe concreta que herde a classe abstrata AbstractSefazServiceConfig e implemente os métodos da interface SefazServiceConfig [code]
    package br.com.mysoft.mynfe.ws.application.impl;

/**

/**

  • Classe responsável por criar um Message e consumir o Web Service.

  • Arquivo: SefazService.java

  • Data : 16/02/2011

  • Hora : 14:01:27
    */
    public class SefazService
    {
    private final String webServiceURL;
    private String definitionsTargetNamespaceURI;
    private String schemaTargetNamespaceURI;
    private String soapActionURI;
    private String serviceName;
    private String portName;

    /**

    • Construtor que recebe a interface SefazServiceConfig como parametro
    • @param config
      */
      public SefazService(SefazServiceConfig config)
      {
      if (config == null) throw new IllegalArgumentException();
      config.setProperties();
      webServiceURL = config.getWebServiceURL();
      definitionsTargetNamespaceURI = config.getDefinitionsTargetNamespaceURI();
      schemaTargetNamespaceURI = config.getSchemaTargetNamespaceURI();
      soapActionURI = config.getSoapActionURI();
      serviceName = config.getServiceName();
      portName = config.getPortName();
      }

    /**

    • Método que envia o xml para o WS

    • @param xml

    • @return
      */
      public OutputStream sendXML(InputStream xml,String uf)throws SOAPException,Exception {
      //preparar as propriedades
      Provider provider = new Provider();
      Security.addProvider(provider);
      //Cria um serviço a partir do endereço do WS
      Service service = Service.create(new URL(webServiceURL+"?wsdl"),new QName(definitionsTargetNamespaceURI, serviceName));

       //Cria um Dispatch, que é responsável por invocar o serviço
       Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(schemaTargetNamespaceURI, portName),SOAPMessage.class,Service.Mode.MESSAGE);
       
       //Configura o RequestContext para a Message solicitada
       Map<String, Object> rc = dispatch.getRequestContext();  
       rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);  
       rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, soapActionURI);  
       rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceURL);
       
       // Cria um SOAPMessage Request, passando a especificação SOAP 1.2  
       MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
       SOAPMessage soapMessage = factory.createMessage();
       
       // Optional
       soapMessage.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "false");
       soapMessage.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");	
       
       // Cria o Header da mensagem 
       SOAPHeader header = soapMessage.getSOAPHeader();
       SOAPElement nfeCabecMsg = header.addChildElement("nfeCabecMsg", XMLConstants.DEFAULT_NS_PREFIX, definitionsTargetNamespaceURI);
       nfeCabecMsg.addChildElement("versaoDados").setValue("2.00");
       nfeCabecMsg.addChildElement("cUF").setValue(uf);
       
       // Cria o Body
       SOAPBody body = soapMessage.getSOAPBody();
       
       // Cria um elemento que vai ter os dados do XML    
       SOAPBodyElement nfeDadosMsg = body.addBodyElement(new QName(schemaTargetNamespaceURI, "nfeDadosMsg", XMLConstants.DEFAULT_NS_PREFIX));
       
       // Converte o stream (seu xml) para um Objeto DOM
       DOMResult domResult = new DOMResult();
       XMLReader reader = XMLReaderFactory.createXMLReader();
       InputSource inputSource = new InputSource(xml);
       SAXSource saxSource = new SAXSource(reader, inputSource);
       TransformerFactory transformerFactory = TransformerFactory.newInstance();
       Transformer transformer = transformerFactory.newTransformer();
       transformer.transform(saxSource, domResult);
       
       //obtém o Document 
       Document document = (Document) domResult.getNode();
       //cria um elemento a partir o Document
       SOAPElement soapElement = SOAPFactory.newInstance().createElement(document.getDocumentElement());
       //adiciona no Body
       nfeDadosMsg.addChildElement(soapElement); 
       //imprime o envelope
       soapMessage.writeTo(System.out);
       
       // invoca o WS e obtém o retorno
       SOAPMessage reply = dispatch.invoke(soapMessage);
       
       // Retorno
       OutputStream out = new ByteArrayOutputStream();
       reply.writeTo(out);	        
       return out;
      

    }
    }[/code]6- E por fim, a classe de teste. Neste exemplo vou apenas consumir o serviço de enviar lote (NFeRecepcao2)[code]
    package br.com.mysoft.mynfe.ws.application;

public class SefazServiceReceptionTest
{
public static void main(String[] args) throws SOAPException, Exception {
//Cria a classe de configuração
SefazServiceConfig config = new SefazServiceReceptionConfig();
//carrega o xml, aqui deve ter apenas o xml, (…)
InputStream xml = new FileInputStream(“test/br/com/mysoft/mynfe/ws/application/000000000025534-env-lot.xml”);
//instância a classe de service
SefazService sefazService = new SefazService(config);
//chama o método para enviar o xml
ByteArrayOutputStream result = (ByteArrayOutputStream) sefazService.sendXML(xml,“41”);

	if (result != null)
		result.writeTo(System.out);//imprime o retorno da Sefaz

}
}
[/code]

Mas ainda não acabou… agora que vem o pulo do gato…o XALAN.
7- Entrar no site do Xalan e baixar o bendito.
8- Então adicionar no class path, ou seja, importar a lib no seu projeto.
Pois segundo o AGAraujo, há relatos que existe um BUG na versão que vem com o JDK 1.6.
9- Isso ai, agora é só rodar o exemplo e correr pro abraço…
10- Print
envelope que foi mandado
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2"> <versaoDados>2.00</versaoDados><cUF>41</cUF></nfeCabecMsg></env:Header> <env:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2"> <enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"> <idLote>000000000025534</idLote><NFe xmlns="http://www.portalfiscal.inf.br/nfe">...//esta ai o bendito namespace
Foi feito um exemplo apenas de consumir o serviço NfeRecepcao2, mas é a mesma coisa para qualquer outro serviço.
O que você precisa fazer é apenas criar as classes para cada serviço conforme a classe SefazServiceReceptionConfig mostrada acima.

Aeeeee, valeu Alves.Felipe, sua ajuda foi de grande importancia…

Vou tentar uma outra forma que tenho aqui, se não der certo eu tento essa…

Valeu cara, abraço.

Show de bola!!!

Depois posto o projeto para construção do XML e para Assinatura.

Muito bom mesmo!

Já que vamos de dar de uma força pra quem ta fazendo, quero dar minha contribuição…

Classe pra instalar os certificados do servidor…

[code]import java.io.;
import java.security.
;
import java.security.cert.;
import javax.net.ssl.
;

import org.apache.log4j.Logger;

/**

  • @author Jr

  • @author dilnei

  • @edited Marcio Bulzani

  • Classe Responsavel por instalar o certificado na aplicacao.
    */
    public class InstallCert {

    private static org.apache.log4j.Logger log = Logger.getLogger(InstallCert.class);

    public InstallCert(){
    }

    public static void main(String[] args) throws Exception {
    }

    public void instalarCertificado() throws Exception {
    String host;
    int port;
    char[] passphrase;

     host = "homologacao.nfe2.fazenda.pr.gov.br";   //url do servidor, mudar para pegar dinamico.
     port = Integer.parseInt("443");
     String p = "changeit";
     passphrase = p.toCharArray();
     
     File file = new File("jssecacerts");
     if (file.isFile() == false) {
     	char SEP = File.separatorChar;
     	File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
     	file = new File(dir, "jssecacerts");
     	if (file.isFile() == false) {
     		file = new File(dir, "cacerts");
     	}    		
     }
         	
     log.info("Carregando KeyStore " + file + "...");
     InputStream in = new FileInputStream(file);
     KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
     ks.load(in, passphrase);
     in.close();
    
     SSLContext context = SSLContext.getInstance("TLS");
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
     tmf.init(ks);
     X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
     SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
     context.init(null, new TrustManager[] {tm}, null);
     SSLSocketFactory factory = context.getSocketFactory();
    
     log.info("Abrindo conexao para " + host + ":" + port + "...");
     SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
     socket.setSoTimeout(10000);
     try {
     	log.info("Iniciando SSL handshake...");
     	socket.startHandshake();
     	socket.close();
     	log.info("Nenhum erro de certificado, já é confiável...");
     } catch (SSLException e) {
     	log.info("Erro SSL Handshake: " + e);
     	e.printStackTrace(System.out);
     }
    
     X509Certificate[] chain = tm.chain;
     if (chain == null) {
     	System.out.println("Não foi possível obter cadeia de certificados de servidor");
     	return;
     }
    
     log.info("O servidor enviou " + chain.length + " certificado(s):");
     MessageDigest sha1 = MessageDigest.getInstance("SHA1");
     MessageDigest md5 = MessageDigest.getInstance("MD5");
     for (int i = 0; i < chain.length; i++) {
     	X509Certificate cert = chain[i];
     	log.info(" " + (i + 1) + " Subject " + cert.getSubjectDN());
     	log.info("   Issuer  " + cert.getIssuerDN());
     	sha1.update(cert.getEncoded());
     	log.info("   sha1    " + toHexString(sha1.digest()));
     	md5.update(cert.getEncoded());
     	log.info("   md5     " + toHexString(md5.digest()));    		
     }
    
     int k = 0;
    
     X509Certificate cert = chain[k];
     String alias = host + "-" + (k + 1);
     ks.setCertificateEntry(alias, cert);
     
     OutputStream out = new FileOutputStream("jssecacerts");
     ks.store(out, passphrase);
     out.close();
    
     log.info(cert);
     log.info("Certificado adicionado ao keystore 'jssecacerts' usando o alias '"	+ alias + "'");
    

    }

    private static final char[] HEXDIGITS = “0123456789abcdef”.toCharArray();

    private static String toHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 3);
    for (int b : bytes) {
    b &= 0xff;
    sb.append(HEXDIGITS[b >> 4]);
    sb.append(HEXDIGITS[b & 15]);
    sb.append(’ ');
    }
    return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

     private final X509TrustManager tm;
     private X509Certificate[] chain;
    
     SavingTrustManager(X509TrustManager tm) {
     	this.tm = tm;
     }
    
     public X509Certificate[] getAcceptedIssuers() {
     	throw new UnsupportedOperationException();
     }
    
     public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
     	throw new UnsupportedOperationException();
     }
    
     public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
     	this.chain = chain;
     	tm.checkServerTrusted(chain, authType);
     }
    

    }

    public void setarCertificados(){

     File file = new File("jssecacerts");
     if (file.isFile() == false) {
     	char SEP = File.separatorChar;
     	File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
     	file = new File(dir, "jssecacerts");
     	if (file.isFile() == false) {
     		file = new File(dir, "cacerts");
     	}    		
     }
    
     System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
     Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
     
     System.setProperty("javax.net.ssl.keyStoreType", "Tipo do certi.pfx ou alterar para A3 Conforme acima");
     System.setProperty("javax.net.ssl.keyStore", "Caminho-certi.pfx ou alterar para A3 Conforme acima");//Aqui vem o arquivo do certificado do seu cliente
     System.setProperty("javax.net.ssl.keyStorePassword", "senha");//Aqui a senha deste certificado
     
     System.setProperty("javax.net.ssl.trustStoreType", "JKS");
     System.setProperty("javax.net.ssl.trustStore", file.getAbsolutePath());
     System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    

    }
    }[/code]

e para setar o certificado no código, use…

try { new InstallCert().instalarCertificado(); } catch (Exception e) { log.info("Erro Instalar Certificado: " + e); } new InstallCert().setarCertificados();

Valeu, espero que todos terminem o projeto 2.00.

Cara, depois que tu postar a construção do XML e a Assinatura, eu vou colocar como fazer a impressão da DANFE com jasper gerado pelo iReport.

Se alguém tiver mais alguma idéia legal pra colocar ai…

Valeu.

Bom dia.

Muito bom o tópico! Agradeço a todos e acredito que deve estar ajudando muita gente além de mim.

Estou conseguindo consumir os WS do Sefaz a partir do código que o alves.Felipe postou. Porém agora surgiu um problema…
Eu já consumi o WS NfeStatusServico2 e NfeRecepcao2 sem problemas, porém agora estou tentando consumir o NfeRetRecepcao2, com o mesmo código, para ver o retorno do meu lote e estou tendo um erro…

Esse é o envelope que estou enviando:

E esse é o retorno do SEFAZ:

Eu já olhei, olhei, olhei, e não consigo achar nada errado… Alguém já passou por esse problema ou consegue presumir qual pode ser o erro?

Olá talles.pescumo,

Brow, tenta assim…

Valew

Pessoal…

Como eu havia prometido segue abaixo como que eu faço a impressão da Danfe.

Eu abro o projeto da DANFE no iReport e configuro o sql em DATA > Query do Relatório, lpa eu coloco o sql assim…

select * from vw_nfe_det where ID_NFE = $P{IDNFE}

Depois disso compilo o fonte para gerar o arquivo .jasper.

No programa eu utilizo um metodo chamado imprimir, como ele tem mais funções, vou colocar somente o que interessa…

....
Connection con = getConnection();
		Statement stm = (Statement) con.createStatement();
		String query = "select * from vw_nfe_det v where v.ID_NFE = " + idNfe;
		com.mysql.jdbc.ResultSet rs = (ResultSet) stm.executeQuery(query);
		JRResultSetDataSource jrDS = new JRResultSetDataSource(rs);
		Map parameters = new HashMap();
		parameters.put("SUBREPORT_DIR", "C:/programa/relatorios/");  //caminho necessario para localizar o subreport
		parameters.put("REPORT_CONNECTION", con);
		
        JasperPrint jasperPrint = JasperFillManager.fillReport("C:/programa/relatorios/danfe.jasper", parameters, jrDS);
        byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
                
        try {
            FileOutputStream outPut = new FileOutputStream("C:/programa/danfes/" + chNFe + "-pdf.pdf");
            outPut.write(bytes);
            outPut.close();
		} catch (FileNotFoundException e) {
			System.out.println("Erro na geração do arquivo!!! Erro FNFE: " + e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Erro na geração do arquivo!!! Erro IOE: " + e.getMessage());
			e.printStackTrace();
		}
....  

Beleza, espero ter ajudado…

Se alguem tiver alguma sugestão, ou algo que seja interessante colocar, colaborem.

Ola Mackrophus,

Se entendi era pra colocar os atributos Mackrophus xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” no body não é?

A ordem dos elementos em teoria não muda nada certo?

Eu coloquei os atributos e o erro continua o mesmo… estranho que envio a consulta do status por exemplo da mesma forma, e não da erro nenhum, assim como envio do lote…

=/

Vc esta conseguindo enviar consulta de lote no ambiente homologação sp 2.00 normalmente?

Valew!

talles.pescumo, cara isso é curioso…

Eu estou enviando para o Sefaz PR e SVRS, e vai normalmente…

Vou tentar enviar em sp pra ver o que dá.

Mackrophus realmente ta estranho…

Eu não tenho experiência com a NFe ainda, esse é meu primeiro projeto, mas mesmo assim parece estar tudo ok…

Se eu mudo algo no xml pra tentar acertar ele acusa erro na validação do Schema, se eu deixo como esta ele continua dando esse erro…
Mas em teoria não era pra acontecer, pq outros serviços funcionam normalmente enviando tudo da mesma forma… =/

Talles.

Cara, coloca o teu metodo ai, que eu vou testar com o seu.

Mackrophus meu método é praticamente a mesma coisa do alves.Felipe, vou mandar pra você dar uma olhada, dei uma modificada só pra ficar fácil de executar:

[code]import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.Provider;
import java.security.Security;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class NFe {
/**
* Método que envia o xml para o WS
*/
public OutputStream sendXML(InputStream xml)throws SOAPException,Exception {
String webServiceURL = “https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeRetRecepcao2.asmx”;
String definitionsTargetNamespaceURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2”;
String schemaTargetNamespaceURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2”;
String soapActionURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2/nfeRetRecepcao2”;
String serviceName = “NfeRetRecepcao2”;
String portName = “NfeRetRecepcao2Soap12”;

	//preparar as propriedades
	Provider provider = new com.sun.security.sasl.Provider();
	Security.addProvider(provider);
	//Cria um serviço a partir do endereço do WS
	Service service = Service.create(new URL(webServiceURL+"?WSDL"),new QName(definitionsTargetNamespaceURI, serviceName));
	
	//Cria um Dispatch, que é responsável por invocar o serviço
	Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(schemaTargetNamespaceURI, portName),SOAPMessage.class,Service.Mode.MESSAGE);
	
	//Configura o RequestContext para a Message solicitada
	Map<String, Object> rc = dispatch.getRequestContext();
    rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
    rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, soapActionURI);
    rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceURL);
    
    // Cria um SOAPMessage Request, passando a especificação SOAP 1.2
    MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    SOAPMessage soapMessage = factory.createMessage();
    
    // Optional
    soapMessage.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "false");
    soapMessage.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");
    
    // Cria o Header da mensagem 
    SOAPHeader header = soapMessage.getSOAPHeader();
    SOAPElement nfeCabecMsg = header.addChildElement("nfeCabecMsg", XMLConstants.DEFAULT_NS_PREFIX, definitionsTargetNamespaceURI);
    nfeCabecMsg.addChildElement("versaoDados").setValue("2.00");
    nfeCabecMsg.addChildElement("cUF").setValue("35");
    
    // Cria o Body
    SOAPBody body = soapMessage.getSOAPBody();
    
	//Esta eh a mudanca que voce sugeriu, mas nao alterou nada no retorno
    body.addAttribute(new QName("xmlns:xsi"), "http://www.w3.org/2001/XMLSchema-instance");
    body.addAttribute(new QName("xmlns:xsd"), "http://www.w3.org/2001/XMLSchema");
    
    // Cria um elemento que vai ter os dados do XML
    SOAPBodyElement nfeDadosMsg = body.addBodyElement(new QName(schemaTargetNamespaceURI, "nfeDadosMsg", XMLConstants.DEFAULT_NS_PREFIX));
    
    // Converte o stream (seu xml) para um Objeto DOM
    DOMResult domResult = new DOMResult();
	XMLReader reader = XMLReaderFactory.createXMLReader();
	InputSource inputSource = new InputSource(new FileInputStream("C:\\NFe\\consulta.xml"));
	SAXSource saxSource = new SAXSource(reader, inputSource);
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	Transformer transformer = transformerFactory.newTransformer();
	transformer.transform(saxSource, domResult);
	
    //obtém o Document
	Document document = (Document) domResult.getNode();
	//cria um elemento a partir o Document
	SOAPElement soapElement = SOAPFactory.newInstance().createElement(document.getDocumentElement());
	//adiciona no Body
    nfeDadosMsg.addChildElement(soapElement);
    //imprime o envelope
    soapMessage.writeTo(System.out);
    System.out.println();
    
    // invoca o WS e obtém o retorno
    SOAPMessage reply = dispatch.invoke(soapMessage);
    
    // Retorno
    OutputStream out = new ByteArrayOutputStream();
    reply.writeTo(out);	        
	
	((ByteArrayOutputStream)out).writeTo(System.out);
	
    return out;
}

}[/code]

O Xml eu não gerei por código, criei o arquivo na mão mesmo só pra testar, com o seguinte conteúdo:

Isso tudo funciona no envio do lote e na consulta de status do serviço, mas na consulta do lote está gerando o erro… =/

Valew!

[quote=Mackrophus]talles.pescumo, cara isso é curioso…

Eu estou enviando para o Sefaz PR e SVRS, e vai normalmente…

Vou tentar enviar em sp pra ver o que dá.[/quote]

Só para constar: está funcionando em homologação e produção em todos os estados, exceto AM, AC e PA que ainda não foi testado esse código.

[quote=talles.pescumo]Mackrophus meu método é praticamente a mesma coisa do alves.Felipe, vou mandar pra você dar uma olhada, dei uma modificada só pra ficar fácil de executar:

[code]import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.Provider;
import java.security.Security;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class NFe {
/**
* Método que envia o xml para o WS
*/
public OutputStream sendXML(InputStream xml)throws SOAPException,Exception {
String webServiceURL = “https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeRetRecepcao2.asmx”;
String definitionsTargetNamespaceURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2”;
String schemaTargetNamespaceURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2”;
String soapActionURI = “http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2/nfeRetRecepcao2”;
String serviceName = “NfeRetRecepcao2”;
String portName = “NfeRetRecepcao2Soap12”;

	//preparar as propriedades
	Provider provider = new com.sun.security.sasl.Provider();
	Security.addProvider(provider);
	//Cria um serviço a partir do endereço do WS
	Service service = Service.create(new URL(webServiceURL+"?WSDL"),new QName(definitionsTargetNamespaceURI, serviceName));
	
	//Cria um Dispatch, que é responsável por invocar o serviço
	Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(schemaTargetNamespaceURI, portName),SOAPMessage.class,Service.Mode.MESSAGE);
	
	//Configura o RequestContext para a Message solicitada
	Map<String, Object> rc = dispatch.getRequestContext();
    rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
    rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, soapActionURI);
    rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceURL);
    
    // Cria um SOAPMessage Request, passando a especificação SOAP 1.2
    MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    SOAPMessage soapMessage = factory.createMessage();
    
    // Optional
    soapMessage.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "false");
    soapMessage.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");
    
    // Cria o Header da mensagem 
    SOAPHeader header = soapMessage.getSOAPHeader();
    SOAPElement nfeCabecMsg = header.addChildElement("nfeCabecMsg", XMLConstants.DEFAULT_NS_PREFIX, definitionsTargetNamespaceURI);
    nfeCabecMsg.addChildElement("versaoDados").setValue("2.00");
    nfeCabecMsg.addChildElement("cUF").setValue("35");
    
    // Cria o Body
    SOAPBody body = soapMessage.getSOAPBody();
    
	//Esta eh a mudanca que voce sugeriu, mas nao alterou nada no retorno
    body.addAttribute(new QName("xmlns:xsi"), "http://www.w3.org/2001/XMLSchema-instance");
    body.addAttribute(new QName("xmlns:xsd"), "http://www.w3.org/2001/XMLSchema");
    
    // Cria um elemento que vai ter os dados do XML
    SOAPBodyElement nfeDadosMsg = body.addBodyElement(new QName(schemaTargetNamespaceURI, "nfeDadosMsg", XMLConstants.DEFAULT_NS_PREFIX));
    
    // Converte o stream (seu xml) para um Objeto DOM
    DOMResult domResult = new DOMResult();
	XMLReader reader = XMLReaderFactory.createXMLReader();
	InputSource inputSource = new InputSource(new FileInputStream("C:\\NFe\\consulta.xml"));
	SAXSource saxSource = new SAXSource(reader, inputSource);
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	Transformer transformer = transformerFactory.newTransformer();
	transformer.transform(saxSource, domResult);
	
    //obtém o Document
	Document document = (Document) domResult.getNode();
	//cria um elemento a partir o Document
	SOAPElement soapElement = SOAPFactory.newInstance().createElement(document.getDocumentElement());
	//adiciona no Body
    nfeDadosMsg.addChildElement(soapElement);
    //imprime o envelope
    soapMessage.writeTo(System.out);
    System.out.println();
    
    // invoca o WS e obtém o retorno
    SOAPMessage reply = dispatch.invoke(soapMessage);
    
    // Retorno
    OutputStream out = new ByteArrayOutputStream();
    reply.writeTo(out);	        
	
	((ByteArrayOutputStream)out).writeTo(System.out);
	
    return out;
}

}[/code]

O Xml eu não gerei por código, criei o arquivo na mão mesmo só pra testar, com o seguinte conteúdo:

Isso tudo funciona no envio do lote e na consulta de status do serviço, mas na consulta do lote está gerando o erro… =/

Valew![/quote]

Remova:

– body.addAttribute(new QName(“xmlns:xsi”), “http://www.w3.org/2001/XMLSchema-instance”);
– body.addAttribute(new QName(“xmlns:xsd”), “http://www.w3.org/2001/XMLSchema”);

remova do SOAPMessage (temporariamente) os dados:

Teste e envie:

  • o SOAPMessage antes do envio
  • o SOAPMessage de retorno

Ola AGAraujo,

O xmlns:si xmlns:sd não tinha inicialmente, eu coloquei só por sugestão aqui no fórum como tentativa, eu vi em alguma norma técnica que não deveriam ser inclusos, mas testando com ou sem tenho os mesmos resultados, na consulta do lote ele da o mesmo retorno de erro, e os outros WS que testei(envio de lote e consulta de status) funcionam normalmente…

Essa parte de remover os dados eu não entendi… é para a tag nfeDadosMsg ficar assim:?

Se for, eu testei e ele voltou o mesmo retorno.
Não sei se entendi algo errado… =/

[quote=talles.pescumo]Ola AGAraujo,

O xmlns:si xmlns:sd não tinha inicialmente, eu coloquei só por sugestão aqui no fórum como tentativa, eu vi em alguma norma técnica que não deveriam ser inclusos, mas testando com ou sem tenho os mesmos resultados, na consulta do lote ele da o mesmo retorno de erro, e os outros WS que testei(envio de lote e consulta de status) funcionam normalmente…

Essa parte de remover os dados eu não entendi… é para a tag nfeDadosMsg ficar assim:?

Se for, eu testei e ele voltou o mesmo retorno.
Não sei se entendi algo errado… =/[/quote]

Você fez o que eu pedi, exceto pelos retornos SOAPMessage, mas blz…

Se o erro é o mesmo, o problema não está no conteúdo.
Procurei no manual e não encontrei este erro.

Poderia fazer uma checagem para ver se o WebService está direcionado corretamente, se faltou alguma coisa e depois tente novamente.
Caso não consiga vamos mudar sua implementação para testar… Só espero que isto não seja uma “frescura” do WS-SP.

Só poderei te ajudar agora amanhã, mas post hoje o resultado se possivel pois tem mais gente ai que podera te ajudar.

T+

[quote=Mackrophus]Pessoal…

Beleza, espero ter ajudado…

Se alguem tiver alguma sugestão, ou algo que seja interessante colocar, colaborem.
[/quote]

Eu vou iniciar o projeto.
Mas acho que está quase tudo aí.
Talvez o .jrxml do DANFE ajude bastante…sopa no mel.

Show de bola.

AGAraujo,

Eu fiz um teste agora para análisar os retornos, tentei me comunicar com todos os WS de SP homologação, enviando a tag NFeDadosMsg vazia, igual no teste anterior, e curiosamente todos apresentaram a mensagem de erro “Rejeição: Usar somente o namespace padrão da NF-e”, menos o envio do lote, que voltou “Lote recebido com sucesso” mesmo não enviando nada… :S

Estranho também que no WS de consulta do status do serviço, quando eu envio a mensagem completa, com os dados, ele me da retorno normal, “Serviço em operação”… será que estou fazendo algo errado no teste?

Olha só, essas são as mensagens de envio e resposta de todos os WS:

[code]//WS NfeStatusServico2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e352011-03-17T08:20:44</soap:Body></soap:Envelope>

//WS NfeRecepcao2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h103Lote recebido com sucesso352011-03-17T08:20:443510000312684931</soap:Body></soap:Envelope>

//WS NfeRetRecepcao2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e35</soap:Body></soap:Envelope>

//WS NfeConsulta2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e35</soap:Body></soap:Envelope>

//WS NfeCancelamento2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e35</soap:Body></soap:Envelope>

//WS NfeInutilizacao2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:Body2SP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e35</soap:Body></soap:Envelope>

//WSC adConsultaCadastro2
<env:Envelope xmlns:env=“http://www.w3.org/2003/05/soap-envelope”>env:Header2.0035</env:Header>env:Body</env:Body></env:Envelope>
//Resposta
<soap:Envelope xmlns:soap=“http://www.w3.org/2003/05/soap-envelope” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Header352.00</soap:Header>soap:BodySP_NFE_PL_006h587Rejeição: Usar somente o namespace padrão da NF-e2011-03-17T08:20:4435</soap:Body></soap:Envelope>[/code]

E aqui as mensagens com dados do WS de consulta do status do serviço com retorno ok:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><versaoDados>2.00</versaoDados><cUF>35</cUF></nfeCabecMsg></env:Header><env:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><consStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><tpAmb>2</tpAmb><cUF>35</cUF><xServ>STATUS</xServ></consStatServ></nfeDadosMsg></env:Body></env:Envelope> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><cUF>35</cUF><versaoDados>2.00</versaoDados></nfeCabecMsg></soap:Header><soap:Body><nfeStatusServicoNF2Result xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><retConsStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><tpAmb>2</tpAmb><verAplic>SP_NFE_PL_006h</verAplic><cStat>107</cStat><xMotivo>Serviço em Operação</xMotivo><cUF>35</cUF><dhRecbto>2011-03-17T08:27:45</dhRecbto><tMed>1</tMed></retConsStatServ></nfeStatusServicoNF2Result></soap:Body></soap:Envelope>

O erro 587 esta na NT2010.009 http://www.nfe.fazenda.gov.br/portal/docs/NT2010.009.pdf , porém eu não estou utilizando nada diferente do exemplo, como você pode ver nas msg… complicado… =/