Página 1 de 3

Consumo de Webservice com Harbour.

Enviado: 24 Abr 2017 09:26
por Mario Mesquita
Bom dia e boa semana a todos.

Amigos, estou precisando aprender como fazer as operações de receber e enviar dados por meio de webservice. Vi em alguns tópicos algo sobre, mas alguns tópicos já são um pouco antigos, então gostaria de saber:

O Harbour trata as operações webservice nativamente? Ou precisa de algo externo para essas operações?

Alguma literatura disponível ou algum exemplo de uma coisa básica para o aprendizado necessário?

Conheço apenas o conceito, mas nunca lidei com isso, então quem tiver alguma dica e/ou já fez algo e puder compartilhar, agradeço.

Abraço a todos,
Mario.

Consumo de Webservice com Harbour.

Enviado: 24 Abr 2017 13:33
por marsp
Também tenho interesse neste assunto.

Consumo de Webservice com Harbour.

Enviado: 24 Abr 2017 16:09
por JoséQuintas
No fórum tem muito exemplo, só pesquisar webservice, soap, curl, libcurl, msxml, hbtip, etc.
Nota: Isso continua igual há mais de uma década.

Consumo de Webservice com Harbour.

Enviado: 26 Abr 2017 14:10
por marsp
JoséQuintas, estou precisando emitir NFSe para Sorocaba,
já li varios post seu e do Rochinha e nãp consegui resolver o problema.
Não sei mais o que fazer. Se possível poderia dar uma olhada nos anexos e me dizer onde estou errando.

Obrigado

Código: Selecionar todos

/************************************************
* Compilar: hbmk2 soap.prg -lhbwin -lxhb
************************************************/
#include "hbcompat.ch"
#include "hbxml.ch"
#include "hbmxml.ch"
   #Include "Common.ch"  // fwh\include
   #Include "winapi.ch"  // fwh\include
   #Include "objects.ch" // fwh\include

