Consumir el WEB Service de ARBA desde VFP

3,315 views
Skip to first unread message

Max

unread,
Sep 27, 2013, 4:25:53 PM9/27/13
to publice...@googlegroups.com
Amigos del foro, tengo el siguiente problema:
Necesito hacer una consulta a un Web Service, los datos que tengo son:

La Aplicacion cliente debera hacer requerimiento HTTPS sl servicio:


enviando un formulario multipart por metodo POST con los siguientes atributos:
USER
PASSWORD
FILE (que es un XML con datos a consultar).

Yo tengo el usuario, tengo el password, tengo el archivo .XML

Como armo un formulario en VFP, que conecte con el servicio, envie todo y obtenga el resultado?  Que es otro archivo .XML con info que luego procesare.

Acepto todas las sugerencias!!!
Gracias!!!

Fernando D. Bozzo

unread,
Sep 27, 2013, 5:09:37 PM9/27/13
to publice...@googlegroups.com
Hola Max:

Buscá en este mismo foro sobre servicios web o web-services y vas a encontrar otras consultas con ejemplos, tal como dicta la norma 4 del foro:

[4] ¡No seas cómodo! Antes de preguntar al grupo busca la respuesta primero en la ayuda de FoxPro (usa F1, que no muerde) y luego en sitios como www.portalfox.com, www.universalthread.com, y en estos foros algún mensaje anterior.

Saludos.-

Max

unread,
Sep 27, 2013, 6:24:24 PM9/27/13
to publice...@googlegroups.com
Fernando, gracias por tu respuesta. Llevo 1 semana leyendo todos los mensajes del foro, hice cientos de pruebas, y hasta ahora no he llegado a la solución que busco. 
Si puedes darme una mano, te lo agradecería.

Fernando D. Bozzo

unread,
Sep 27, 2013, 7:09:49 PM9/27/13
to publice...@googlegroups.com
Hola Max, no tengo uno a mano, pero buscá xmlhttp y vas a ver que hay varios mensajes, creo que uno mio.

Algo importante: No conviene usar SOAP (MSSOAP3) sino XMLHTTP, porque MSSOAP no tiene soporte y el otro si.

Saludos.-

Fernando D. Bozzo

unread,
Sep 27, 2013, 7:12:06 PM9/27/13
to publice...@googlegroups.com
Ah, y una cosa más: Para probar que te conectás al servicio, te conviene bajarte el SoapUI gratuito (hay uno "Pro" de pago y uno gratis), de esa forma vas a poder copiarte a Fox todo el envoltorio SOAP que tenés que enviar.


Saludos.-

Fernando D. Bozzo

unread,
Sep 27, 2013, 7:18:07 PM9/27/13
to publice...@googlegroups.com



El sábado, 28 de septiembre de 2013 00:24:24 UTC+2, Max escribió:

Enrique Vasquez - Gmail

unread,
Sep 28, 2013, 11:57:38 AM9/28/13
to publice...@googlegroups.com
Hola,

leí tu mensaje el otro día que lo publicaste y quise responderte, pero, desistí porque pensé que luego con una simple búsqueda encontrarías mucha ayuda en los post históricos de este foro en el portalfox o en la Wiki de fox.

Casualmente en estos días he tenido que consumir un servicio del tipo HTTPXML y al igual que tu, no tenia ni idea de donde comenzar. Sobre todo porque los ejemplos que encontré en el foro eran referidos a servicios web, digamos libres, y el que yo necesitaba usar era uno protegido con usuario y password. asi que estudie mucho los ejemplos y opiniones sobre como hacerlo.

Tu dices que has hecho cientos de pruebas, me gustaria saber cuales son esas pruebas que has hecho, puesto que yo también las hice, asi te podría un poco guiar segun mi propia experiencia. En mi caso se trataba de un servicio de un transportador, específicamente TNT.

Explícame un poco las pruebas que has hecho para ver si te puedo dar una mano. No seas muy genérico en las cosas, porque en este foro a nadie le gusta hacer el trabajo que tu mismo con tu ingenio lograrías hacer. si das un poco de pistas se te puede guiar, no esperes encontrar la solución de copiar y pegar, puesto que cada situación es diferente....espero entiendas el tenor de mi respuesta.

Saludos
Enrique Vásquez Bautista
cell. +39-3334497305
Genova - Italia

Max

unread,
Sep 28, 2013, 5:38:10 PM9/28/13
to publice...@googlegroups.com
Bueno, esto es lo que tengo. 
Se que el WEB Service que tengo que "consumir", requiere que le pase como parametros, usuario, contraseña y un archivo XML que contiene las instrucciones para que me de los datos que necesito.

La consulta es a la pagina de ARBA (Argentina). Las prueba que hice, todas las hice con VFP 9. Arme un simple form, y pongo los codigos en botones, que al presionar, me retornan los resultados en messagebox. Es muy simple, pero me permite saber que pasa, y si retorna bien. 


Esta siempre retorna como resultado de la consulta, un XML que contiene la info, o el mensaje de error segun lo que suceda.

La primer prueba que hice, fue para ver que hay del otro lado. El codigo del boton es:

