Como Validar Facturas en el SAT con Web Services

El SAT publicó un servicio web en el que podemos validar que una factura exista efectivamente en su base de datos, y verificar en que estado se encuentra.

La url del servicio web es la siguiente:

El servicio web es SOAP, así que si quieres ver su WSDL lo puedes hacer con la url:

La definición nos indica que debemos enviar la información como datos en una petición POST de la siguiente manera:

 <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={RFC_emisor}&rr={RFC_receptor}&tt={Total_Facturado}&id={UUID_timbrado}]]>
         </tem:expresionImpresa>
      </tem:Consulta>
   </soapenv:Body>
</soapenv:Envelope>

Donde el elemento “tem:expresionImpresa” hace referencia a la expresión impresa para generar el código QR de la factura, como está especificado en el Anexo 20 del formato de la factura electrónica, donde:

Prefijo Datos
re Es el RFC del emisor de la factura. Se obtiene del nodo cfdi:Comprobante/cfdi:Emisor o del dato directo ‘re’ escaneado del código de barras.
rr Es el RFC del receptor de la factura. Se obtiene del nodo cfdi:Comprobante/cfdi:Receptor o del dato directo ‘rr’ escaneado del código de barras.
tt Es el monto total facturado. Se obtiene del nodo cfdi:Comprobante, atributo “Total” o del dato directo ‘tt’ escaneado del código de barras.
id Es el uuid del timbrado de la factura. Se obtiene del nodo cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital atributo “UUID” o del dato directo ‘id’ escaneado del código de barras.

Esta es la respuesta del servicio web:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <ConsultaResponse xmlns="http://tempuri.org/">
         <ConsultaResult xmlns:a="http://schemas.datacontract.org/2004/07/Sat.Cfdi.Negocio.ConsultaCfdi.Servicio" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:CodigoEstatus>S - Comprobante obtenido satisfactoriamente.</a:CodigoEstatus>
            <a:EsCancelable>Cancelable sin aceptación</a:EsCancelable>
            <a:Estado>Vigente</a:Estado>
            <a:EstatusCancelacion/>
         </ConsultaResult>
      </ConsultaResponse>
   </s:Body>
</s:Envelope>

Contiene un elemento “ConsultaResponse”, el cual contiene un elemento “ConsultaResult” el cual es un elemento complejo que contiene 4 sub elementos con la siguiente información:

Elemento Dato
a:CodigoEstatus Es el estatus de la petición. ‘S’ si fué un éxito, ‘N’ si no fué encontrado.
a:EsCancelable Indica si la factura se puede cancelar. Puede ser cancelable con o sin aceptación, o no cancelable
a:Estado Es el estado de la factura, ‘Vigente’ si esta activa, o puede estar cancelada.
a:EstatusCancelacion Es el estatus de la cancelación, ya que el proceso tiene varios pasos.

Si escaneamos un código qr en una representación impresa de una factura CFDI válida nos da esta url:

Nos lleva a una página del mismo SAT, donde podemos hacer la verificación con un formulario, caputando la información de un captcha.

De esta misma url podemos obtener la información para generar nuestra petición POST y hacer uso del web service, ya que contiene la información necesaria: UUID, RFC Emisor, RFC Receptor y Total de la factura, para poder hacerlo automáticamente, sin necesidad del captcha.

Otra forma de hacerlo es leyendo la información del archivo *.xml y posteriormente hacer la petición al web service. Esto es en especial útil para verificar que las facturas que emitimos mediante un PAC realmente se encuentren en el SAT y con el status correcto, o para válidar que efectivamente una factura haya sido cancelada.

Leave a Reply

Your email address will not be published. Required fields are marked *