Amiguinhos
Então, matemos a cobra.
Aqui vão meus dois centavos de inteligencia.
Estou implementando acesso via SOAP em meu sistema para conectar a serviços de cobrança on-line com F2B(
http://www.F2b.com.br) e com meus testes consegui criar o .XML contendo as sentenças para envio e através de um pseudo .XML de retorno recupero as mensagens retornadas.
A implementação foi totalmente baseada no codigo fornecido pelo F2B usando ASP e fiz a conexão via OLE usando TOLEAuto() do Harbour. Para usar com xHarbour troquem TOLEAuto() por CreatObject().
Para se ter sucesso é necessário baixar o SOAP Toolkit 3.0 deste
link e verificar se o seu sistema operacional possue o XML Parser 4.0 instalado.
Minha plataforma é Windows Server 2003 SP2 e .NET 1.0 e 2.0 instalados, talvez isto faça a diferença na instalação do toolkit.
Codigo fonte:
Código: Selecionar todos
#include "FiveWin.ch"
function Main()
local oWnd, oActiveX
oXMLDoc := TOLEAUTO():New( "Microsoft.XMLDOM" )
oXMLDoc:async := .f.
oXMLDoc:preserveWhiteSpace := .t.
objRoot := oXMLDoc:createElement("soap-env:Envelope")
// Create an attribute, "xmlns:soap-env".
objattID := oXMLDoc:createAttribute("xmlns:soap-env")
// Set the value of the objattID attribute.
objattID:Text := "http://schemas.xmlsoap.org/soap/envelope/"
// The setAttributeNode method will append the objattID attribute to the objRoot element.
objRoot:setAttributeNode( objattID )
// Append the objRoot element as a child of the oXMLDoc element.
oXMLDoc:appendChild( objRoot )
//Create the xml processing instruction.
objPI := oXMLDoc:createProcessingInstruction([xml],[version='1.0' encoding="UTF-8"])
//Append the processing instruction to the XML document.
oXMLDoc:insertBefore( objPI, oXMLDoc:childNodes(0) )
//Create an new element and append it to current field.
objBody := oXMLDoc:createElement( "soap-env:Body" )
objRoot:appendChild( objBody )
//Create an new element, "f2b:F2bCobranca".
objF2bCobranca := oXMLDoc:createElement( "m:F2bCobranca" )
//Create an attribute, "xmlns:f2b".
objattID := oXMLDoc:createAttribute( "xmlns:m" )
//Set the value of the objattID attribute.
objattID:Text := "http://www.f2b.com.br/soap/wsbilling.xsd"
//The setAttributeNode method will appends the objatID attributes to the currents objF2bCobranca elements.
objF2bCobranca:setAttributeNode( objattID )
objBody:appendChild( objF2bCobranca )
// ----------------------- Bloco do Elemento: mensagem ---------------------------
objField := oXMLDoc:createElement( "mensagem" )
objattID := oXMLDoc:createAttribute( "data" )
objattID:Text := "2005-02-10"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "numero" )
objattID:Text := "121233"
objField:setAttributeNode( objattID )
objF2bCobranca:appendChild( objField )
// -------------------------------------------------------------------------------
// ------------------------ Bloco do Elemento: sacador ---------------------------
objField := oXMLDoc:createElement( "sacador" )
objField:text := "José da Silva"
objattID := oXMLDoc:createAttribute( "conta" )
objattID:Text := "9023010001230123"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "senha" )
objattID:Text := "123456"
objField:setAttributeNode( objattID )
objF2bCobranca:appendChild( objField )
// -------------------------------------------------------------------------------
// ------------------------ Bloco do Elemento: cobrança --------------------------
objField := oXMLDoc:createElement( "cobranca" )
objattID := oXMLDoc:createAttribute( "valor" )
objattID:Text := "10:00"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "taxa" )
objattID:Text := "2:50"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "tipo_taxa" )
objattID:Text := "0" //' 0 - Reais (R$); 1 - Porcentagem (%)
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "tipo_cobranca" )
objattID:Text := ""
objField:setAttributeNode( objattID )
// Tipo de cobrança:
// B - Boleto; C - Cartão de crédito; D - Cartão de débito; T - Transferência On-line
// Caso queira permitir cobrança por mais de um tipo, enviar as letras juntas: Ex:: "BCD" (Aceitar Boleto, Crédito e Débito)
objattID := oXMLDoc:createAttribute( "num_document" )
objattID:Text := ""
objField:setAttributeNode( objattID )
// Poderão ser criadas até 10 linhas de demonstrativo com 80 caracteres cada
// ---------------------- Bloco do Elemento: demonstrativo -----------------------
objFieldValue := oXMLDoc:createElement( "demonstrativo" )
objFieldValue:Text := "Cobrança F2b"
objField:appendChild( objFieldValue )
// -------------------------------------------------------------------------------
// ---------------------- Bloco do Elemento: demonstrativo -----------------------
objFieldValue := oXMLDoc:createElement("demonstrativo")
objFieldValue:Text := "Pague em qualquer banco"
objField:appendChild( objFieldValue )
// -------------------------------------------------------------------------------
// ------------------------ Bloco do Elemento: desconto --------------------------
objFieldValue := oXMLDoc:createElement( "desconto" )
objattID := oXMLDoc:createAttribute( "valor" )
objattID:Text := "2:00"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "tipo_desconto" )
objattID:Text := "0" // 0 - Reais (R$); 1 - Porcentagem (%)
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "antecedencia" )
objattID:Text := "5"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
// -------------------------------------------------------------------------------
// ------------------------ Bloco do Elemento: multa --------------------------
objFieldValue := oXMLDoc:createElement( "multa" )
objattID := oXMLDoc:createAttribute( "valor" )
objattID:Text := "1:00"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "tipo_multa" )
objattID:Text := "0" // 0 - Reais (R$); 1 - Porcentagem (%)
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "valor_dia" )
objattID:Text := "0:10"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "tipo_multa_dia" )
objattID:Text := "0" // 0 - Reais (R$); 1 - Porcentagem (%)
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute( "atraso" )
objattID:Text := "20"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
objF2bCobranca:appendChild( objField )
// -------------------------------------------------------------------------------
// ----------------------- Bloco do Elemento: agendamento ------------------------
objField := oXMLDoc:createElement("agendamento")
objattID := oXMLDoc:createAttribute("vencimento")
objattID:Text := "2005-02-15"
objField:setAttributeNode( objattID )
// -------------------------------------------------------------------------------
// Descomentar os atributos abaixo caso queria realizar cobranças com Agendamento
// -------------------------------------------------------------------------------
// objattID := oXMLDoc:createAttribute("ultimo_dia")
// objattID:Text := "n"
// objField:setAttributeNode objattID
//
// objattID := oXMLDoc:createAttribute("antecedencia")
// objattID:Text := "10"
// objField:setAttributeNode objattID
//
// objattID := oXMLDoc:createAttribute("periodicidade")
// objattID:Text := "1"
// objField:setAttributeNode objattID
//
// objattID := oXMLDoc:createAttribute("periodos")
// objattID:Text := "12"
// objField:setAttributeNode objattID
// -------------------------------------------------------------------------------
objattID := oXMLDoc:createAttribute("sem_vencimento")
objattID:Text := "n"
objField:setAttributeNode( objattID )
objField:text := "Pagamento a vista"
objF2bCobranca:appendChild( objField )
// -------------------------------------------------------------------------------
// ----------------------- Bloco do Elemento: sacado ------------------------
objField := oXMLDoc:createElement("sacado")
objattID := oXMLDoc:createAttribute("grupo")
objattID:Text := "web service"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("codigo")
objattID:Text := "000001"
objField:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("envio")
objattID:Text := "e"
objField:setAttributeNode( objattID )
// ----------------------- Bloco do Elemento: nome ------------------------
objFieldValue := oXMLDoc:createElement("nome")
objFieldValue:Text := "João Oliveira"
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: email ------------------------
objFieldValue := oXMLDoc:createElement("email")
objFieldValue:Text := "joseoliveira@f2b:com:br"
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: email ------------------------
objFieldValue := oXMLDoc:createElement("email")
objFieldValue:Text := "joseoliveira@f2b:locaweb:com:br"
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: endereco ------------------------
objFieldValue := oXMLDoc:createElement("endereco")
objattID := oXMLDoc:createAttribute("logradouro")
objattID:Text := "Rua das Pedras"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("numero")
objattID:Text := "345"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("complemento")
objattID:Text := "sala 34"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("bairro")
objattID:Text := "Itaim Bibi"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("cidade")
objattID:Text := "São Paulo"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("estado")
objattID:Text := "SP"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("cep")
objattID:Text := "04536000"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: telefone ------------------------
objFieldValue := oXMLDoc:createElement("telefone")
objattID := oXMLDoc:createAttribute("ddd")
objattID:Text := "11"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("numero")
objattID:Text := "35551234"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: telefone comercial ------------------------
objFieldValue := oXMLDoc:createElement("telefone_com")
objattID := oXMLDoc:createAttribute("ddd_com")
objattID:Text := "11"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("numero_com")
objattID:Text := "11111111"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: telefone celular ------------------------
objFieldValue := oXMLDoc:createElement("telefone_cel")
objattID := oXMLDoc:createAttribute("ddd_cel")
objattID:Text := "22"
objFieldValue:setAttributeNode( objattID )
objattID := oXMLDoc:createAttribute("numero_cel")
objattID:Text := "22222222"
objFieldValue:setAttributeNode( objattID )
objField:appendChild( objFieldValue )
// ----------------------- Bloco do Elemento: cpf ------------------------
objFieldValue := oXMLDoc:createElement("cpf")
objFieldValue:text := "12345678909"
objField:appendChild( objFieldValue )
objF2bCobranca:appendChild( objField )
oXMLDoc:save("ttt.xml")
wsdl := memoread( "ttt.xml" )
? XMLRetorno( wsdl )
return nil
Le o retorno diretamente de um .XML supostamente retornado.
Código: Selecionar todos
Function XMLRetorno( oXMLDoc )
local RespText, objXMLHTTP
// Envio da página em XML para o nosso sistema '''
objXMLHTTP := TOLEAUTO():New( "Microsoft.XMLHTTP" )
objXMLHTTP:open( "post", "https://www.f2b.com.br/WSBilling", .f. )
objXMLHTTP:send( oXMLDoc )
oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
root := oXMLDoc:documentElement
// Allow the document to complete loading
oXMLDoc:async := .f.
//success := oXMLDoc:loadXML(objXMLHTTP:responseText)
lSuccess := oXMLDoc:load("ret.xml")
RespText := ""
If lSuccess
agendamentoDetails := oXMLDoc:selectNodes("//agendamento")
sacadoDetails := oXMLDoc:selectNodes("//sacado")
cobrancaDetails := oXMLDoc:selectNodes("//cobranca")
logDetails := oXMLDoc:selectNodes("//log")
? agendamentoDetails:Item(0):Text
? cobrancaDetails:Item(0):Text
? sacadoDetails:Item(0):Text
? logDetails:Item(0):Text
If (logDetails:Item(0):Text == "OK")
Else
RespText := logDetails:Item(0):Text
EndIf
Else
RespText := logDetails:Item(0):Text
EndIf
// Response:write RespText
WSBilling := RespText
return WSBilling
Pseudo .XML de retorno:
Código: Selecionar todos
<?xml version="1.0" encoding="ISO-8859-1"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Body>
<m:F2bCobrancaRetorno xmlns:m="http://www.f2b.com.br/soap/wsbilling.xsd">
<agendamento numero="0000000008">Imediato e Agendado</agendamento>
<sacado numero="0000000027">
<nome>José Oliveira</nome>
<email>joseoliveira@f2b.com.br</email>
<email>joseoliveira@f2b.locaweb.com.br</email>
</sacado>
<sacado numero="0000000028">
<nome>Maria Oliveira</nome>
<email>mariaoliveira@f2b.com.br</email>
</sacado>
<sacado numero="0000000029">
<nome>Pedro Oliveira</nome>
<email>pedrooliveira@f2b.com.br</email>
</sacado>
<cobranca numero="0000000339" taxa_registro="0.00">
<nome>João Oliveira</nome>
<email>joseoliveira@f2b.com.br</email>
<email>joseoliveira@f2b.locaweb.com.br</email>
<url>http://www.f2b.com.br/Billing?id=00000015441000000033929</url>
</cobranca>
<cobranca numero="0000000340" taxa_registro="0.00">
<nome>Maria Oliveira</nome>
<email>mariaoliveira@f2b.com.br</email>
<url>http://www.f2b.com.br/Billing?id=00000015441000000034090</url>
</cobranca>
<cobranca numero="0000000341" taxa_registro="0.75">
<nome>Pedro Oliveira</nome>
<email>pedrooliveira@f2b.com.br</email>
<url>http://www.f2b.com.br/Billing?id=00000015441000000034189</url>
</cobranca>
<log>OK
</log>
</m:F2bCobrancaRetorno>
</soap-env:Body>
</soap-env:Envelope>
Da forma como exponho o resultado fica mais fácil criar ou ler o conteúdo destes arquivos enigmáticos e cheios de hierarquias.
Acho que este codigo já da uma demonstração de que as possibilidades que o Harbour nos brinda vão além do que achavámos que pudessemos chegar.
"...Vida longa ao Harbour, e que o compilador esteja com voces..."