function main()
   local cXml, cSoapAction, cWebservice, cRetorno  , oXML
   local wIM,wSerie,wNrRPS,wDTEmi,wTrib,wSitRPS,wTPReco,wCodAti,wCpfCgc,vHash,wVSERV,wVDed
   LOCAL cXMLRetorno

   cls
   cWebservice := "https://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws?wsdl"
   cSoapAction := "enviar"
   wIM    := "00000112695"
   wSerie := "NF   "
   wNrRPS := "000000000001"
   wDTEmi := "20170418"
   wTrib  := "T "
   wSitRPS:= "N"
   wTPReco:= "N"                 // TIPO DE RECOLHIMENTO SE FOR A PREENCHE COM N SENAO S
   wVSERV := "000000000082000"
   wVDed  := "000000000000000"
   wCodAti:= "0829979901"
   wCpfCgc:= "49544406000124"    // CGC/CPF do Tomador

   vHash := hb_SHA1(wIM+wSerie+wNrRPS+wDTEmi+wTrib+wSitRPS+wTPReco+wVSERV+wVDed+wCodAti+wCpfCgc)


   cXML:=[<?xml version="1.0" encoding="UTF-8"?>]+;
   [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">]+;
      "<soapenv:Body>"+;
          "<soapenv:enviar>"+;
               [<ns1:ReqEnvioLoteRPS xmlns:ns1="http://localhost:8080/WsNFe2/lote" xmlns:tipos="http://localhost:8080/WsNFe2/tp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqEnvioLoteRPS.xsd">]+;
         "<Cabecalho>"+;
            "<CodCidade>7145</CodCidade>"+;
            "<CPFCNPJRemetente>03531116000145</CPFCNPJRemetente>"+;
            "<RazaoSocialRemetente>EMPRESA MODELO</RazaoSocialRemetente>"+;
            "<transacao/>"+;
            "<dtInicio>2017-04-19</dtInicio>"+;
            "<dtFim>2017-04-19</dtFim>"+;
            "<QtdRPS>1</QtdRPS>"+;
            "<ValorTotalServicos>820.00</ValorTotalServicos>"+;
            "<ValorTotalDeducoes>0.00</ValorTotalDeducoes>"+;
            "<Versao>1</Versao>"+;
            "<MetodoEnvio>ws</MetodoEnvio>"+;
         "</Cabecalho>"+;
         [<Lote Id="lote:1ABCDZ">]+;
            [<RPS Id="rps:1">]+;
               "<Assinatura>"+vHash+"</Assinatura>"+;
               "<InscricaoMunicipalPrestador>000112695</InscricaoMunicipalPrestador>"+;
               "<RazaoSocialPrestador>EMPRESA MODELO</RazaoSocialPrestador>"+;
               "<TipoRPS>RPS</TipoRPS>"+;
               "<SerieRPS>NF</SerieRPS>"+;
               "<NumeroRPS>1</NumeroRPS>"+;
               "<DataEmissaoRPS>2017-04-19T15:00:00</DataEmissaoRPS>"+;
               "<SituacaoRPS>N</SituacaoRPS>"+;
               "<SerieRPSSubstituido/>"+;
               "<NumeroRPSSubstituido>0</NumeroRPSSubstituido>"+;
               "<NumeroNFSeSubstituida>0</NumeroNFSeSubstituida>"+;
               "<DataEmissaoNFSeSubstituida>1900-01-01</DataEmissaoNFSeSubstituida>"+;
               "<SeriePrestacao>99</SeriePrestacao>"+;
               "<InscricaoMunicipalTomador>0000000</InscricaoMunicipalTomador>"+;
               "<CPFCNPJTomador>49544406000124</CPFCNPJTomador>"+;
               "<RazaoSocialTomador>EMPRESA DE TESTES</RazaoSocialTomador>"+;
               "<DocTomadorEstrangeiro/>"+;
               "<TipoLogradouroTomador>Rua</TipoLogradouroTomador>"+;
               "<LogradouroTomador>SANTA RITA</LogradouroTomador>"+;
               "<NumeroEnderecoTomador>425</NumeroEnderecoTomador>"+;
               "<ComplementoEnderecoTomador/>"+;
               "<TipoBairroTomador>Bairro</TipoBairroTomador>"+;
               "<BairroTomador>Eden</BairroTomador>"+;
               "<CidadeTomador>0007145</CidadeTomador>"+;
               "<CidadeTomadorDescricao>Sorocaba</CidadeTomadorDescricao>"+;
               "<CEPTomador>18087157</CEPTomador>"+;
               "<EmailTomador>rafael@ig.com.br</EmailTomador>"+;
               "<CodigoAtividade>829979901</CodigoAtividade>"+;
               "<AliquotaAtividade>5.0000</AliquotaAtividade>"+;
               "<TipoRecolhimento>A</TipoRecolhimento>"+;
               "<MunicipioPrestacao>0007145</MunicipioPrestacao>"+;
               "<MunicipioPrestacaoDescricao>Sorocaba</MunicipioPrestacaoDescricao>"+;
               "<Operacao>A</Operacao>"+;
               "<Tributacao>T</Tributacao>"+;
               "<ValorPIS>5.33</ValorPIS>"+;
               "<ValorCOFINS>24.60</ValorCOFINS>"+;
               "<ValorINSS>0.00</ValorINSS>"+;
               "<ValorIR>12.30</ValorIR>"+;
               "<ValorCSLL>8.20</ValorCSLL>"+;
               "<AliquotaPIS>0.6500</AliquotaPIS>"+;
               "<AliquotaCOFINS>3.0000</AliquotaCOFINS>"+;
               "<AliquotaINSS>11.0000</AliquotaINSS>"+;
               "<AliquotaIR>1.5000</AliquotaIR>"+;
               "<AliquotaCSLL>1.0000</AliquotaCSLL>"+;
               "<DescricaoRPS>Servico de processamento de dados</DescricaoRPS>"+;
               "<DDDPrestador>011</DDDPrestador>"+;
               "<TelefonePrestador>12345678</TelefonePrestador>"+;
               "<DDDTomador>011</DDDTomador>"+;
               "<TelefoneTomador>12345678</TelefoneTomador>"+;
               "<MotCancelamento/>"+;
               "<CPFCNPJIntermediario/>"+;
               "<Deducoes/>"+;
               "<Itens>"+;
                  "<Item>"+;
                     "<DiscriminacaoServico>Sistema de gestao</DiscriminacaoServico>"+;
                     "<Quantidade>1.0000</Quantidade>"+;
                     "<ValorUnitario>820.0000</ValorUnitario>"+;
                     "<ValorTotal>820.00</ValorTotal>"+;
                     "<Tributavel>S</Tributavel>"+;
                  "</Item>"+;
               "</Itens>"+;
            "</RPS>"+;
         "</Lote>"+;
         "</ns1:ReqEnvioLoteRPS>"+;
    "</soapenv:enviar>"+;
  "</soapenv:Body>"+;
"</soapenv:Envelope>"


   *-- VERIFICA A ESTRUTURA DO XML SE ESTÁ CORRETA
   oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

   IF oXML:nError != HBXML_ERROR_NONE
      alert( "xml com problema " + Str( oXML:nError ) )
      RETURN
   ENDIF

   *-- ENVIA O WEBSERVICE E LE O RETORNO
   cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )

   *--
   MemoWrit('retorno.xml',cRetorno)

