Cliente Python Web Service del SAT para la descarga masiva de CFDIs
Project description
python-cfdiclient
Cliente Python Web Service del SAT para la descarga masiva de xml
Consulta y recuperación de comprobantes (Nuevo)
https://www.sat.gob.mx/consultas/42968/consulta-y-recuperacion-de-comprobantes-(nuevo)
Instalacion
En Windows requiere Microsoft Visual C++ Compiler for Python 2.7
pip install cfdiclient
Ejemplo Completo
import base64
import datetime
import os
import time
from cfdiclient import (Autenticacion, DescargaMasiva, Fiel, SolicitaDescarga,
VerificaSolicitudDescarga)
RFC = 'IUAL9406031K4'
FIEL_CER = 'asd.cer'
FIEL_KEY = 'df.key'
FIEL_PAS = ''
FECHA_INICIAL = datetime.date(2020, 1, 1)
FECHA_FINAL = datetime.date(2020, 6, 24)
PATH = 'Inputs/IUAL9406031K4/'
cer_der = open(os.path.join(PATH, FIEL_CER), 'rb').read()
key_der = open(os.path.join(PATH, FIEL_KEY), 'rb').read()
fiel = Fiel(cer_der, key_der, FIEL_PAS)
auth = Autenticacion(fiel)
token = auth.obtener_token()
print('TOKEN: ', token)
descarga = SolicitaDescarga(fiel)
# EMITIDOS
# solicitud = descarga.solicitar_descarga(
# token, RFC, FECHA_INICIAL, FECHA_FINAL, rfc_emisor=RFC, tipo_solicitud='CFDI'
# )
# RECIBIDOS
solicitud = descarga.solicitar_descarga(
token, RFC, FECHA_INICIAL, FECHA_FINAL, rfc_receptor=RFC, tipo_solicitud='CFDI'
)
print('SOLICITUD:', solicitud)
while True:
token = auth.obtener_token()
print('TOKEN: ', token)
verificacion = VerificaSolicitudDescarga(fiel)
verificacion = verificacion.verificar_descarga(
token, RFC, solicitud['id_solicitud'])
print('SOLICITUD:', verificacion)
estado_solicitud = int(verificacion['estado_solicitud'])
# 0, Token invalido.
# 1, Aceptada
# 2, En proceso
# 3, Terminada
# 4, Error
# 5, Rechazada
# 6, Vencida
if estado_solicitud <= 2:
# Si el estado de solicitud esta Aceptado o en proceso el programa espera
# 60 segundos y vuelve a tratar de verificar
time.sleep(60)
continue
elif estado_solicitud >= 4:
print('ERROR:', estado_solicitud)
break
else:
# Si el estatus es 3 se trata de descargar los paquetes
for paquete in verificacion['paquetes']:
descarga = DescargaMasiva(fiel)
descarga = descarga.descargar_paquete(token, RFC, paquete)
print('PAQUETE: ', paquete)
with open('{}.zip'.format(paquete), 'wb') as fp:
fp.write(base64.b64decode(descarga['paquete_b64']))
break
Ejemplo
Autenticacion
from cfdiclient import Autenticacion
from cfdiclient import Fiel
FIEL_KEY = 'Claveprivada_FIEL_XAXX010101000_20180918_134149.key'
FIEL_CER = 'XAXX010101000.cer'
FIEL_PAS = 'contrasena'
cer_der = open(FIEL_CER, 'rb').read()
key_der = open(FIEL_KEY, 'rb').read()
fiel = Fiel(cer_der, key_der, FIEL_PAS)
auth = Autenticacion(fiel)
token = auth.obtener_token()
print(token)
Solicita Descarga
import datetime
from cfdiclient import SolicitaDescarga
from cfdiclient import Fiel
FIEL_KEY = 'Claveprivada_FIEL_XAXX010101000_20180918_134149.key'
FIEL_CER = 'XAXX010101000.cer'
FIEL_PAS = 'contrasena'
cer_der = open(FIEL_CER, 'rb').read()
key_der = open(FIEL_KEY, 'rb').read()
fiel = Fiel(cer_der, key_der, FIEL_PAS)
descarga = SolicitaDescarga(fiel)
token = 'eyJh'
rfc_solicitante = 'XAXX010101000'
fecha_inicial = datetime.datetime(2018, 1, 1)
fecha_final = datetime.datetime(2018, 12, 31)
rfc_emisor = 'XAXX010101000'
rfc_receptor = 'XAXX010101000'
# Emitidos
result = descarga.solicitar_descarga(token, rfc_solicitante, fecha_inicial, fecha_final, rfc_emisor=rfc_emisor)
print(result)
# Recibidos
result = descarga.solicitar_descarga(token, rfc_solicitante, fecha_inicial, fecha_final, rfc_receptor=rfc_receptor)
print(result)
# {'mensaje': 'Solicitud Aceptada', 'cod_estatus': '5000', 'id_solicitud': 'be2a3e76-684f-416a-afdf-0f9378c346be'}
Verifica Solicitud Descarga
from cfdiclient import VerificaSolicitudDescarga
from cfdiclient import Fiel
FIEL_KEY = 'Claveprivada_FIEL_XAXX010101000_20180918_134149.key'
FIEL_CER = 'XAXX010101000.cer'
FIEL_PAS = 'contrasena'
cer_der = open(FIEL_CER, 'rb').read()
key_der = open(FIEL_KEY, 'rb').read()
fiel = Fiel(cer_der, key_der, FIEL_PAS)
v_descarga = VerificaSolicitudDescarga(fiel)
token = 'eyJhbGci'
rfc_solicitante = 'XAXX010101000'
id_solicitud = '6331caae-c253-406f-9332-126f89cc474a'
result = v_descarga.verificar_descarga(token, rfc_solicitante, id_solicitud)
print(result)
# {'estado_solicitud': '3', 'numero_cfdis': '8', 'cod_estatus': '5000', 'paquetes': ['a4897f62-a279-4f52-bc35-03bde4081627_01'], 'codigo_estado_solicitud': '5000', 'mensaje': 'Solicitud Aceptada'}
Descargar Paquetes
from cfdiclient import DescargaMasiva
from cfdiclient import Fiel
FIEL_KEY = 'Claveprivada_FIEL_XAXX010101000_20180918_134149.key'
FIEL_CER = 'XAXX010101000.cer'
FIEL_PAS = 'contrasena'
cer_der = open(FIEL_CER, 'rb').read()
key_der = open(FIEL_KEY, 'rb').read()
fiel = Fiel(cer_der, key_der, FIEL_PAS)
descarga = DescargaMasiva(fiel)
token = 'eyJhbG'
rfc_solicitante = 'XAXX010101000'
id_paquete = '2d8bbdf1-c36d-4b51-a57c-c1744acdd89c_01'
result = descarga.descargar_paquete(token, rfc_solicitante, id_paquete)
print(result)
# {'cod_estatus': '', 'mensaje': '', 'paquete_b64': 'eyJhbG=='}
Valida estado de documento
from cfdiclient import Validacion
validacion = Validacion()
rfc_emisor = 'XAXX010101000'
rfc_receptor = 'XAXX010101000'
total = '1000.41'
uuid = '0XXX0X00-000-0XX0-XX0X-000X0X0XXX00'
estado = validacion.obtener_estado(rfc_emisor, rfc_receptor, total, uuid)
print(estado)
# {'codigo_estatus': 'S - Comprobante obtenido satisfactoriamente.', 'es_cancelable': 'Cancelable con aceptación', 'estado': 'Vigente'}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file cfdiclient-1.6.2.tar.gz
.
File metadata
- Download URL: cfdiclient-1.6.2.tar.gz
- Upload date:
- Size: 23.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
8e24ad15180f575301b5c0592015407ff6757f716ef2a2cb956ec00f83db01f0
|
|
MD5 |
14a37b6c3bca74aa3f4c1353972a3fae
|
|
BLAKE2b-256 |
ed61a5bbde08a0a2b1d100283ca8e8130ed88f37a4672e0765ab32e037543c0c
|
Provenance
The following attestation bundles were made for cfdiclient-1.6.2.tar.gz
:
Publisher:
continuous_deployment.yml
on luisiturrios1/python-cfdiclient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1
-
Predicate type:
https://docs.pypi.org/attestations/publish/v1
-
Subject name:
cfdiclient-1.6.2.tar.gz
-
Subject digest:
8e24ad15180f575301b5c0592015407ff6757f716ef2a2cb956ec00f83db01f0
- Sigstore transparency entry: 230062468
- Sigstore integration time:
-
Permalink:
luisiturrios1/python-cfdiclient@f216f6373a7406e2df36d2599ba0ea0812aaccfa
-
Branch / Tag:
refs/tags/v1.6.2
- Owner: https://github.com/luisiturrios1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com
-
Runner Environment:
github-hosted
-
Publication workflow:
continuous_deployment.yml@f216f6373a7406e2df36d2599ba0ea0812aaccfa
-
Trigger Event:
push
-
Statement type:
File details
Details for the file cfdiclient-1.6.2-py3-none-any.whl
.
File metadata
- Download URL: cfdiclient-1.6.2-py3-none-any.whl
- Upload date:
- Size: 27.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
5d77d0ed3c315725987a3ef5596ca29da38b6f600ac6800439d6e238956be43d
|
|
MD5 |
ff4b94eef6cd87c1a8a68d89f4ec4d0a
|
|
BLAKE2b-256 |
98b2ec338ab1116513d439cd1c05b06c128e4ecf21df5fd94406147e528ed595
|
Provenance
The following attestation bundles were made for cfdiclient-1.6.2-py3-none-any.whl
:
Publisher:
continuous_deployment.yml
on luisiturrios1/python-cfdiclient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1
-
Predicate type:
https://docs.pypi.org/attestations/publish/v1
-
Subject name:
cfdiclient-1.6.2-py3-none-any.whl
-
Subject digest:
5d77d0ed3c315725987a3ef5596ca29da38b6f600ac6800439d6e238956be43d
- Sigstore transparency entry: 230062469
- Sigstore integration time:
-
Permalink:
luisiturrios1/python-cfdiclient@f216f6373a7406e2df36d2599ba0ea0812aaccfa
-
Branch / Tag:
refs/tags/v1.6.2
- Owner: https://github.com/luisiturrios1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com
-
Runner Environment:
github-hosted
-
Publication workflow:
continuous_deployment.yml@f216f6373a7406e2df36d2599ba0ea0812aaccfa
-
Trigger Event:
push
-
Statement type: