Descarga de CFDIs por webservice
La descarga masiva de sus CFDI del portal del SAT le sirve para:
* Recuperar sus archivos XML cuando han sido extraviados.
* Comparar lo que ha sido timbrado por el PAC con lo que tiene el SAT en sus servidores.
* Verificar que las facturas de tus proveedores están en los servidores del SAT y obtener las que estén pendientes y olvidadas.
Sólo funciona en producción, usar datos reales.
Esta se lleva a cabo en 4 pasos:
1. Autenticacion. Nos identificamos con el SAT y nos devuelve una clave o token que dura 5 minutos, si pasa ese tiempo deberá obtener otro.
facturista.exe --ejecutar "lfmxAutenticar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor=cfdidescargamasivasolicitud.clouda.sat.gob.mx;Puerto=443;SSL=1;ArchivoRespuesta=res.txt"
Esto nos devuelve el token en la salida estándar, ej. XYZ
2. Solicitud de descarga. Hacemos la petición de un periodo, pasando el token.
facturista.exe --ejecutar "lfmxSolicitarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor=cfdidescargamasivasolicitud.clouda.sat.gob.mx;Puerto=443;SSL=1;ArchivoRespuesta=res.txt;FechaInicial=2019-02-01T00:00:00;FechaFinal=2019-02-28T23:59:59;RfcEmisor=AAA010101AAA;RfcReceptor=;RfcSolicitante=AAA010101AAA;TipoSolicitud=CFDI;access_token=XYZ"
Esto nos devuelve el ID de solicitud a la salida estándar, ej. 19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e
3. Verificacion de solicitud de descarga. Para saber si fue aceptada y su estado posterior. Pasamos el token y el ID de solicitud.
Si el token ha expirado, obtener otro como en el paso 1.
facturista.exe --ejecutar "lfmxVerificarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor=cfdidescargamasivasolicitud.clouda.sat.gob.mx;Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdSolicitud=19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e;RfcSolicitante=AAA010101AAA;access_token=XYZ"
Si hay exito se ponen los IDs de paquetes en la salida estándar, separados por coma si son varios. Ej. 19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e_01
4. Descarga. Pasamos el ID de paquete; es una descarga por cada ID.
facturista.exe --ejecutar "lfmxDescargar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor=cfdidescargamasiva.clouda.sat.gob.mx;Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdPaquete=19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e_01;RfcSolicitante=AAA010101AAA;ArchivoDestino=des1.zip;access_token=XYZ"
Notar que el servidor de descarga es distinto al de los pasos anteriores.
Cuando se trata de Retenciones, los servidores respectivos son:
retendescargamasivasolicitud
retendescargamasiva
Por linea de comandos se devuelve 0 al SO si hubo éxito.
Por medio de la función exec() de la DLL se devuelve <> 0
Unicamente en la función exec(comando, long1, long2)
el manejador h se pasa al final (long2 o 3er parámetro)
servidorS="cfdidescargamasivasolicitud.clouda.sat.gob.mx"
servidorD="cfdidescargamasiva.clouda.sat.gob.mx"
rfc="AAA010101AAA"
fechaini="2019-02-01T00:00:00"
fechafin="2019-02-28T23:59:59"
1.
if
exec("lfmxAutenticar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt", 0, h)
<>0
token=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
2.
if
exec("lfmxSolicitarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;FechaInicial="+fechaini+";FechaFinal="+fechafin+";RfcEmisor="+rfc+";RfcReceptor=;RfcSolicitante="+rfc+";TipoSolicitud=CFDI;access_token=XYZ", 0, h)
<>0
idSolicitud=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
3.
if
exec("lfmxVerificarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdSolicitud=19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e;RfcSolicitante="+rfc+";access_token=XYZ", 0, h)
<>0
idpaquetes=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
4.
if
exec("lfmxDescargar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorD+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdPaquete=19ae834a-1f8c-49c4-83f8-bccc5f3e6b3e_01;RfcSolicitante="+rfc+";ArchivoDestino=des1.zip;access_token=XYZ", 0, h)
<>0
base64delZip=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
* Ejemplo para realizar solicitud
servidorS="cfdidescargamasivasolicitud.clouda.sat.gob.mx"
fechaini="2019-02-01T00:00:00"
fechafin="2019-02-28T23:59:59"
rfc="AAA010101AAA"
if exec("lfmxAutenticar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt", 0, h)
<>0
token=cfdi_resultado( h )
if exec("lfmxSolicitarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;FechaInicial="+fechaini+";FechaFinal="+fechafin+";RfcEmisor="+rfc+";RfcReceptor=;RfcSolicitante="+rfc+";TipoSolicitud=CFDI;access_token="+token, 0, h)
<>0
idSolicitud=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
else
error=cfdi_error( h )
endif
* Ejemplo para verificar la solicitud y descargar los paquetes zip. El paquete puede tomar de 10 mins a 3 dias en estar disponible.
servidorS="cfdidescargamasivasolicitud.clouda.sat.gob.mx"
servidorD="cfdidescargamasiva.clouda.sat.gob.mx"
rfc="AAA010101AAA"
if exec("lfmxAutenticar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt", 0, h)
<>0
token=cfdi_resultado( h )
if exec("lfmxVerificarDescarga:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorS+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdSolicitud="+idSolicitud+";RfcSolicitante="+rfc+";access_token="+token, 0, h)
<>0
idPaquetes=cfdi_resultado( h )
* Si son varios vienen separados por coma, usted deberá obtener cada uno
if exec("lfmxDescargar:ArchivoLlavePrivada=a.key;ArchivoCertificado=a.cer;Contrasena=1234;Servidor="+servidorD+";Puerto=443;SSL=1;ArchivoRespuesta=res.txt;IdPaquete="+idPaquete+";RfcSolicitante="+rfc+";ArchivoDestino=des1.zip;access_token="+token, 0, h)
<>0
* Si hubo exito el archivo zip debe estar guardado, no es necesario recuperar el contenido con cfdi_resultado()
base64delZip=cfdi_resultado( h )
else
error=cfdi_error( h )
endif
else
error=cfdi_error( h )
endif
else
error=cfdi_error( h )
endif