LOCAL laweb
loXMLHTTP = CREATEOBJECT("Microsoft.XMLHTTP") 
loXMLHTTP.open("HEAD",laweb,.f.)
loXMLHTTP.send()
MESSAGEBOX(loXMLHTTP.getAllResponseHeaders())  && show all header information
MESSAGEBOX(loXMLHTTP.getResponseHeader("Last-Modified"))  && show only last modified date
 
Eso me retorno algo de info, por ejemplo, que el server es IIS 7.0, y que esta desarollado en ASP.NET
Hasta aca, bien simple, pero nada que ver con lo que necesito. Yo tengo que pasar una info y recibir  otra.

Segunda Prueba: (segundo boton)

SET SAFETY OFF 
LOCAL laweb
loXMLHTTP = CREATEOBJECT("Microsoft.XMLHTTP") 
loXMLHTTP.open("POST",laweb,.F.)
loXMLHTTP.send()
lcFile = "resultado.xml"
STRTOFILE(loXmlHttp.responsetext,lcFile) 
RELEASE loXMLHTTP 
RUN resultado.xml

Esto hace la consulta, valida el usuario y contraseña y me retorna el XML, solo que como no le pase el tercer parametro, que se tiene que llamr FILE, el resultado es "faltan parametros". 

El gran problema que tengo ahora es: No se como pasarle como parametro el archivo XML. He tratado de ponerlo asi:

Pero nada. Aparentemente no lo carga. 

Ahora, hice un archivo HTML, que tiene un formulario, con un campo user, de texto, otro campo password, tambien de texto, y un tercer campo file, de imagen (de esos que poner el boton Examinar al lado). 
Con eso, completo los datos, cargo el XML presiono enviar, lo manda, y recibo el resultado correctamente. 
Yo quiero hacer lo mismo, pero en VFP, ya que de esa forma, lo automatizo y es totalmente ajeno a intervencion del usuario. 
Este es el codigo del HTML, simplemente lo pones en un archivo de texto, lo guardas como formulario.htm y lo puedes probar. 

<FORM enctype="multipart/form-data" method="POST"
<TABLE>
<TR><TD>Usuario: </TD><TD align="left"><INPUT TYPE="text" NAME="user" VALUE=""></TD></TR>
<TR><TD>Password: </TD><TD align="left"><INPUT TYPE="text" NAME="password" VALUE=""></TD></TR>
<TR><TD>Archivo: </TD><TD align="left"><INPUT TYPE="file" NAME="file"></TD></TR>
<TR><TD colspan="2"><INPUT TYPE=submit value="Enviar"></TD></TR>
</TABLE>
</FORM>