RETURN

*------------------------------------------------------
*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
LOCAL oServer, oDOMDoc, nCont, cRetorno := "*ERRO*", cXmlRetorno := ""
   oServer:=CreateObject( "MSXML2.ServerXMLHTTP.5.0")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
// oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc:=CreateObject( "MSXML2.DOMDocument.5.0" )
   oDOMDoc:async              := .F.
   oDOMDoc:validateOnParse    := .T.
   oDOMDoc:resolveExternals   := .F.
   oDOMDoc:preserveWhiteSpace := .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
      msginfo("Erro: xML nao carregado")
      RETURN Nil
   ENDIF
   TRY
      oServer:send(oDOMDoc:xml)
   CATCH oError
      msginfo("Falha no envio do xML")
      RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
      syswait(0.5)
   ENDDO
   cRetorno := oServer:responseText
   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN( cXmlRetorno )






Consumo de Webservice com Harbour.

Enviado: 26 Abr 2017 14:42
por JoséQuintas
A comunicação, à primeira vista, funcionou, já que tem resposta.
O problema agora é com o XML.

Esse XML já contém o envelope, usado pra comunicação, e o XML da nota propriamente dito.

Esse XML é "duplo" contém o envelope de comunicação e a nota de serviço.

É nesse envelope que vão as configurações necessárias pra comunicação, e isso pode alterar muito de um webservice pra outro.

Imagine como sendo a chamada de uma função em um programa, contendo parâmetros.
Quais são os parâmetros? Depende de como o programador criou essa função.

Por isso acaba sendo complicado, porque o conteúdo tem que ser exato, inclusive maiúsculas/minúsculas.

Pelo retorno, parece que chegou num parâmetro que não deveria ser, pode estar faltando ou sobrando alguma coisa.

<faultstring>org.xml.sax.SAXException:SimpleDEserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.</faultstring>

<tagpai>
<tagfilho>deddd</tagfilho>
</tagpai>

É só o que dá pra dizer.

Mais que isso, só olhando manual da nota, manual do webservice, etc. mas aí deixa de ser ajuda, e entra em desenvolver algo exclusivo de seu uso.

O que estou estranhando são esses endereços locais, localhost:8080, mas acredito que seja local no servidor, ao receber o arquivo.

José M. C. Quintas

Consumo de Webservice com Harbour.

