Generar una solicitud para timbrar de manera asíncrona par comprobantes CFDI
 
Ahora realizaremos una petición de solicitud de timbrado, este proceso consta de 2 pasos de forma general:
 
Primero, se deberá realizar una petición POST en la que se indicará el nombre del archivo XML o ZIP que enviaremos a la API y el espacio (bytes) que se ocupará para dicho proceso.
Después, se tendrá que enviar el o los archivos de los cuales requerimos se nos genere el TFD teniendo ya un ID y URL específica para esta petición.
 
 
En seguida te mostramos el proceso:
 
Paso
Acción
 
 
En la primera parte del proceso, se tendrá que identificar mediante qué método será la petición, para este caso como anteriormente se indica, será mediante el método POST.
 
 
 
 
Capturamos los datos que la petición POST nos solicita:
 
 
 
A) Solicitud:
Indicará la URL a la que la solicitud deberá realizarse:
 
 
 
 
B) Encabezados/headers.
Este apartado nos indica tres datos requeridos en los encabezados (headers) de la solicitud:
 
 
 
¿Dónde encontrar los valores de mis headers/encabezados?
 
  • License-Code: Este código de licencia lo podrás encontrar dentro del apartado de licencias de tu portal CONTPAQi® Nube, a este portal podrás acceder desde el acceso directo que te muestra tu cuenta, dentro del apartado Productos / CONTPAQi Timbra / Suscripción, posteriormente deberás dar clic en el vínculo Consulta Aquí del apartado Mi Licencia CONTPAQi® Nube.
     
 
  • Content-Type: Este campo es opcional, pero te recomendamos llenarlo con el valor siguiente: 'application/json'
 
 
  • Subscription-Key: Tu clave privada la podrás consultar desde tu cuenta API CONTPAQi dentro de Productos / CONTPAQi Timbra / Suscripción y dentro del apartado Sus suscripciones, se encontrará una clave privada por cada suscripción, para poder verla sólo haz clic en el vínculo Mostrar.
 
Ejemplo de headers:
{
'License-Code''HD2342WW',
'Content-Type''application/json',
'Subscription-Key''ch8439djd036205083ldu2’48'
}
 
 
C) Body/cuerpo
Otro de los valores que nos pide es el cuerpo/body de la solicitud, el cual deberá estar compuesto por 3 variables dentro de un objeto JSON:
 
Ejemplo
{
'fileName': "XML COMPLEMENTO PAGO.xml",
'fileSizeInBytes': 4451, 
'rfc': "AES010101AE0" 
}
 
 
 
 
Construir nuestra solicitud POST:
 
Una vez que conocemos lo que la API nos pide compartir en la solicitud dentro de nuestros Encabezados/Headers y en el Cuerpo / Body además de que dicha petición deberá ser mediante el método POST a la URL indicada, lo siguiente es realizar la solicitud con dicha información.
 
Para nuestro ejemplo hay que recordar que utilizamos Python 3.7 y usaremos la librería Request para realizar nuestras peticiones, por lo que quedaría de la siguiente forma:
 
# -*- coding: utf-8 -*-
import requests
import json
 
url_peticion = "https://qasisvapiscti.azure-api.net/isv/v1/massivestamping/files/stampone"
 
XmlBytes = 4415 #tamaño del archivo XML en bytes
 
payload = "{'fileName': \"prueba1.xml\",'fileSizeInBytes':"+ XmlBytes +",'rfc': \"AES010101AE0\"}"
 
headers_peticion = {
  'License-Code''7A94A7A5',
  'Content-Type''application/json',
  'Subscription-Key''2de2bdd4dffb45fead117d1398f77ece'
}
 
response_post = requests.request("POST", url_peticion, headers=headers_peticion, data=payload)
 
 
 
Consultar respuesta a la petición POST:
 
Si nuestra petición es exitosa, se mostrará la respuesta con el estado 200, el cual representa que está correcto mediante un OK para peticiones HTTPS:
 
 
Ejemplo de petición POST y cómo validar si fue exitosa:
 
response_post = requests.request("POST", url_peticion, headers=headers_peticion, data=payload)
 
if response_post.status_code == 200:
 
 
 
Identificar los datos que la petición PUT nos solicita:
 
Ahora, ya estamos en la segunda parte del proceso, el cual consiste en realizar una petición PUT al servicio de almacenamiento para poder realizar el envío de nuestros archivos.
Lo primero es detectar qué valores obtenidos como respuesta necesitamos almacenar.
 
La documentación del Portal de Desarrolladores API CONTPAQi® indica lo siguiente:
 
Nota:
 
Todos los datos anteriores que la petición PUT nos solicita ya los tenemos, y en su mayoría son los que recibimos como respuesta en el paso anterior.
 
 
 
Almacenar valores obtenidos como respuesta y construir nuestros encabezados / headers.
 
Como respuesta obtuvimos la URL y los encabezados/headers que tendremos que enviar, por lo que necesitamos guardarlos para posteriormente hacer nuestra petición PUT con esos valores.
En nuestro ejemplo en Python 3.7 se realizó de la siguiente manera:
 
    dir_response_post = response_post.json()
    #URL a la que se deberá enviar la petición de sellado
    url_sellado = dir_response_post['presignedUrl']
    #ID asignado a para el documento que se intentara sellar
    fileID = dir_response_post['fileID']
    #encabezados  solicitados por la URL
    headers_sellado = {
    'x-amz-meta-id-archivo': fileID,
    'x-amz-meta-tamanio': XmlBytes,
    'Content-Type''application/xml'
    }
 
 
Obtener XML como data-binary:
 
Uno de los valores que nos solicita la API es poder enviar nuestro XML en el cuerpo/body pero este deberá ir como data-binary:
 
Para realizar esto, se deberá abrir el archivo XML en modo lectura y esa lectura tendrá que ser en binario para poder generar una cadena que posteriormente se envíe en el PUT.
En este ejemplo en Python 3.7 se realizó de la siguiente manera:
 
#ruta/directorio del XML
dir_xml = "./Ejemplos/prueba1.xml"
##abrimos un puntero en el archivo XML, se abrirá para lectura en formato binario
obj_xml = open (dir_xml,'rb')
#leemos el archivo abierto y se lo asignamos a la variable
xml_string = obj_xml.read()
 
 
Importante:
 
Al indicar el valor 'rb' a nuestro puntero, le indicamos que será para lectura (r = read) y a su vez indicamos que esa lectura será en formato binario (b=binary).
 
 
 
 
Realizar petición PUT:
 
Por último, para enviar nuestra petición, sólo es necesario capturar un Request con los datos que ya hemos obtenido, por ejemplo:
 
response_post = requests.request("POST", url_peticion, headers=headers_peticion, data=payload)
 
Si todo es correcto, únicamente obtendremos como respuesta el estado 204 indicando que la petición fue exitosa.
 
 
 
!Y listo!, ya tenemos nuestra solicitud de timbrado realizado, por lo que tendremos que esperar, y posteriormente consultar el estado de nuestra solicitud.