Hice varias pruebas mas, pero todas con resultados malos, que no vien al caso ni siquiera ponerlas aqui.
Un detalle, use un programa que se llama Fiddler (http://fiddler2.com/) que analiza el trafico de red en tiempo real, y me parecio exelente para analizar los resultados. 

Esto es lo que tengo hasta aca. 
Pasando en limpio, si en el comando OPEN() del objeto XMLHTTP que cree, pudiera pasar como parametros, el usuario, la conraseña y el archivo, todo andaria! pero no se como pasar el archivo. 
Alguna sugerencia???
Gracias!

Max





Fernando D. Bozzo

unread,
Sep 28, 2013, 5:47:30 PM9/28/13
to publice...@googlegroups.com
Hola Max:

¿Intentaste con el SoapUI?

Fernando D. Bozzo

unread,
Sep 28, 2013, 7:01:52 PM9/28/13
to publice...@googlegroups.com
¿Te sirve esto? Parece que Pablo Pioli lo resolvió en un hilo de 2010:

http://www.mail-archive.com/gu...@mug.org.ar/msg08436.html




El sábado, 28 de septiembre de 2013 23:38:10 UTC+2, Max escribió:

Esteban

unread,
Sep 28, 2013, 7:04:30 PM9/28/13
to publice...@googlegroups.com

Hola Fernando.

El Soap no se utiliza en ARBA.

Las consultas en ARBA son MD5(XML) a través de POST.

Soap + Base64(XML) se utiliza en AFIP en los WebService x ejemplo FE

Te me adelantaste con lo de Pablo Pioli.

 

Saludos.

 

Esteban.

Fernando D. Bozzo

unread,
Sep 28, 2013, 7:18:16 PM9/28/13
to publice...@googlegroups.com
Además del hilo que te puse donde hablan del servicio que estás buscando usar, encontré este PDF que explica los datos como deben enviarse:

http://www.arba.gov.ar/bajadas/Fiscalizacion/Operativos/TransporteBienes/Documentacion/20101012-TB-RemitoElectronicoAplicacionCliente.pdf

Hay una parte donde especifica la estructura del archivo a enviar. Por lo que creo entender parece que tenés que meterlo como un string con todos los datos.

Max

unread,
Sep 28, 2013, 7:22:14 PM9/28/13
to publice...@googlegroups.com
La solucion de Pablo Pioli, la habia probado la semana pasada, pero al parecer no funciona. 
Puede que tenga que ver con el IFox. 
Voy a volver a seguir los pasos que indica, para ver que pasa.

Gracias!

Fernando D. Bozzo

unread,
Sep 28, 2013, 8:06:01 PM9/28/13
to publice...@googlegroups.com
Encontré una cosa que podría servir con XMLHTTP, pero no estoy seguro. Igual te lo dejo para que lo pruebes a ver si va:

http://stackoverflow.com/questions/968998/http-post-upload-from-visual-basic-6

Parece que codifica los datos en base 64 y lo mete en un mensaje multipart.

Suerte!

Enrique Vasquez - Gmail

unread,
Sep 30, 2013, 4:40:33 AM9/30/13
to publice...@googlegroups.com
ciao,

disculpa si te respondo un poco desfasado pero vivo en un huso horario diferente al tuyo.

He leido las pruebas que estas haciendo, la primera la descarto porque no haces mas que un HEAD, y en tu caso debes hacer un post. Tu segundo ejemplo es lo mas cercano que tengo a la solucion que yo segui en mi caso.


Segunda Prueba: (segundo boton)

SET SAFETY OFF 
LOCAL laweb
loXMLHTTP = CREATEOBJECT("Microsoft.XMLHTTP") 
loXMLHTTP.open("POST",laweb,.F.)
loXMLHTTP.send()
lcFile = "resultado.xml"
STRTOFILE(loXmlHttp.responsetext,lcFile) 
RELEASE loXMLHTTP 
RUN resultado.xml

este ejemplo esta bien, porque seguramente la direccion que te dieron para consumir el sitio web esta esperando que le des un comando POST y un archivo xml como arametro, dentro de este archivo deberia estar una linea donde colocas el username y la password.

en mi solucion la tengo de la siguiente manera:

oTNT = CREATEOBJECT("Microsoft.XMLHTTP")
**** inicio operaciones
oTNT.Open("POST", "https://www.mytnt.it/XMLServices", .F.)
oTNT.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

LcFilexml = CreateXML(_lnNumeroFattura,_lnAnnoFattura) && numero e anno fattura
=STRTOFILE(LcFilexml,"c:\Send.xml")
oTNT.Send('xmlin='+LcFilexml)

nota que es en el Metodo SEND() donde colocas el archivo XML que tienes que mandar mediante el POST.
la linea:
LcFilexml = CreateXML(_lnNumeroFattura,_lnAnnoFattura) && numero e anno fattura

es donde creo la string XML que luego pasare como parametro. es una funcion personalizada para mi caso. sonde he cogido el modello y lo he relleneado de los datos con TEXT...ENDTEXT con la opcion TEXTMERGE activa.

La stringa XML que se crea la trasformo en archivo para poder pasarla en el SEND(), se podria utilizar el metodo SENDXML() del objeto XMLHTTP, pero no se porque razon si lo usaba no me funcionaba bien. por eso optè por convertirlo en archivo y luego pasarlo como parametro dentro del SEND()
En mi caso el provider ( en este caso TNT) me indico que ellos se esperan la stringa XML en la variable xmlin, por eso al interno coloque la instruccion 'xmlin='+LcFilexml

a este punto para saber si el servicio te dio una respuesta valida en XML preguntas asi.

IF oTNT.status = 200
   * leo la respuesta
else
   * algo fallo
endif

Para leer los datos que te ha mandado el XML me he creado una funcion que crea un file llamado valores en c:\, ojo solo como prueba para saber que datos me estan llegando en el XML

FUNCTION LeerDatos
         LPARAMETERS _loArchivo as MSXML2.IXMLDOMNode
         LOCAL Hijo as MSXML2.IXMLDOMNode
         FOR EACH Hijo IN _loArchivo
             IF Hijo.nodeName != '#text'
                cDati = cDati + TRANSFORM( Hijo.nodeName )+ ": " + TRANSFORM(Hijo.text) + CHR(013)
                IF Hijo.hasChildNodes
                   LeerDatos(Hijo.childNodes)
                ENDIF
             ENDIF
         ENDFOR
ENDFUNC

luego llamo a la funcion asi:

cDati =''
  _lxmlresul = oTNT.responseText
  STRTOFILE(_lxmlresul ,"c:\prova.xml",0)
  ** prosigo con el trabajo de decifrar el xml recibido
  oDoc = CREATEOBJECT('MSXML2.DOMdocument')
  lxResult = oDoc.load("c:\prova.xml")
  IF lxResult
      = LeerDatos(oDoc.documentElement.childNodes)
      =STRTOFILE(cDati,"C:\valores.txt",0)
ENDIF

espero te pueda servir de algo este ejemplo. si no hazme saber que problemas tienes.....


Saludos


Enrique Vásquez Bautista
cell. +39-3334497305
Genova - Italia

Max

unread,
Sep 30, 2013, 10:30:50 AM9/30/13
to publice...@googlegroups.com
Después de analizar todas y cada una de las respuestas y ayudas enviadas, he llegado a una solución CORRECTA
Quiero agradecer a todos y a cada uno de los que colaboraron, los que enviaron sugerencias, todas sirvieron mucho. 

Voy a subir un archivo comprimido en RAR que contiene un formulario realizado en VFP 9 que contiene la solución 100 % operativa.
Solo necesitaras un CUIT y una contraseña de ARBA, y el CUIT de la persona que quieras consultar sus alícuotas de Percepciones y Retenciones. 
Podrás descargar el padrón completo, o consultar un solo individuo. 

Nuevamente, mil gracias a todos. 

Max  
Consulta_ARBA2013.rar

Fernando Maggi

unread,
Aug 15, 2014, 3:43:14 PM8/15/14
to publice...@googlegroups.com
Perdón que refloto este tema viejo, tengo la necesidad de consultar el Padrón de ARBA, pero no logro hacer funcionar el ejemplo, estoy usando VFP8 y me arroja el siguiente error:
"Codigo de excepción OLE IDispatch 0 de msxml3.dll: Error en la descarga del recurso solicitado"

Le estuve dando vueltas antes de consultar, reinstalé MSXML, registre librerias, etc y nada.

Saludos,
Fernando.

César Pistiner

unread,
Aug 15, 2014, 5:28:56 PM8/15/14
to publice...@googlegroups.com

Hola Fernando

Podrías mostrarnos el código que provoca ese error?

Saludos,
César

AfpSistemas

unread,
Aug 16, 2014, 2:19:28 PM8/16/14
to publice...@googlegroups.com

César es el ejemplo posteado por MAX, te adjunto el link para descargarlo:

 

https://docs.google.com/viewer?a=v&pid=forums&srcid=MTc0MDY2NTExMzU5NTg5ODE4OTMBMDU5NzU1NzM5NTQyMzA3MTkxNTEBenAyb01KN0ROSWtKATAuMQEBdjI

 

Saludos,

Fernando.

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de César Pistiner
Enviado el: viernes, 15 de agosto de 2014 06:29 p.m.
Para: publice...@googlegroups.com
Asunto: Re: [vfp] Re: Consumir el WEB Service de ARBA desde VFP

 

Hola Fernando

César Pistiner

unread,
Aug 16, 2014, 10:15:44 PM8/16/14
to publice...@googlegroups.com

Que sistema operativo tenés?

Saludos,
César

Fernando Maggi

unread,
Aug 17, 2014, 2:05:23 AM8/17/14
to publice...@googlegroups.com

W7 32

Hector Kuhn

unread,
Sep 11, 2014, 3:27:24 PM9/11/14
to publicesvfoxpro
Fijate si esto te sirve como ejemplo
LOCAL LCCUIT,lcfecdesde,lcfechasta

LCCUIT = STRTRAN(thisform._txtcuit.Value,"-","")
lcfecdesde = strzero(thisform._spinneranio.Value,4)+strzero(thisform._cbomes.Value,2)+"01"
lcfechasta = strzero(thisform._spinneranio.Value,4)+strzero(thisform._cbomes.Value,2)+strzero(ULDIA(thisform._cbomes.Value,thisform._spinneranio.Value),2)

oMD5 = CreateObject("MD5")

cServer = "dfe.ec.gba.gov.ar"
cURL = "/DomicilioElectronico/SeguridadCliente/dfeServicioConsulta.do"
 
Text to XMLConsulta TEXTMERGE NOSHOW
<CONSULTA-ALICUOTA>
<fechaDesde><<lcfecdesde>></fechaDesde>
<fechaHasta><<lcfechasta>></fechaHasta>
<cantidadContribuyentes>1</cantidadContribuyentes>
<contribuyentes class="list">
<contribuyente>
<cuitContribuyente><<lccuit>></cuitContribuyente>
</contribuyente>
</contribuyentes>
</CONSULTA-ALICUOTA>
EndText
 
cHash = oMD5.Encriptar(XMLConsulta)
cFileName = "DFEServicioConsulta_" + cHash + ".XML"
 
oHTTP = CreateObject("iFox.HTTP")
oHTTP.SetLicenseCode("89ACBA932332919073CA321230F9763F8F89AEBE08609D")
oHTTP.AddPostField("user", thisform.usuario)  && Atencion - Cambiar
oHTTP.AddPostField("password", thisform.clave)  && Atencion - Cambiar
oHTTP.AddPostFieldasFile("file", XMLConsulta, cFileName)
oHTTP.IgnoreSSLErrors = .T.

cRes = oHTTP.Post(cServer, cURL,,, 443)

*!*    SET SAFETY OFF
*!*    lnidfile = STRTOFILE(cRes,"c:\temp\sql.txt")
*!*    SET SAFETY ON

lObjparser = CREATEOBJECT('custom')

lObjparser.AddProperty('NUMEROCOMPROBANTE',"")
lObjparser.AddProperty('FECHADESDE',"")
lObjparser.AddProperty('FECHAHASTA',"")
lObjparser.AddProperty('CANTIDADCONTRIBUYENTES',"")
lObjparser.AddProperty('CUITCONTRIBUYENTE',"")
lObjparser.AddProperty('ALICUOTAPERCEPCION',"")
lObjparser.AddProperty('ALICUOTARETENCION',"")
lObjparser.AddProperty('GRUPOPERCEPCION',"")
lObjparser.AddProperty('GRUPORETENCION',"")
lObjparser.AddProperty('CODIGOERROR',"")
lObjparser.AddProperty('TIPOERROR',"")
lObjparser.AddProperty('MENSAJEERROR',"")


lclabel = "<numeroComprobante>\" + "<fechaDesde>\" + "<fechaHasta>\" + "<cantidadContribuyentes>\" + "<cuitContribuyente>\" + "<alicuotaPercepcion>\" + "<alicuotaRetencion>\"
lclabel = lclabel + "<grupoPercepcion>\" + "<grupoRetencion>\" + "<codigoError>\" + "<tipoError>\" + "<mensajeError>\"


lObjparser.AddProperty('etiquetas',UPPER(lclabel))
lObjparser.AddProperty('lcerror',"")

=Xmlparser(cRes,@lObjparser)

DO CASE
    CASE VAL(lObjparser.codigoerror)=1
            lObjparser.lcerror = "ERROR INESPERADO"+CHR(13)+"VERIFIQUE CUIT DIGITADO"   
    CASE VAL(lObjparser.codigoError)=2
            IF lObjParser.tipoerror="DATO"
                IF !"NUMERO DE CUIT INVALIDO"$lObjParser.mensajeerror
                    lObjparser.lcerror = UPPER("El usuario ingresado y / o la contraseña son inválidos")
                ELSE
                    lObjparser.lcerror = "NUMERO DE CUIT INVALIDO"
                ENDIF
            ELSE
                lObjparser.lcerror = "NUMERO DE CUIT INVALIDO"
            ENDIF
    OTHERWISE            
ENDCASE

IF LEN(TRIM(lObjParser.lcerror))#0
   lcmensaje = "Error :"+lobjParser.lcerror
ELSE
    lcmensaje = "CUIT :"+thisform._txtcuit.Value+CHR(13)+CHR(13);
                +"ALICUOTA RETENCION   "+STRTRAN(lObjparser.alicuotaretencion,",",".")+CHR(13)+CHR(13)+CHR(13);
                +"ALICUOTA PERCEPCION  "+STRTRAN(lObjparser.Alicuotapercepcion,",",".")
ENDIF
=Oavisar.usuario(lcmensaje,0)
thisform.Unload       

melezama

unread,
Mar 27, 2015, 9:32:45 PM3/27/15
to publice...@googlegroups.com
Muchachada, yo no sé qué tanta gente puede seguir teniendo el mismo problema, pero lo solucioné.

Les paso el código fuente:

lcCUITSol   = ALLTRIM(CHRTRAN(ThisForm.TxtCUITSol.Value,"-",""))
lcCUITCons = ALLTRIM(CHRTRAN(ThisForm.TxtCUITCons.Value,"-",""))
lcPassword  = ALLTRIM(ThisForm.TxtPassword.Value)
lcFechaDesde = DTOS(ThisForm.TxtFechaDesde.Value)
lcFechaHasta = DTOS(ThisForm.TxtFechaHasta.Value)

TEXT TO XMLConsulta TEXTMERGE NOSHOW 
<CONSULTA-ALICUOTA>
<fechaDesde><<lcFechaDesde>></fechaDesde>
<fechaHasta><<lcFechaHasta>></fechaHasta>
<cantidadContribuyentes>1</cantidadContribuyentes>
<contribuyentes class="list">
<contribuyente>
<cuitContribuyente><<lcCUITCons>></cuitContribuyente>
</contribuyente>
</contribuyentes>
</CONSULTA-ALICUOTA>
ENDTEXT

lcHash       = CryptMD5(XMLConsulta)
lcFileName = "C:\" + "DFEServicioConsulta_" + lcHash + ".XML"

LOCAL lcFile1
lcFile1 = ""
lcFile1 = lcFile1 + '------WebKitFormBoundaryVL3fdve1Hm4Big3a'  + CHR(13) + CHR(10)
lcFile1 = lcFile1 + 'Content-Disposition: form-data; name="user"'  + CHR(13) + CHR(10) + CHR(13) + CHR(10) 
lcFile1 = lcFile1 + ALLTRIM(lcCUITSol)  + CHR(13) + CHR(10)
lcFile1 = lcFile1 + '------WebKitFormBoundaryVL3fdve1Hm4Big3a'  + CHR(13) + CHR(10) 
lcFile1 = lcFile1 + 'Content-Disposition: form-data; name="password"'  + CHR(13) + CHR(10) + CHR(13) + CHR(10) 
lcFile1 = lcFile1 + ALLTRIM(lcPassword)  + CHR(13) + CHR(10)
lcFile1 = lcFile1 + '------WebKitFormBoundaryVL3fdve1Hm4Big3a'  + CHR(13) + chr(10)
lcFile1 = lcFile1 + 'Content-Disposition: form-data; name="file"; filename="' + ALLTRIM(lcFileName) + '"' + CHR(13) + chr(10)
lcFile1 = lcFile1 + 'Content-Type: text/xml' + CHR(13) + chr(10) + CHR(13) + chr(10)
lcFile1 = lcFile1 + ALLTRIM(XMLConsulta) + + CHR(13) + chr(10)
lcFile1 = lcFile1 + '------WebKitFormBoundaryVL3fdve1Hm4Big3a--'

oHTTP = CREATEOBJECT("MSXML2.XMLHTTP")
oHTTP.Open("POST",lcURL,.F.)
oHTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundaryVL3fdve1Hm4Big3a")
*oHTTP.SetRequestHeader("Content-length",LEN(ALLTRIM(lcFile1)))
oHTTP.Send(CREATEBINARY(lcFile1))

lcRes = oHTTP.ResponseText
= MESSAGEBOX(lcRes)

Las aclaraciones del caso.

lcCUITSol   = ALLTRIM(CHRTRAN(ThisForm.TxtCUITSol.Value,"-",""))
lcCUITCons = ALLTRIM(CHRTRAN(ThisForm.TxtCUITCons.Value,"-",""))
lcPassword  = ALLTRIM(ThisForm.TxtPassword.Value)
lcFechaDesde = DTOS(ThisForm.TxtFechaDesde.Value)
lcFechaHasta = DTOS(ThisForm.TxtFechaHasta.Value)

En todos los casos saco el guión del CUIT, atenti con eso, y la función DTOS para convertir la fecha, que te la devuelve en formato AAAAMMDD


ESTA ES IMPORTANTÍSIMA. Me la PASÉ renegando tratando de conectarme, me respondía "error en la descarga del recurso solicitado"

RESULTA QUE POR MÁS QUE LOS HDP DE ARBA TE PONEN QUE TENÉS QUE PREGUNTARLE A UNA HTTPS, RESULTA QUE EL SITIO ES HTTP (eso se puede ver entrando manualmente en la página para consultar vía web, que el Chrome te informa que el sitio NO ES SEGURO). Claro, si le preguntás al https, esperate sentado la respuesta. Cuando estaba leyendo algo en Internet sobre sitios seguros y no, de repente se me hizo la luz, recordé el cartel de sitio no seguro, cambié https por http, y ahí por fin recibí mi bendito XML con la respuesta y las alícuotas.

Cualquier duda chiflen, si es que alguien todavía está renegando con esto.

melezama

unread,
Mar 27, 2015, 9:33:54 PM3/27/15
to publice...@googlegroups.com
PD.: CryptMD5 es una función propia que devuelve el hash MD5 para el archivo, si alguno la precisa chifle. Yo opté por manejarla como una función en mi sistema, para encodear todas mis contraseñas y eso.

JTempo

unread,
Mar 28, 2015, 8:45:02 AM3/28/15
to publice...@googlegroups.com
Yo uso un ocx para md5, me pasas la funcion???

Fernando D. Bozzo

unread,
Mar 28, 2015, 1:46:01 PM3/28/15
to publice...@googlegroups.com
Hola:

La librería gratuita vfpencryption.fll contiene varias funciones de encriptación, desencriptación y hash muy útiles, entre ellas MD5, y al ser FLL no requiere instalación.

Esta es la página de descarga y de documentación:
http://www.sweetpotatosoftware.com/spsblog/2009/08/09/MajorVFPEncryptionUpdate.aspx


Saludos.-

Martín E. Lezama

unread,
Mar 29, 2015, 12:26:34 PM3/29/15
to publice...@googlegroups.com
Sí, no hay dramas, acá la tenés:

FUNCTION CryptMD5
PARAMETERS lcTexto

MD5=Createobject("MD5")
MD5.tohash = lcTexto
lcRetorno = MD5.Compute()
RETURN (lcRetorno)


Define Class MD5 As Custom OlePublic
**********************************************************************************************************************
* Written in VFP by GILLES Patrick (C) IKOONET SARL www.ikoonet.com
* Une implémention en Visual Foxpro de l'algorithme MD5 message digest tel que definis dans le RFC 1321 par R. RIVEST
* de la société RSA DATA SECURTY & MIT Laboratory for Computer Science
* A VFP implementation of the RSA Data Security, Inc. MD5 Message Digest Algorithm, as defined in RFC 1321.
**********************************************************************************************************************
* Usage (sample)
* SET PROCEDURE TO mdigest5
* MD5=CREATEOBJECT("MD5")
* MD5.tohash="abc"
* ? MD5.compute()
*******************************
tohash=""
Dimension SinusArray(64)
#Define MAX_UINT 4294967296
#Define NUMBEROFBIT 8&& UNICODE 16 (unicode not tested)


Procedure Init
Local I
For I = 1 To 64
This.SinusArray(I)=Transform(MAX_UINT*Abs(Sin(I)),"@0")
This.SinusArray(I)=Bitand(Evaluate(This.SinusArray(I)),0xFFFFFFFF) &&CAST
Endfor
Return .T.

Procedure bourre
Local NBR_BIT_BOURRE, BOURRAGE
BOURRAGE = Chr(128)+Replicate(Chr(0),63)
NBR_BIT_BOURRE=(448-(Len(This.tohash)*NUMBEROFBIT)%512)/NUMBEROFBIT
If (Len(This.tohash)*NUMBEROFBIT)%512>=448
NBR_BIT_BOURRE=(448+((512-Len(This.tohash)*NUMBEROFBIT)%512))/NUMBEROFBIT
Endif

Return Left(BOURRAGE,NBR_BIT_BOURRE)


Procedure acompleter
Local retour,decalage
decalage=Transform(Len(This.tohash)* NUMBEROFBIT,"@0")
retour=""
retour=retour+Chr(Evaluate("0x"+Substr(decalage,9,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,7,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,5,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,3,2)))
retour=retour+Replicate(Chr(0),4)
Return retour


Procedure MD5_F
Lparameters x,Y,z
Return Bitor(Bitand(x,Y),Bitand(Bitnot(x),z))

Procedure MD5_G
Lparameters x,Y,z
Return Bitor(Bitand(x,z),Bitand(Y,Bitnot(z)))

Procedure MD5_H
Lparameters x,Y,z
Return Bitxor(x,Y,z)

Procedure MD5_I
Lparameters x,Y,z
Return Bitxor(Y,Bitor(x,Bitnot(z)))

Procedure ROTATE_LEFT
Lparameters Pivot, npivot
Return Bitor(Bitlshift(Pivot,npivot),Bitrshift(Pivot,32-npivot))

Procedure ronde1
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_F(PB,PC,PD)+PE+PG,PF)

