- Published on
Consultar estatus de facturas con el SAT
- Authors
- Name
- Pablo Solana
- @iLinKN95
Comencemos con este pequeño ejemplo para consumir el webservice del SAT
En uno de mis proyectos se necesita saber el estatus de las facturas ante el SAT, por lo que decidí crear una API para poder resolverlo.
El web service del SAT
Cuando escaneas el código QR de una factura se abre una página que te solicita algunos datos para validar el estatus, vamos a obtener ese mismo resultado y necesitamos:
- RFC del emisor
- RFC del receptor
- Monto total con centavos
- UUID de la factura
El servicio requiere de una petición SOAP a una URL con el formato de un xml recuerda estos datos lo vamos a necesitar más adelante.
La API REST
Decidí utilizar NodeJS para crear la API así que voy a empezar a platicarte las partes del proyecto. Necesitas las dependecias:
- express
- cors
- xml-js
- easy-soap-request
Recibir los datos:
app.get("/:re&&:rr&&:tt&&:id", (request, res) => { let { re, rr, tt, id } = request.params re=re.replace(/&/gi, '&') rr=rr.replace(/&/gi, '&') console.log(re, rr, tt, id)}
rr = RFC del receptor re = RFC del emisor tt = Monto total con centavos id = UUID de la factura
La url ya puede recibir los parametros necesarios de la siguiente manera: /RFCEmisor&&RFCReceptor&&MontoTotalConCentavos&&UUID
Ahora hay que armar la petición soap por el webservice del SAT
const url = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc'; const sampleHeaders = { 'user-agent': 'sampleTest', 'Content-Type': 'text/xml;charset=UTF-8', 'soapAction': 'http://tempuri.org/IConsultaCFDIService/Consulta', }; const xml = `<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> <soapenv:Header/> <soapenv:Body> <tem:Consulta> <!--Optional:--> <tem:expresionImpresa><![CDATA[?re=${re}?rr=${rr}?tt=${tt}?id=${id}]]> </tem:expresionImpresa> </tem:Consulta> </soapenv:Body> </soapenv:Envelope>`;}
Los valores de las constantes quedan de la siguiente manera: url contien la liga al servicio de validación, sampleHeaders los headers que se van a utilizar, xml tiene el contenido de requerido para la petición soap. Ahora se tiene que enviar las variables por lo que utilizo el soapRequest con los headers y el xml.
const data = async () => { const { response } = await soapRequest({ url: url, headers: sampleHeaders, xml: xml }); const { body } = response; res.send(convert.xml2json(body, { compact: true, spaces: 4 })) } data()
Debes tener ya la respuesta del servidor.
Te dejo el repositorio por si gustas ver a detalle el código. Saludos.