Enviado: 26 Abr 2017 14:59
por JoséQuintas
Por acaso olhou esta parte?
sorocaba.png

Consumo de Webservice com Harbour.

Enviado: 26 Abr 2017 15:08
por marsp
JoséQuintas,

Muito obrigado pela atenção.
O envio por lotes não esta mais sendo usado pela prefeitura de Sorocaba.

Consumo de Webservice com Harbour.

Enviado: 26 Abr 2017 15:55
por JoséQuintas
Vixe....
O manual deles está errado..... kkkkk

Por isso é difícil ajudar nessas coisas e acaba o interessado tendo que ir atrás.
Pode ser qualquer coisa....
Nesse caso, com tudo certo, tá errado.... kkkkk

Se imaginar que cada município é de um jeito, e cada prefeito pode alterar tudo, piorou....
É phoda... com PH maiúsculo...

Consumo de Webservice com Harbour.

Enviado: 12 Mai 2017 08:50
por André Corrêa
Bom dia,

Ainda sobre webservice SOAP com Harbour, existe alguma alternativa nativa a MSXML2 e MSSOAP?
Andei pesquisando bastante e não consegui encontrar nenhum exemplo que não use essas dlls.
Preciso enviar um XML para um webservice, mas não posso utilizar nenhuma dll externa.
Tenho o endereço do WSDL, monto o XML a ser enviado, mas não sei como fazer o envio, pois os
exemplos dos manuais estão em .NET e depois de clonar o WSDL é gerada uma classe com todos os
métodos, mas o Harbour não tem essa opção (ou eu não conheço).
Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação,
montar o header HTTP, envelopar o conteúdo, fazer o envio e capturar o retorno?

Obrigado,

Consumo de Webservice com Harbour.

Enviado: 12 Mai 2017 10:15
por JoséQuintas
Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação,
Se não depender de DLL nem de função nativa, vai ser como? Outra linguagem de programação?
Ou é uma coisa ou é outra.
depois de clonar o WSDL é gerada uma classe com todos os
métodos, mas o Harbour não tem essa opção (ou eu não conheço).
Sim, são criadas funções pra serem usadas no NET.
Harbour não é NET, e não tem as bibliotecas do NET.
Ainda sobre webservice SOAP com Harbour, existe alguma alternativa nativa a MSXML2 e MSSOAP?
Apesar de dizerem ser nativa, não é. Seria o uso da LIBCURL, através da DLL dela, junto com OPENSSL.
Pra mim trata-se apenas de trocar uma DLL por outra.

Seria bom se existisse isso mais automático, mas não existe.
Também não existe um padrão fixo, sempre existem diferenças pequenas ou grandes.

Consumo de Webservice com Harbour.

Enviado: 12 Mai 2017 10:39
por André Corrêa
Quintas,

Obrigado pelo retorno.
Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação?
Me expressei mal no trecho acima.
O que quis dizer é "Existe alguma lib ou função nativa, que não dependa de dll?"
Sim, são criadas funções pra serem usadas no NET.
Harbour não é NET, e não tem as bibliotecas do NET.
Eu sei que Harbour não faz parte da plataforma .NET, mas como é algo bastante usado, achei que pudesse existir uma opção mais
simples, da qual eu apenas não tivesse conhecimento. Delphi também não é .NET e tem essa opção de importar o WSDL.
Seria bom se existisse isso mais automático, mas não existe.
Seria incrível se existisse. Eu não tenho o conhecimento necessário para fazê-lo, mas acho estranho que até o momento não
tenha sido criado por alguém.

Então, resumidamente, a forma mais simples ou direta seria usar a MSXML2 mesmo?

Obrigado,

Consumo de Webservice com Harbour.

Enviado: 14 Mai 2017 17:33
por André Corrêa
Boa tarde pessoal,

Alguém poderia me dar uma ajuda?