Procedure ronde2
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_G(PB,PC,PD)+PE+PG,PF)

Procedure ronde3
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_H(PB,PC,PD)+PE+PG,PF)

Procedure ronde4
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_I(PB,PC,PD)+PE+PG,PF)

Procedure Compute
Local tocompute,CPT_I,CPT_J,CPT_L,TMP_STRING,AA,BB,CC,DD,a,b,c,d,AA,BB,CC,DD
a=Bitand(0x67452301,0xFFFFFFFF)
b=Bitand(0xEFCDAB89,0xFFFFFFFF)
c=Bitand(0x98BADCFE,0xFFFFFFFF)
d=Bitand(0x10325476,0xFFFFFFFF)

Dimension T_X(16)
tocompute=This.tohash+This.bourre()+This.acompleter()
lentocompute=Len(tocompute)/64
OldA=a
OldB=b
OldC=c
OldD=d
For CPT_I=0 To lentocompute-1
For CPT_J=0 To 15
T_X(CPT_J+1)=""
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+4,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+3,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+2,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+1,1)),"@0"),2)

T_X(CPT_J+1)=Bitand(Evaluate("0x"+T_X(CPT_J+1)),0xFFFFFFFF) && CAST
*? TRANSFORM(T_X(CPT_J+1),"@0")
*?
Endfor

