Validar Factura Electrónica Firmada con VFP, al Web Service del SRI

1,798 views
Skip to first unread message

Milton

unread,
Sep 26, 2019, 2:30:56 AM9/26/19
to Comunidad de Visual Foxpro en Español
Buenos días estimados colegas, espero contar con su gran ayuda. Estoy intentando enviar al Web Service del SRI una factura electronica firmada correctamente pues utilizando el facturador del SRI si he logrado enviar y autorizar sin problemas. Pero enviando desde VFP 9.0 mediante winhttp.winhttprequest.5.1 no lo estoy logrando. El SRI me dice que el documento esta mal formado, supongo que es al crear el string del REQUEST que se envía al Web Service. Les dejo el código haber si alguien son sus sabios conocimientos me puede dar una manito en verificar que está mal.
De antemano muchismas gracias por sus comentarios.

oWS = CREATEOBJECT("ws_sri")
IF ENCFST.eDocAmbi=1
ELSE
ENDIF
oWS.cRutafirmado   = THISFORM.efactura1001.cDirFirmados+'\'+ENCFST.eDocClave+'.XML'
oWS.cRutaRespuesta = THISFORM.efactura1001.cDirFirmados+'\'+ENCFST.eDocClave+'_Rta.XML'
lcRespuesta = oWS.Enviar_comprobante()
IF oWS.iStatus != 0
   MESSAGEBOX(oWS.sError,16,"Error al ejecutar WS")
ELSE
   MESSAGEBOX(lcRespuesta,64,"EjecutandoWS desde VFP - PortalFOX")
ENDIF  


**************************************************
*-- Class:        ws_sri (c:\omega\fuentes\clases\efactura.vcx)
*-- ParentClass:  custom
*-- BaseClass:    custom
*-- Time Stamp:   09/26/19 01:00:07 AM
*
DEFINE CLASS ws_sri AS custom


Height = 22
Width = 138
*-- String que contiene un error
serror = ""
*-- Estado de respuesta
istatus = 0
*-- URL del WS al que se quiere comunicar.
surl_ws = ""
*-- Ruta y nombre del archivo de Respuesta.
crutarespuesta = ""
*-- Ruta y Nombre del archivo donde esta el archivo firmado que se va ha enviar.
crutafirmado = ""
Name = "ws_sri"


*-- Envía un comprobante firmado en formato XML.
PROCEDURE enviar_comprobante
* --- Paso 1. Creo el XML Request ---

*Llamada a EnviarComprobante, en base64
cXMLTo2Byte      = STRCONV(FILETOSTR(THIS.cRutaFirmado),11)
cByteToBase64    = STRCONV(STRCONV(cXMLTo2Byte,2),13)
sXMLRequest      = this.Crearrequest_comprobante(cByteToBase64)  && Crear estructura SOAP de para Requerimiento de Envio de documento Firmado
  
pXMLResponse = THIS.cRutaRespuesta && Establecer la Ruta y nombre del archivo donde se depositará la respuesta
  
* --- Paso 2. Ejecuto el WS | Paso 3. Obtengo el Response ---
this.iStatus =  this.Enviar( this.sURL_WS, sXMLRequest , pXMLResponse )

IF this.iStatus != 0  && Ocurrió un error el cual está especificado en sError.
   RETURN ""
ENDIF 

sXMLResponse = FILETOSTR(pXMLResponse)
  
RETURN sRespuestaWS
ENDPROC


*-- Envía (ejecuta) un request al WS del SRI.
PROCEDURE enviar
LPARAMETERS pURL_WSDL, pFileRequest , pFileResponse
*---------------------------------------------------

TRY 
   oHTTP = CREATEOBJECT('winhttp.winhttprequest.5.1')
   oHTTP.OPEN("POST", pURL_WSDL, .F.)
   oHTTP.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.17929)")
   oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8")
   oHTTP.SEND(pFileRequest)
CATCH TO loErr
   this.sError = "Error: " + TRANSFORM(loErr.ErrorNo) +  " Mensaje: " + loErr.Message
   this.iStatus = -1      
ENDTRY 
IF this.iStatus != 0
   RETURN -1
ENDIF 
* --- Si el status es diferente a 200, ocurrió algún error de conectividad con el WS ---
IF oHTTP.STATUS = 200
   RespuestaWS = oHTTP.responseText
   * --- Se genera el XML del response | Este es el paso 3!! ---
   STRTOFILE(STRCONV(RespuestaWS,9),pXMLResponse)
   this.iStatus = 0
   this.sError = ""
   RETURN 0
ELSE
   this.sError = "Error: No se logró la conexión con el Web Service."+STR(oHTTP.STATUS)+oHTTP.ResponseText
   this.iStatus = -1
   RETURN -1
ENDIF
ENDPROC