Eu estou testando a comunicação com um webservice, mas tenho algumas dúvidas
sobre como montar o envelope SOAP.
Na documentação que recebi consta apenas a chamada ao método que faz o envio,
em C#. Como o Harbour não tem a opção de importar o WSDL para gerar a classe e
chamar o método, tentei montar o envelope e enviar o XML seguindo alguns exemplos
que encontrei aqui no fórum, mas nenhum funcionou.

O WSDL é:
http://webservice.conciliadora.com.br/W ... singleWsdl.

O exemplo em C# é:

Código: Selecionar todos

      var vendaFile = File.OpenRead(txeArquivo.Text); 
      string Mensagem; 
      ErroArquivo[] Lista = null; 
      If (callWebService.WSEnviaArquivoVendaCliente( 
                            Estabelecimento: txeRetConcEstabelecimento.Text, 
                            Senha: txeRetConcSenha.Text, 
                            FileName: Path.GetFileName(txeArquivo.Text), 
                            Length: vendaFile.Length, 
                            FileByteStream: vendaFile,  
                            Mensagem: out Mensagem,  
                            XMLErros: out Lista 
                            ) == 0) 
     { 
         //OK 
     } 
     else 
     { 
         //ERRO 
     } 
O código que estou testando é:

Código: Selecionar todos

FUNCTION EnviarXml()
   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno, cxlido
   LOCAL oXML

   cWebservice := "http://webservice.conciliadora.com.br/WSConciliadoraCliente/WSCACliente.svc?singleWsdl"
   cSoapAction := "http://tempuri.org/IWSCACliente/WSEnviaArquivoVendaCliente"
   cOperation  := "WSEnviaArquivoVendaCliente"
   *-
*   cxlido:=HB_Memoread('C:\A\LXA13703.xml')
   *--
   cXml :='             <tns:Estabelecimento>132332943</tns:Estabelecimento>'+hb_eol()+;
          '             <tns:FileName>C:\A\LXA13703.xml</tns:FileName>'+hb_eol()+;
          '             <tns:Length>2.444</tns:Length>'+hb_eol()+;
          '             <tns:Senha>625337</tns:Senha>'+hb_eol()

   cXml := SoapEnvelope( cXml, cOperation ) //
   *--
   MsgAlert(cXml)

   oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

   IF oXML:nError != HBXML_ERROR_NONE
      MsgAlert( "xml com problema " + Str( oXML:nError ) )
   ENDIF

   *--
   cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )
   *--
   HB_MemoWrit('C:\A\retorno.xml',cRetorno)
   MsgAlert(cRetorno)

RETURN Nil


*------------------------------------------------------
*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
   LOCAL oServer, oDOMDoc, oError
   LOCAL nCont
   LOCAL cRetorno := "*ERRO*", cXmlRetorno := ""

   oServer := CreateObject( "MSXML2.ServerXMLHTTP.5.0")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc = CREATEOBJECT("MSXML2.DOMDocument.5.0")

   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
     MsgAlert('Erro: xML nao carregado')
     RETURN Nil
   ENDIF
   TRY
     oServer:send(oDOMDoc:xml)
   CATCH oError
     MsgAlert('Falha no envio do xML')
     RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
     HB_milliseconds(500)
   ENDDO
   cRetorno := oServer:responseText

   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN cXmlRetorno

*----------------------------------------------
*----------------------------------------------
FUNCTION SoapEnvelope( cXml, cOperation )
   LOCAL cXmlEnvelope, cxlido

   cXmlEnvelope:= '<?xml version="1.0" encoding="utf-8"?>'+hb_eol()+;
                  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://tempuri.org/">'+hb_eol()+;
                  '   <soapenv:Header>'+hb_eol()+;
                  '      <tns:'+cOperation+'>'+hb_eol()+;
                  '          <tns:RemoteFileInfo>'+hb_eol()
   cXmlEnvelope+=                cXml
   cXmlEnvelope+= '          </tns:RemoteFileInfo>'+hb_eol()+;
                  '      </tns:'+cOperation+'>'+hb_eol()+;
                  '   </soapenv:Header>'+hb_eol()+;
                  '   <soapenv:Body/>'+hb_eol()+;
                  '</soapenv:Envelope>'+hb_eol()

   HB_MemoWrit('C:\A\vai.xml',cXmlEnvelope)
