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 ?
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!