Buenas
Os dejo aqui un trabajo inicial, que espero podais continuar , es un boceto de como deber铆a hacerse.
Tiene 2 partes,
1) Parte. Conexion por SOAPClient
El ejemplo tiene una ejemplo de como obtener una semilla a trav茅s de Soap, esto os debe de abrir la mente de como
pod茅is hacer la comunicacion.
2) Boceto de construccion del XML EnvioDTE. Teneis la base sobre la que trabajar, por si os corre prisa.
Ojo, no est谩 ni mucho menos acabada, pero es para que os hagais una idea de como hacer clases independientes por cada
seccion del XSD, de esta manera, el mantenimiento es super sencillo.
Podeis ver como los objetos se llaman unos a otros para escribir cada uno su parte del XML, en cascada.
3) Tema de Cifrado, hay que buscar ayuda de como usar openssl. MI CONSEJO es usarlo EXTERNO a la aplicacion,
de lo contrario, os aseguro que como en el sistema exista alg煤n OpenSSL con una version distintas, el sufrimiento no merece
la pena

Por lo que poco que he visto , creo que funciona muy similar al de Portugal, pero no me hacerme mucho caso, porque no
he podido apenas mirar nada.
Espero que os ayude un poco.
Nota:
#SOPORTE PARA MXML
MXML_LIB=$(HARBOUR_LIB_DIR)\mxml.lib
HB_MXML_LIB=$(HARBOUR_LIB_DIR)\hbmxml.lib
function Chile()
聽 聽 聽 聽Local cValue := ""
聽 聽 聽 聽Local oSoapClient
聽 聽 聽 聽Local lOk, orespuesta, i
聽 聽 聽 聽Local cDominio_WebServices := "https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL"
聽 聽 聽 聽Local oEnvioDte, cXml
聽 聽 聽 聽
聽 聽 聽 聽lOk := .T.
聽 聽 聽
聽 聽 聽 聽// Ejemplo para obtener una semilla --------------------------------------------------
聽 聽 聽 聽oSoapClient 聽:= CreateObject( "MSSOAP.SoapClient30" ) 聽// Conecta a SOAP 3.0
聽 聽 聽 聽oSoapClient:msSoapInit( cDominio_WebServices )
聽
聽 聽 聽 聽try
聽 聽 聽 聽 聽 cXml := oSoapClient:getSeed()
聽 聽 聽 聽 聽 alert( cXml )
聽 聽 聽 聽catch
聽 聽 聽 聽 聽 cValue := oSOAPClient:faultString + Hb_OsNewLine() + oSOAPClient:detail
聽 聽 聽 聽 聽 alert( "error:"+cValue )
聽 聽 聽 聽end
聽 聽 聽 聽oSoapClient := NIL
聽 聽 聽 聽// Ejemplo para obtener una semilla --------------------------------------------------
聽 聽 聽 聽// Ejemplo de como formar XML electronico.
聽 聽 聽 聽oEnvioDte := EnvioDTE():New()
聽 聽 聽 聽 聽
聽 聽 聽 聽oEnvioDte:oSetDTE:ID := "1"
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:RutEmisor 聽 聽:= "1"
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:RutEnvia 聽 聽 := "2"
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:RutReceptor 聽:= "3"
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:FchResol 聽 聽 := "2015-01-01"
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:TmstFirmaEnv := 聽hb_TSToStr( hb_DateTime() )
聽 聽 聽 聽oEnvioDte:oSetDTE:oCaratula:oSubTotDTE:TpoDTE := "33"
聽 聽 聽
聽 聽 聽 聽// Creamos un documentro tributario Electronico
聽 聽 聽 聽oDte := DTE():New()
聽 聽 聽 聽oDte:version = "2"
聽 聽 聽 聽oEnvioDte:AddDTE( oDte )
聽 聽 聽 聽oDte := DTE():New()
聽 聽 聽 聽oDte:version = "23"
聽 聽 聽 聽oEnvioDte:AddDTE( oDte )
聽 聽
聽 聽 聽 聽Alert( oEnvioDte:WriteXML() )
聽 聽 quit
return nil
#include "hbclass.ch"
/****************************************************************************/
/****************************************************************************/
CLASS EnvioDTE FROM TResponse
聽 聽 聽 DATA version INIT "1.0" 聽
聽 聽 聽 DATA oSetDTE
聽 聽 聽 DATA oSignature 聽// TODO:objeto signature
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML()
聽 聽 聽 METHOD AddDTE( oDTE ) INLINE ::oSetDTE:AddDTE( oDTE )
END CLASS
METHOD New() CLASS EnvioDTE
聽 聽
聽 聽 ::Operacion := "EnvioDTE"
聽 聽 ::oSetDTE := SetDTE():New()
RETURN Self 聽 聽 聽
METHOD WriteXML() CLASS EnvioDTE
聽 聽 Local pNode, pMsgs, pTree
聽 聽 Local oSuplement
聽 聽 pNode := ::CreateXML( )
聽 聽 聽 聽 聽 聽 聽mxmlElementSetAttr( pNode, "version", ::version )
聽 聽 聽 聽 聽 聽 聽
聽 聽 ::oSetDTE:WriteXML( pNode )
聽 聽
聽 聽 ::GetXML()
RETURN ::cXML
/*
SetDTE , secci贸n del documento que contiene toda 聽la data del env铆o, esto es la
Car谩tula y 1 o m谩s DTE, y su 聽respectiva firma electr贸nica
*/
CLASS SetDTE
聽 聽 聽 DATA ID INIT "ID_1"
聽 聽 聽 DATA oCaratula
聽 聽 聽 DATA aoDTEs
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML()
聽 聽 聽 METHOD AddDTE( oDTE ) INLINE aadd( ::aoDTEs, oDTE )
END CLASS
METHOD new() CLASS SetDTE
聽 聽
聽 聽 ::aoDTEs := {} 聽// Arrays de objetos DTE
聽 聽 ::oCaratula := Caratula():New()
RETURN Self
METHOD WriteXML( pNode ) 聽CLASS SetDTE
聽 聽 聽 Local pSetDte, oDte
聽 聽 聽 pSetDte := mxmlNewElement( pNode, "SetDTE" )
聽 聽 聽 聽 聽 聽 聽 聽 聽mxmlElementSetAttr( pSetDte, "ID", ::ID )
聽 聽 聽 聽
聽 聽 聽 ::oCaratula:WriteXML( pSetDte ) 聽
聽 聽
聽 聽 聽 for each oDte in ::aoDTEs
聽 聽 聽 聽 聽 oDte:WriteXML( pSetDte )
聽 聽 聽 next 聽 聽 聽
RETURN pSetDte
/*****************************************************************/
/* Resumen de informaci贸n enviada 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽*/
/*****************************************************************/
CLASS Caratula
聽 聽 聽 DATA version 聽 聽 聽INIT "1"
聽 聽 聽 DATA RutEmisor 聽 聽INIT "0"
聽 聽 聽 DATA RutEnvia 聽 聽 INIT "0"
聽 聽 聽 DATA RutReceptor 聽INIT "0"
聽 聽 聽 DATA FchResol 聽 聽 INIT "2000-01-01"
聽 聽 聽 DATA NroResol 聽 聽 INIT "123456"
聽 聽 聽 DATA TmstFirmaEnv INIT "2000-01-01T00:00:00"
聽 聽 聽 DATA oSubTotDTE
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML()
END CLASS
METHOD new() CLASS Caratula
聽 聽 聽::oSubTotDTE := SubTotDTE():New()
RETURN Self
METHOD WriteXML( pNode ) 聽CLASS Caratula
聽 聽 聽 Local pCaratula, node
聽 聽 聽 pCaratula := mxmlNewElement( pNode, "Caratula" )
聽 聽 聽 聽 聽 聽mxmlElementSetAttr( pCaratula, "version", ::version )
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "RutEmisor")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::RutEmisor)
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "RutEnvia")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::RutEnvia)
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "RutReceptor")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::RutReceptor )
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "FchResol")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::FchResol)
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "NroResol")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::NroResol )
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pCaratula, "TmstFirmaEnv")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, ::TmstFirmaEnv )
聽 聽 聽 ::oSubTotDTE:WriteXML( pCaratula )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
RETURN pCaratula
/****************************************************************************/
/* Subtotales de DTE enviados 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽*/
/****************************************************************************/
CLASS SubTotDTE
聽 聽 聽 DATA TpoDTE INIT "0"
聽 聽 聽 DATA NroDTE INIT "0"
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML( pNode)
END CLASS
METHOD new() CLASS SubTotDTE
RETURN Self
METHOD WriteXML( pNode ) 聽CLASS SubTotDTE
聽 聽 聽 Local pSubTotDTE, node
聽 聽 聽 pSubTotDTE := mxmlNewElement( pNode, "SubTotDTE" )
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pSubTotDTE, "TpoDTE")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, Cstr( ::TpoDTE ) )
聽 聽 聽 聽 聽 聽node := mxmlNewElement( pSubTotDTE, "NroDTE")
聽 聽 聽 聽 聽 聽mxmlNewText(node, 0, Cstr( ::NroDTE ) )
RETURN pSubTotDTE
/****************************************************************************/
/* Documento Tributario Electronico 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 */
/****************************************************************************/
CLASS DTE
聽 聽 聽 DATA version INIT "1"
聽 聽 聽 DATA oDocumento
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML( pNode ) 聽
END CLASS
METHOD new() CLASS DTE
聽 聽 ::oDocumento := Documento():New()
RETURN Self
METHOD WriteXML( pNode ) CLASS DTE
聽 聽 聽 Local pDTE, node
聽 聽 聽 pDte := mxmlNewElement( pNode, "DTE" )
聽 聽 聽 聽 聽 聽 聽 mxmlElementSetAttr( pDte, "version", ::version )
聽 聽 聽 ::oDocumento:WriteXML( pDte ) 聽 聽 聽 聽
RETURN pDTE
/****************************************************************************/
/* Informaci贸n Tributaria del DTE 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 */
/****************************************************************************/
CLASS Documento
聽 聽 聽 DATA ID INIT "1"
聽 聽 聽 DATA oEncabezado
聽 聽 聽 DATA oDetalle
聽 聽 聽 DATA oSubTotInfo
聽 聽 聽 METHOD New() CONSTRUCTOR
聽 聽 聽 METHOD WriteXML( pNode ) 聽
END CLASS
METHOD new() CLASS Documento
RETURN Self
METHOD WriteXML( pNode ) CLASS Documento
聽 聽 聽 Local pDTE, node
聽 聽 聽 pDte := mxmlNewElement( pNode, "Documento" )
聽 聽 聽 聽 聽 聽 聽 mxmlElementSetAttr( pDte, "ID", ::ID )
RETURN pDTE
/****************************************************************************/
/****************************************************************************/
CLASS TResponse
聽 聽 聽 DATA Error 聽 聽 INIT .F.
聽 聽 聽 DATA oDoc
聽 聽 聽 DATA lUTF8 聽 聽 INIT .F.
聽 聽 聽 DATA cXML 聽 聽 聽INIT ""
聽 聽 聽 DATA Operacion INIT ""
聽 聽 聽 METHOD New() INLINE Self
聽 聽 聽 METHOD CreateXML()
聽 聽 聽 METHOD WriteXMLFile( cFile ) VIRTUAL
聽 聽 聽 METHOD WriteXML()
聽 聽 聽 METHOD GetXML()
聽 聽 聽 METHOD Destroy()
ENDCLASS
METHOD CreateXML( ) CLASS TResponse
聽 聽Local oNode, oNodeP
聽 聽::oDoc := mxmlNewXML("1.0")
聽 聽oNodeP := mxmlNewElement( ::oDoc, ::Operacion )
聽 聽 聽 聽 聽 聽 聽mxmlElementSetAttr( oNodeP, "xmlns", "http://www.sii.cl/SiiDte" )
聽 聽 聽 聽 聽 聽 聽mxmlElementSetAttr( oNodeP, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
聽 聽 聽 聽 聽 聽 聽mxmlElementSetAttr( oNodeP, "xsi:schemaLocation", "http://www.sii.cl/SiiDte EnvioDTE_v10.xsd")
RETURN oNodeP 聽
METHOD WriteXML() CLASS 聽TResponse
聽 聽
聽 聽::CreateXML( )
聽 聽::GetXML()
聽 聽::Destroy()
聽 聽
RETURN ::cXML
METHOD GetXML( ) CLASS TResponse
聽 聽
聽 聽 ::cXML := MXMLSAVEALLOCSTRING( ::oDoc )
聽 聽
聽 聽// TODO: Hay que hacer una conversion de UTf-8 a iso-8859-1, y cambiar encoding="utf-8" 聽a iso-8859-1
聽 聽if !::lUTF8
聽 聽endif
RETURN ::cXML
METHOD Destroy() CLASS TResponse
聽 聽 if !empty( ::oDoc )
聽 聽 聽 聽 mxmlDelete( ::oDoc )
聽 聽 endif 聽 聽
RETURN NIL