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