OldA=a
OldB=b
OldC=c
OldD=d

&& Ronde1
a=This.ronde1(a,b,c,d,T_X( 1), 7,This.SinusArray( 1))
d=This.ronde1(d,a,b,c,T_X( 2),12,This.SinusArray( 2))
c=This.ronde1(c,d,a,b,T_X( 3),17,This.SinusArray( 3))
b=This.ronde1(b,c,d,a,T_X( 4),22,This.SinusArray( 4))

a=This.ronde1(a,b,c,d,T_X( 5), 7,This.SinusArray( 5))
d=This.ronde1(d,a,b,c,T_X( 6),12,This.SinusArray( 6))
c=This.ronde1(c,d,a,b,T_X( 7),17,This.SinusArray( 7))
b=This.ronde1(b,c,d,a,T_X( 8),22,This.SinusArray( 8))

a=This.ronde1(a,b,c,d,T_X( 9), 7,This.SinusArray( 9))
d=This.ronde1(d,a,b,c,T_X(10),12,This.SinusArray(10))
c=This.ronde1(c,d,a,b,T_X(11),17,This.SinusArray(11))
b=This.ronde1(b,c,d,a,T_X(12),22,This.SinusArray(12))

a=This.ronde1(a,b,c,d,T_X(13), 7,This.SinusArray(13))
d=This.ronde1(d,a,b,c,T_X(14),12,This.SinusArray(14))
c=This.ronde1(c,d,a,b,T_X(15),17,This.SinusArray(15))
b=This.ronde1(b,c,d,a,T_X(16),22,This.SinusArray(16))
&& ronde 2
a=This.ronde2(a,b,c,d,T_X( 2), 5,This.SinusArray(17))
d=This.ronde2(d,a,b,c,T_X( 7), 9,This.SinusArray(18))
c=This.ronde2(c,d,a,b,T_X(12),14,This.SinusArray(19))
b=This.ronde2(b,c,d,a,T_X( 1),20,This.SinusArray(20))