RETURN cXmlEnvelope

*--------------------------------
*--------------------------------
FUNCTION XmlTag( cNome, cConteudo )
   IF Empty( cConteudo )
      RETURN "<" + cNome + " />"
   ENDIF
RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"
O retorno é "Estabelecimento não informado".

Alguém sabe dizer se tem como gerar o SOAP header e saber exatamente onde informar o
XML com os dados, apenas lendo a descrição contida no WSDL?
Alguém poderia me ajudar a montar o envelope SOAP e anexar o XML com os dados, por favor?

Obrigado,

Consumo de Webservice com Harbour.

Enviado: 14 Mai 2017 19:11
por Jairo Maia
Olá André,

Sem entrar nas outras questões, primeiro você precisa criar o XML, que não está sendo criado. O que você você está criando é um arquivo de texto comum. Não está envelopado (não tem as tags de início e fim), e está usando caractere não suportado, a saber o ":".

Compile e rode esses exemplos, depois dê duplo clique sobre eles e verá que serão abertos. Para ver a diferença entre eles, abra com o bloco de notas por exemplo. Aconselho a usar como no exemplo Não Formatado:

Exemplo 1 (Formatado - com quebra de linhas):

Código: Selecionar todos

cXml := '<begin>'+hb_eol()+;
          '<tnsEstabelecimento>132332943</tnsEstabelecimento>'+hb_eol()+;
          '<tnsFileName>C:\A\LXA13703.xml</tnsFileName>'+hb_eol()+;
          '<tnsLength>2.444</tnsLength>'+hb_eol()+;
          '<tnsSenha>625337</tnsSenha>'+hb_eol()+;
        '</begin>'

Hb_MemoWrit( "xml1.xml", cxml )
Exemplo 2 (Não Formatado - sem quebra de linas):

Código: Selecionar todos

cXml := '<begin>'+;
          '<tnsEstabelecimento>132332943</tnsEstabelecimento>'+;
          '<tnsFileName>C:\A\LXA13703.xml</tnsFileName>'+;
          '<tnsLength>2.444</tnsLength>'+;
          '<tnsSenha>625337</tnsSenha>'+;
        '</begin>'

Hb_MemoWrit( "xml2.xml", cxml )

Consumo de Webservice com Harbour.

Enviado: 16 Mai 2017 10:42
por André Corrêa
Bom dia Jairo,

Segue o código corrigido. Agora o XML é gerado e aberto corretamente, mas não há resposta do webservice, nem
de erro, nem de sucesso. "oServer:responseText" volta vazio, mas não "NIL".

Código usado para o envio:

Código: Selecionar todos

FUNCTION EnviarXml()
   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno, cxlido
   LOCAL oXML

   cWebservice := "http://webservice.conciliadora.com.br/WSConciliadoraCliente/WSCACliente.svc?singleWsdl"
   cSoapAction := "http://tempuri.org/IWSCACliente/WSEnviaArquivoVendaCliente"
   cOperation  := "WSEnviaArquivoVendaCliente"

   cXml :='<Estabelecimento>9999999999</Estabelecimento>'+;
          '<FileName>C:\A\LXA13703.xml</FileName>'+;
          '<Length>2.444</Length>'+;
          '<Senha>159753</Senha>'

  cXml := SoapEnvelope( cXml, cOperation ) //
   *--

  oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

  IF oXML:nError != HBXML_ERROR_NONE
    MsgAlert( "xml com problema " + Str( oXML:nError ) )
  ENDIF

  *--
  cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )
  *--
  HB_MemoWrit('C:\A\retorno.xml',cRetorno)
   
  MsgAlert(cRetorno)