*-- Crea la estructura que debe tener un requerimiento (REQUEST) de un comprobante firmado del SRI.
PROCEDURE crearrequest_comprobante
LPARAMETERS vMensaje
TEXT TO sXMLRequest TEXTMERGE NOSHOW PRETEXT 7
<?xml version="1.0" encoding="utf-8"?>
<soap:Body>
<validarComprobante xmlns="http://ec.gob.sri.ws.recepcion">
<xml xmlns=""><<vMensaje>></xml>
</validarComprobante>
</soap:Body>
</soap:Envelope>
ENDTEXT 
RETURN sXMLRequest

ENDPROC


*-- Elimina archivo de Respuesta.
PROCEDURE eliminararchivo
LPARAMETERS pFile
IF FILE(pFile)
   DELETE FILE (pFile)
ENDIF 
ENDPROC


*-- Crea la estructura que debe tener un requerimiento (REQUEST) de una consulta del estado de la autorización.
PROCEDURE crearrequest_autorizacion
LPARAMETERS vMensaje
TEXT TO sXMLRequest TEXTMERGE NOSHOW PRETEXT 7
<?xml version="1.0" encoding="utf-8"?>
<soap:Body>
<autorizacionComprobante xmlns="http://ec.gob.sri.ws.autorizacion">
<claveAccesoComprobante xmlns=""><<vMensaje>></claveAccesoComprobante>
</autorizacionComprobante>
</soap:Body>
</soap:Envelope>
ENDTEXT 

RETURN sXMLRequest
ENDPROC


PROCEDURE Init
LPARAMETERS tcURLWS
this.sURL_WS = tcURLWS
this.iStatus = 0
this.sError = ""     
ENDPROC

ENDDEFINE
*
*-- EndDefine: ws_sri
**************************************************







Fernando Mora

unread,
Sep 26, 2019, 11:09:25 AM9/26/19
to Comunidad de Visual Foxpro en Español
Hola Milton.

Creo que aquí estas alterando el Xml firmado:
cXMLTo2Byte      = STRCONV(FILETOSTR(THIS.cRutaFirmado),11)

deberías simplemente hacer:
cXMLTo2Byte = FILETOSTR(THIS.cRutaFirmado)

En este rato lamentablemente no hay como probar para corroborar, ya que el servidor de pruebas del SRI esta caído.
En lo personal, uso Msxml2.ServerXMLHTTP.6.0 para consumir los webservices del SRI.

¿De que parte de Ecuador escribes?

Saludos
Fernando Mora
Machala - Ecuador

Milton

unread,
Sep 27, 2019, 1:08:40 PM9/27/19
to Comunidad de Visual Foxpro en Español
Te lo agradezco mucho Fernando por tu ayuda, mira hice algunas modificación relacionado a lo que mencionas y he logrado enviar a producción. Yo también tenía problemas con Pruebas, pero dada la urgencia estoy enviando a Produccción. Adicionalmente me di cuenta que tengo un problema adicional, la librería .DLL con la que firmo no libera el archivo firmado inmediatamente, por lo que también es un inconveniente con esto. He leído todo el post, donde explicas sobre los certificados y voy a hacer lo que sugieres, "generar 100% la firma en Fox", espero contar con tu ayuda. Cuando finalice la implementación publicaré este objeto WS_SRI, porque supongo que esto debe servir a otras personas.

Atentamente

MILTON CACHIPUENDO
Ibarra - Ecuador 

ryu...@gmail.com

unread,
Feb 4, 2024, 8:09:07 PM2/4/24
to Comunidad de Visual Foxpro en Español
Fernando como estas, una pregunta quizás tonta pero me podrías decir por que la preferencia de usar Msxml2.ServerXMLHTTP.6.0  como objeto para consumir webservice ???
Yo uso Microsoft.XMLHTTP y a veces siento que es algo lento, y en muy raras ocaciones me manda error en ciertos equipos windows que me ha tocado enviarlos a formatear para resolver porque el webservice 1 me devuelve "ec.gob.sri.comprobantes.electronicos.api.excepcion.ConversionArchivoXMLException: Error al convertir el archivo xml" es un tema muy raro que me ha pasado creo par de veces, pero me queda la espina igual

Saludos y gracias por tu tiempo.
Roberto Yuniz

Jairo Cedeño

unread,
Feb 6, 2024, 11:24:30 PM2/6/24
to Comunidad de Visual Foxpro en Español
Aunque no fue una pregunta directa a mi, te respondo, puedes usar cualquier de éstos tres, en mi caso uso de preferencia la #1
1.) WinHTTP.WinHTTPRequest.5.1
2.) Msxml2.ServerXMLHTTP.6.0
3.) Msxml2.ServerXMLHTTP

Espero que sea de ayuda.
Reply all
Reply to author
Forward
0 new messages