a=This.ronde2(a,b,c,d,T_X( 6), 5,This.SinusArray(21))
d=This.ronde2(d,a,b,c,T_X(11), 9,This.SinusArray(22))
c=This.ronde2(c,d,a,b,T_X(16),14,This.SinusArray(23))
b=This.ronde2(b,c,d,a,T_X( 5),20,This.SinusArray(24))

a=This.ronde2(a,b,c,d,T_X(10), 5,This.SinusArray(25))
d=This.ronde2(d,a,b,c,T_X(15), 9,This.SinusArray(26))
c=This.ronde2(c,d,a,b,T_X( 4),14,This.SinusArray(27))
b=This.ronde2(b,c,d,a,T_X( 9),20,This.SinusArray(28))

a=This.ronde2(a,b,c,d,T_X(14), 5,This.SinusArray(29))
d=This.ronde2(d,a,b,c,T_X( 3), 9,This.SinusArray(30))
c=This.ronde2(c,d,a,b,T_X( 8),14,This.SinusArray(31))
b=This.ronde2(b,c,d,a,T_X(13),20,This.SinusArray(32))

&& ronde 3
a=This.ronde3(a,b,c,d,T_X( 6), 4,This.SinusArray(33))
d=This.ronde3(d,a,b,c,T_X( 9),11,This.SinusArray(34))
c=This.ronde3(c,d,a,b,T_X(12),16,This.SinusArray(35))
b=This.ronde3(b,c,d,a,T_X(15),23,This.SinusArray(36))