RETURN Nil

*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
   LOCAL oServer, oDOMDoc, oError
   LOCAL nCont
   LOCAL cRetorno := "*ERRO*", cXmlRetorno := ""

   oServer := CreateObject( "MSXML2.ServerXMLHTTP")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc = CREATEOBJECT("MSXML2.DOMDocument")

   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
     MsgAlert('Erro: xML nao carregado'+CRLF+'Erro: '+ToString(oDOMDoc:parseError:Reason)+' Posição: '+ToString(oDOMDoc:parseError:linepos))
     RETURN Nil
   ENDIF
   TRY
     oServer:send(oDOMDoc:xml)
   CATCH oError
     MsgAlert('Falha no envio do xML')
     RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
     HB_milliseconds(500)
   ENDDO
   cRetorno := oServer:responseText

   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN cXmlRetorno

*----------------------------------------------
*----------------------------------------------
FUNCTION SoapEnvelope( cXml, cOperation )
   LOCAL cXmlEnvelope, cxlido

   cxlido:=HB_Memoread('C:\A\LXA13703.xml')

   cXmlEnvelope:= '<?xml version="1.0" encoding="utf-8"?>'+;
                  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">'+;
                  '<soapenv:Header>'+;
                  cXml+;
                  '</soapenv:Header>'+;
                  '<soapenv:Body>'+;
                  cxlido+;
                  '</soapenv:Body>'+;
                  '</soapenv:Envelope>'

  HB_MemoWrit('C:\A\vai.xml',cXmlEnvelope)
RETURN cXmlEnvelope

*--------------------------------
*--------------------------------
FUNCTION XmlTag( cNome, cConteudo )
   IF Empty( cConteudo )
      RETURN "<" + cNome + " />"
   ENDIF
RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"
XML enviado:

Código: Selecionar todos

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><soapenv:Header><Estabelecimento>9999999999</Estabelecimento><FileName>C:\A\LXA13703.xml</FileName><Length>2.444</Length><Senha>159753</Senha></soapenv:Header><soapenv:Body><registros><cabecalho><Estabelecimento>999999999</Estabelecimento><DataInicial>27/01/17</DataInicial><DataFinal>27/01/17</DataFinal><Versao>3</Versao><Sistema/></cabecalho><registro><CodigoTipoProduto>10</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Credito a Vista</DescricaoTipoProduto><CodigoAutorizacao>456546</CodigoAutorizacao><IdentificadorPagamento>114956</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/02/17</DataVencimento><ValorVendaParcela>200,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>1</Modalidade></registro><registro><CodigoTipoProduto>11</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Maestro Debito</DescricaoTipoProduto><CodigoAutorizacao>456151</CodigoAutorizacao><IdentificadorPagamento>114956</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/01/17</DataVencimento><ValorVendaParcela>238,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>0</Modalidade></registro><registro><CodigoTipoProduto>10</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Credito a Vista</DescricaoTipoProduto><CodigoAutorizacao>549137</CodigoAutorizacao><IdentificadorPagamento>114960</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/02/17</DataVencimento><ValorVendaParcela>200,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>1</Modalidade></registro><registro><CodigoTipoProduto>11</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Maestro Debito</DescricaoTipoProduto><CodigoAutorizacao>698410</CodigoAutorizacao><IdentificadorPagamento>114960</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/01/17</DataVencimento><ValorVendaParcela>238,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>0</Modalidade></registro></registros></soapenv:Body></soapenv:Envelope>
Obrigado,

Consumo de Webservice com Harbour.

Enviado: 16 Mai 2017 13:39
por Jairo Maia
Boa tarde André,

Infelizmente falei do XM porque vi que estava com problemas, mas não sei dizer nada sobre o método SOAP. Vamos aguardar algum colega que possa ajudar nisso.