consultarCFDI
Esta sección detalla la operación para consultar el XML de un CFDI previamente timbrado con el servicio.
Descripción de la Operación
Esta operación permite obtener el XML de un comprobante fiscal que ha sido timbrado utilizando la misma cuenta de la API. La consulta está limitada a CFDI cuya fecha de timbrado no exceda los 3 meses desde la fecha de la solicitud.
Para realizar la consulta, solo es necesario proporcionar la apikey y el uuid del comprobante.
Parámetros de Entrada (Input)
| Parámetro | Tipo de Dato | Descripción |
|---|---|---|
apikey |
string |
Credencial de acceso al servicio (Solicita aquí). |
uuid |
string |
Folio Fiscal (UUID) del CFDI que se desea consultar. |
Parámetros de Salida (Output) - RespuestaConsultarCFDI
| Atributo | Tipo de Dato | Descripción |
|---|---|---|
code |
string |
Código de respuesta que indica el resultado de la operación. |
message |
string |
Mensaje descriptivo sobre el resultado de la operación. |
data |
string |
Contenido del XML del CFDI consultado. |
Ejemplo de Código
Solicitud (Request)
Implementación
Herramienta y Configuración: Se utiliza la herramienta svcutil de .NET para generar el cliente a partir del WSDL.
- Desarrollo:
dotnet svcutil https://dev.facturaloplus.com/ws/servicio.do?wsdl - Producción:
dotnet svcutil https://app.facturaloplus.com/ws/servicio.do?wsdl
using System;
using System.Threading.Tasks;
public class ConsultarCFDIRequest
{
public string Apikey { get; set; }
public string Uuid { get; set; }
}
public async Task<RespuestaConsultarCFDI> ConsultarCFDIAsync(ConsultarCFDIRequest request)
{
using var client = new ServicioTimbradoWSPortTypeClient("ServicioTimbradoWSPort");
try
{
var response = await client.consultarCFDIAsync(request.Apikey, request.Uuid);
return response;
}
catch (Exception ex)
{
Console.WriteLine($"Error al consultar el CFDI: {ex.Message}");
throw;
}
}
public class RespuestaConsultarCFDI
{
public string? Code { get; set; }
public string? Message { get; set; }
public string? Data { get; set; }
}
// Ejemplo de uso
public async Task EjemploUsoConsultarCFDIAsync()
{
var request = new ConsultarCFDIRequest
{
Apikey = "TU_API_KEY_AQUI",
Uuid = "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168"
};
var resultado = await ConsultarCFDIAsync(request);
if (resultado != null && resultado.Code == "200")
{
Console.WriteLine("¡Consulta Exitosa!");
Console.WriteLine($"Mensaje: {resultado.Message}");
Console.WriteLine("XML del CFDI:");
Console.WriteLine(resultado.Data);
}
else
{
Console.WriteLine($"Error: {resultado?.Message}");
}
}Implementación
Herramienta y Configuración: Se utiliza la herramienta wsimport del JDK para generar las clases de cliente.
- Desarrollo:
wsimport -keep -verbose https://dev.facturaloplus.com/ws/servicio.do?wsdl - Producción:
wsimport -keep -verbose https://app.facturaloplus.com/ws/servicio.do?wsdl
import java.util.concurrent.CompletableFuture;
public class ConsultarCFDIService {
// ... (Definición de ExecutorService, Logger, etc.)
public CompletableFuture<RespuestaConsultarCFDI> consultarCFDIAsync(String apiKey, String uuid) {
return CompletableFuture.supplyAsync(() -> {
try {
ServicioTimbradoWS service = new ServicioTimbradoWS();
ServicioTimbradoWSPortType port = service.getServicioTimbradoWSPort();
return port.consultarCFDI(apiKey, uuid);
} catch (Exception ex) {
throw new RuntimeException("Error al consultar el CFDI", ex);
}
}, executor);
}
// Ejemplo de uso
public static void main(String[] args) {
ConsultarCFDIService service = new ConsultarCFDIService();
String apiKey = "TU_API_KEY_AQUI";
String uuid = "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168";
service.consultarCFDIAsync(apiKey, uuid)
.whenComplete((resultado, ex) -> {
if (ex != null) {
System.err.println("Error: " + ex.getMessage());
} else if ("200".equals(resultado.getCode())) {
System.out.println("¡Consulta Exitosa!");
System.out.println("Mensaje: " + resultado.getMessage());
System.out.println("XML del CFDI:");
System.out.println(resultado.getData());
} else {
System.err.println("Error en la respuesta: " + resultado.getMessage());
}
service.shutdown();
}).join();
}
}Implementación
Herramienta y Configuración: Se utiliza la librería zeep. Para instalarla, ejecuta: pip install zeep
import asyncio
from zeep.asyncio import AsyncClient
class ConsultarCFDIService:
def __init__(self, wsdl_url: str):
self.wsdl_url = wsdl_url
self.async_client = AsyncClient(self.wsdl_url)
async def consultar_cfdi_async(self, **kwargs) -> dict:
response = await self.async_client.service.consultarCFDI(**kwargs)
return response
async def main():
service = ConsultarCFDIService("https://dev.facturaloplus.com/ws/servicio.do?wsdl")
params = {
"apikey": "TU_API_KEY_AQUI",
"uuid": "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168"
}
resultado = await service.consultar_cfdi_async(**params)
if resultado and resultado['code'] == '200':
print("¡Consulta Exitosa!")
print(f"Mensaje: {resultado['message']}")
print("XML del CFDI:")
print(resultado['data'])
else:
print(f"Error al realizar la consulta: {resultado['message'] if resultado else 'Sin respuesta'}")
if __name__ == "__main__":
asyncio.run(main())Implementación
Herramienta y Configuración: Se requiere la extensión php-soap. Generalmente viene incluida con PHP, pero si no, se puede instalar con apt-get install php-soap (Debian/Ubuntu) o yum install php-soap (CentOS/RHEL). Asegúrate de que esté habilitada en tu php.ini.
<?php
class ConsultarCFDIService {
private string $wsdlUrl;
public function __construct(string $wsdlUrl) {
$this->wsdlUrl = $wsdlUrl;
}
public function consultarCFDI(array $params): ?object {
try {
$soapClient = new SoapClient($this->wsdlUrl, ['trace' => 1, 'exceptions' => true]);
$response = $soapClient->consultarCFDI($params);
return $response->return ?? null;
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
return null;
}
}
}
// Ejemplo de uso
$service = new ConsultarCFDIService("https://dev.facturaloplus.com/ws/servicio.do?wsdl");
$params = [
'apikey' => "TU_API_KEY_AQUI",
'uuid' => "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168"
];
$resultado = $service->consultarCFDI($params);
header('Content-Type: text/plain');
if ($resultado && $resultado->code == '200') {
echo "¡Consulta Exitosa!\n";
echo "Mensaje: {$resultado->message}\n";
echo "XML del CFDI:\n";
echo $resultado->data;
} else {
echo "Error al realizar la consulta: " . ($resultado->message ?? 'Error desconocido');
}
?>
Respuesta (Response)
La respuesta SOAP contiene el XML del CFDI consultado.
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="urn:ws_api">
<SOAP-ENV:Body>
<ns1:consultarCFDIResponse xmlns:ns1="urn:ws_api">
<return xsi:type="tns:RespuestaConsultarCFDI">
<code xsi:type="xsd:string">200</code>
<message xsi:type="xsd:string">OK</code>
<data xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante ...> ... </cfdi:Comprobante>]]></data>
</return>
</ns1:consultarCFDIResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>Códigos de respuesta
Los códigos de respuesta de la operación (éxito o error en la llamada) se pueden consultar en la sección general de códigos. El XML del comprobante se encuentra en el campo data de la respuesta.