Published on

Consultar estatus de facturas con el SAT

Authors

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.