Consumir Webservice Soap 1.2

Pessoal aguem poderia me dar uma dica de como consumir um ws soap 1.2.
mas sem que o programa tenha vinculos com o wsdl.

Tentei usar o wizard do eclipse mas nao tive sucesso…!!

Alguem tem outra dica ?

Utilize o messageFactory para criar uma SOAPMessage. É muito mais simples.
Este exemplo, permite consumir o webservice de consulta status da nota fiscal eletronica.

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        StringBuffer soapMessage = new StringBuffer();
        soapMessage.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
                .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
                .append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")
                .append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")
                .append("<soap12:Header>")
                .append("<nfeCabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")
                .append("<versaoDados>2.0</versaoDados>")
                .append("<cUF>50</cUF>")
                .append("</nfeCabecMsg>")
                .append("</soap12:Header>")
                .append("<soap12:Body>")
                .append("<nfeStatusServicoNF2 xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")
                .append("<nfeDadosMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\">")
                .append("<consStatServ xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\">")
                .append("<tpAmb>2</tpAmb>")
                .append("<cUF>50</cUF>")
                .append("<xServ>STATUS</xServ>")
                .append("</consStatServ>")
                .append("</nfeDadosMsg>")
                .append("</nfeStatusServicoNF2>")
                .append("</soap12:Body>")
                .append("</soap12:Envelope>");

         metodo2(soapMessage.toString(), "http://localhost:8080/teste-ws/NfeStatusServico2");

    }


    public static void metodo2(String envelope, String urlAddress) {

        try {
            MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
            SOAPMessage message;

            try {
                MimeHeaders header = new MimeHeaders();
                header.addHeader("Content-Type", "application/soap+xml");

                message = factory.createMessage(header, new ByteArrayInputStream(envelope.getBytes()));
                SOAPConnection con = SOAPConnectionFactory.newInstance().createConnection();

                URL url = new URL(urlAddress);
                System.out.println("Message enviada \n"+message);
                SOAPMessage res = con.call(message, url);

                ByteArrayOutputStream in = new ByteArrayOutputStream();
                message.writeTo(in);
                System.out.println("in :\n"+in.toString());

                ByteArrayOutputStream out = new ByteArrayOutputStream();
                res.writeTo(out);
                System.out.println("out :\n"+desnormalizar(out.toString()));

            } catch (IOException ex) {
                System.out.println("" + ex.getMessage());
            }
        } catch (SOAPException ex) {
            System.out.println("" + ex.getMessage());
        }
    }

    public static String desnormalizar(String texto) {
        return texto.replace("<", "<").replace(">", ">").replace(""", "\"").replace("
", "\r");
    }

}

Olá estou fazendo exatamente como disse mas estou recebendo o seguinte retorno:

<?xml version="1.0" encoding="utf-8"?>
<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:Body>
        <soap:Fault>
            <soap:Code>
                <soap:Value>soap:Sender</soap:Value>
            </soap:Code>
            <soap:Reason>
                <soap:Text xml:lang="en">Unable to handle request without a valid action parameter. Please supply a valid soap action.</soap:Text>
            </soap:Reason>
            <soap:Detail/>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

tem alguma ideia ?
Valew

O exemplo que te passei é para a nova versão do NFe 2.00, para a versão 1.10 é diferente, nesta versão o nfeCabecMsg faz parte do body.
Mas realmente tem um erro, remova as linhas 20 e 28 que ai funciona.

Italivio, consegui fazer para todos os estados usando o mesmo certificado, como era na versao anterior o erro resolveu qdo coloquei na tag o atributo
http://www.portalfiscal.inf.br/nfe,

nao me pergunte por que… mas funcionou…rs

obrigado pela atencao…
abracos…

Esse é o namespace, que é validado pelo webservice, portanto e obrigatorio.

Pessoal,

Estou precisando desenvolver um sistema que consulte utilize dos servicoes de NF-e, comecei pelo NfeStatusServico porém estou meio perdido, tentei utilizar geradores de codigo tipo o do netbeans e eclipse, mas o codigo gerado ficou muito confuso para mim, infelizmente nao tenho tempo de estudar web services, para codificar, por isso pesso a ajuda de vcs.
Tentei utilizar o exemplo acima, mas nao deu certo, deu permissao negada quando coloquei a url da receita no meu caso: “https://hnfe.fazenda.mg.gov.br/nfe2/services/NfeStatus2”.
Utilizando o codigo acima, alguem saberia me dizer como faco para setar o valor do certificado, a senha e o tipo dele.

Se alguem tiver ai um codigo que faça isso, me ajudaria muito !!

Obrigado a todos!

    try {

        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", <trustStore>);
        System.setProperty("javax.net.ssl.trustStorePassword", <password>);

        System.setProperty("javax.net.ssl.keyStore", <keyStore>);
        System.setProperty("javax.net.ssl.keyStoreType", "JKS");
        System.setProperty("javax.net.ssl.keyStorePassword", <password>);

    } catch (Exception e) {
        e.printStackTrace();
    }

As variáveis : <trustStore>, <password>, <keyStore> devem ser substituidos pelo path e nome dos arquivos que contém os certificados.
Exemplos : <keyStore> = “/opt/nfe/certificados/keystore.jks”
<password> = “changeit”
<trustStore> = " /opt/nfe/certificados/cacerts.jks"

Olá.
Desenvolvi meu sistema de NFe através do JDeveloper e agora estou trabalhando na versão nova da NFe.
Criei os WS novos em Soap, porém tenho dificuldades para implementá-los.
No caso do cancelamento de notas, tentei passar os parâmetros para envio de todas as maneiras, mas sempre paro na mensagem “Resultado: 409-Rejeicao: Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header”

Método que atribuo os valores que serão usados pelo WS:

private void setaParametrosMsgSoap() throws Exception {
  try{             
    MessageFactory factory = MessageFactory.newInstance();
    SOAPMessage message = factory.createMessage();
  
    javax.xml.soap.SOAPElement element = message.getSOAPBody().addDocument(this.msgXmlDocumento); 
      
    this.nfeCabecMsg.setVersaoDados(Uteis.versaoOperacao(this.tipo));//pega a versao salva no meu banco
    this.nfeCabecMsg.setCUF(Uteis.pegaUfEmpresa(this.empresa));//pega o estado da empresa emissora
    
    
    this.nfeCabecMsg_prime = new NfeCabecMsgHolder(this.nfeCabecMsg);
    this.elementoDadosMsg = element.getParentElement();
  }catch (Exception e) {
                 e.printStackTrace();
  }

}

no meu método que chama o WS e recebe a resposta da receita:

        nfe.model.ws.homologacao.NfeCancelamento2Soap12Client wsProxy = 
        new nfe.model.ws.homologacao.NfeCancelamento2Soap12Client();
        setaParametrosMsgSoap(); 
        
                    
        
        return wsProxy.nfeCancelamentoNF2(this.elementoDadosMsg,  this.nfeCabecMsg , this.nfeCabecMsg_prime).toString();

Olá.
Desenvolvi meu sistema de NFe através do JDeveloper e agora estou trabalhando na versão nova da NFe.
Criei os WS novos em Soap, porém tenho dificuldades para implementá-los.
No caso do cancelamento de notas, tentei passar os parâmetros para envio de todas as maneiras, mas sempre paro na mensagem “Resultado: 409-Rejeicao: Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header”

Método que atribuo os valores que serão usados pelo WS:

[code] private void setaParametrosMsgSoap() throws Exception {
try{
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage();

    javax.xml.soap.SOAPElement element = message.getSOAPBody().addDocument(this.msgXmlDocumento); 
      
    this.nfeCabecMsg.setVersaoDados(Uteis.versaoOperacao(this.tipo));//pega a versao salva no meu banco
    this.nfeCabecMsg.setCUF(Uteis.pegaUfEmpresa(this.empresa));//pega o estado da empresa emissora
    
    
    this.nfeCabecMsg_prime = new NfeCabecMsgHolder(this.nfeCabecMsg);
    this.elementoDadosMsg = element.getParentElement();
  }catch (Exception e) {
                 e.printStackTrace();
  }

}[/code]

no meu método que chama o WS e recebe a resposta da receita:

        [code]nfe.model.ws.homologacao.NfeCancelamento2Soap12Client wsProxy = 
        new nfe.model.ws.homologacao.NfeCancelamento2Soap12Client();
        setaParametrosMsgSoap(); 
        
                    
        
        return wsProxy.nfeCancelamentoNF2(this.elementoDadosMsg,  this.nfeCabecMsg , this.nfeCabecMsg_prime).toString();
         [/code]

Deus meu, to suando sangue nessa parada e não encontro solução… :?

Estou tentando consultar o serviço da sefaz mas ele sempre retorna o erro de que falta parametros do Action Soap…

Segue o código:

package br.com.eitconsultas.service;

import br.com.eit.DummyConnector;
import br.com.eitconsultas.usefull.Certificado;
//import com.sap.conn.jco.util.Codecs.Base64;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.soap.*;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.codec.binary.Base64;

/**
 * Classe responsavel por consumir o Webservice da Sefaz.
 *
 * @author Dilnei Cunha.
 */
public class WSConsultaProtocolo_1 {

    /**
     * Método responsavel por consultar e trzer o retorno da consutla.
     *
     * @return
     */
    public static String retConsultaProtocolo_1() throws Throwable {

        // Debug. 
//        System.setProperty("javax.net.debug", "all");

        // Configuro o certificado.
        System.out.println(DummyConnector.properties.getProperty("CertifPath")
                + DummyConnector.properties.getProperty("CertifPass"));
        Certificado.ler(DummyConnector.properties.getProperty("CertifPath"),
                DummyConnector.properties.getProperty("CertifPass"));

        // Pego o código da UF.

        String urlAdders = null;

//        urlAdders = "https://nfe.fazenda.mg.gov.br/nfe2/services/NfeConsulta2";

        // Crio uma instancia de String Builder, para criar o envelope SOAP.
        StringBuilder soapMessage = new StringBuilder();

        urlAdders = "https://homologacao.nfe.sefaz.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx";

        soapMessage.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
                .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
                .append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")
                .append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")
                .append("<soap12:Header>")
                .append("<nfeCabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")
                .append("<versaoDados>2.0</versaoDados>")
                .append("<cUF>35</cUF>")
                .append("</nfeCabecMsg>")
                .append("</soap12:Header>")
                .append("<soap12:Body>")
                .append("<nfeStatusServicoNF2 xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")
                .append("<nfeDadosMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\">")
                .append("<consStatServ xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\">")
                .append("<tpAmb>2</tpAmb>")
                .append("<cUF>35</cUF>")
                .append("<xServ>STATUS</xServ>")
                .append("</consStatServ>")
                .append("</nfeDadosMsg>")
                .append("</nfeStatusServicoNF2>")
                .append("</soap12:Body>")
                .append("</soap12:Envelope>");


        // Crio a fabrica e defino a versão do protocolo SOAP 1.2
        MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

        // Configuro os headers.
        MimeHeaders header = new MimeHeaders();
        header.addHeader("Content-Type", "application/soap+xml");

        // Crio a mensagem.
//        System.out.println(soapMessage.toString());
        SOAPMessage message = factory.createMessage(header, new ByteArrayInputStream(soapMessage.toString().getBytes()));

        // Crio a conexão.
        SOAPConnection con = SOAPConnectionFactory.newInstance().createConnection();

        // Configuro a URL.
        URL url = new URL(urlAdders);


        // Chamando o serviço.
        SOAPMessage res = con.call(message, url);

        // Fecho a conexão.
        con.close();

        // Armazeno o retorno da sefaz.
        StringWriter sw = new StringWriter();
        Source source = new DOMSource(res.getSOAPPart().getEnvelope().getBody().getFirstChild());
        TransformerFactory.newInstance().newTransformer().transform(source, new StreamResult(sw));
        String retConsSitNFe = sw.toString();
        return retConsSitNFe;
    }

    private static String createConsSitNFe(String chaveNFe) {
        StringBuilder xml = new StringBuilder();
        xml.append("<consSitNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\">");
        xml.append("<tpAmb>1</tpAmb>");
        xml.append("<xServ>CONSULTAR</xServ>");
        xml.append("<chNFe>").append(chaveNFe).append("</chNFe>");
        xml.append("</consSitNFe>");
        return xml.toString();
    }
}

Ele carrega o certificado, gera o trust_store

Com o mesmo código tenho sucesso em consultar o status de NF (se está aprovada ou cancelada)… mas para o resto não funciona. Segue a resposta:


<?xml version="1.0" encoding="UTF-8"?><soap:Fault xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Code><soap:Value>soap:Sender</soap:Value></soap:Code><soap:Reason><soap:Text xml:lang="en">Unable to handle request without a valid action parameter. Please supply a valid soap action.</soap:Text></soap:Reason><soap:Detail/></soap:Fault>

Cara porque é tão complicado essas comunicações, to com saudades do Rest, tão simples. Será que alguem consegue me ajudar?

Valeu pessoal!