a=This.ronde3(a,b,c,d,T_X( 2), 4,This.SinusArray(37))
d=This.ronde3(d,a,b,c,T_X( 5),11,This.SinusArray(38))
c=This.ronde3(c,d,a,b,T_X( 8),16,This.SinusArray(39))
b=This.ronde3(b,c,d,a,T_X(11),23,This.SinusArray(40))

a=This.ronde3(a,b,c,d,T_X(14), 4,This.SinusArray(41))
d=This.ronde3(d,a,b,c,T_X( 1),11,This.SinusArray(42))
c=This.ronde3(c,d,a,b,T_X( 4),16,This.SinusArray(43))
b=This.ronde3(b,c,d,a,T_X( 7),23,This.SinusArray(44))

a=This.ronde3(a,b,c,d,T_X(10), 4,This.SinusArray(45))
d=This.ronde3(d,a,b,c,T_X(13),11,This.SinusArray(46))
c=This.ronde3(c,d,a,b,T_X(16),16,This.SinusArray(47))
b=This.ronde3(b,c,d,a,T_X( 3),23,This.SinusArray(48))

&& ronde 4
a=This.ronde4(a,b,c,d,T_X( 1), 6,This.SinusArray(49))
d=This.ronde4(d,a,b,c,T_X( 8),10,This.SinusArray(50))
c=This.ronde4(c,d,a,b,T_X(15),15,This.SinusArray(51))
b=This.ronde4(b,c,d,a,T_X( 6),21,This.SinusArray(52))

a=This.ronde4(a,b,c,d,T_X(13), 6,This.SinusArray(53))
d=This.ronde4(d,a,b,c,T_X( 4),10,This.SinusArray(54))
c=This.ronde4(c,d,a,b,T_X(11),15,This.SinusArray(55))
b=This.ronde4(b,c,d,a,T_X( 2),21,This.SinusArray(56))

a=This.ronde4(a,b,c,d,T_X( 9), 6,This.SinusArray(57))
d=This.ronde4(d,a,b,c,T_X(16),10,This.SinusArray(58))
c=This.ronde4(c,d,a,b,T_X( 7),15,This.SinusArray(59))
b=This.ronde4(b,c,d,a,T_X(14),21,This.SinusArray(60))

a=This.ronde4(a,b,c,d,T_X( 5), 6,This.SinusArray(61))
d=This.ronde4(d,a,b,c,T_X(12),10,This.SinusArray(62))
c=This.ronde4(c,d,a,b,T_X( 3),15,This.SinusArray(63))
b=This.ronde4(b,c,d,a,T_X(10),21,This.SinusArray(64))

a=a+OldA
b=b+OldB
c=c+OldC
d=d+OldD
Endfor
a=Transform(Bitand(a,0xFFFFFFFF),"@0") && cast
b=Transform(Bitand(b,0xFFFFFFFF),"@0") && cast
c=Transform(Bitand(c,0xFFFFFFFF),"@0") && cast
d=Transform(Bitand(d,0xFFFFFFFF),"@0") && cast
a=Substr(a,9,2)+Substr(a,7,2)+Substr(a,5,2)+Substr(a,3,2)
b=Substr(b,9,2)+Substr(b,7,2)+Substr(b,5,2)+Substr(b,3,2)
c=Substr(c,9,2)+Substr(c,7,2)+Substr(c,5,2)+Substr(c,3,2)
d=Substr(d,9,2)+Substr(d,7,2)+Substr(d,5,2)+Substr(d,3,2)

Return a+b+c+d
Enddefine

Martín E. Lezama

unread,
Mar 29, 2015, 12:32:37 PM3/29/15
to publice...@googlegroups.com
Fernando:

¡Gracias por la data! Ahora la bajo y la chusmeo.

Igualmente, yo en líneas generales trato de que todo lo que pueda solucionar por PRG, lo hago sin agregar cosas extra al sistema. No es por nada, simplemente que en Pergamino (Bs.As.) todavía tengo clientes con PC del año del ñaupa jajaja, entonces, cuantas menos cosas ponga, más rendimiento obtengo. Y encima, con esas PC todavía a veces se quejan de que el sistema anda lento, no, si son mortales jajajaja.

BTW y Off Topic, para quienes tengan Facebook, les recomiendo la página "Me pasó en Sistemas". Ahí se van a encontrar con bastantes de las cosas que nos hacen renegar a desarrolladores e IT's, y hasta encontrarte conque cosas que vos pensabas que te pasaban solo a vos, resulta que es algo comùn, como la vuelta que me llama el dueño de una empresa para que la PC le deje de hacer pitidos porque si no la revolea contra la pared, y llegar y ver un bibliorato graciosamente apoyado sobre la barra espaciadora. :D

Sorry por el Off topic, a veces uno hace catarsis jaja.

Abrazos a todos.
Reply all
Reply to author
Forward
0 new messages