consultarCfdisRelacionados
Esta sección detalla la operación para consultar la lista de CFDI relacionados a un comprobante específico a partir de su Folio Fiscal (UUID).
Descripción de la Operación
Esta operación permite obtener una lista de los folios fiscales (UUID) de los comprobantes que están relacionados con un CFDI en particular. Para realizar la consulta, es necesario proporcionar las credenciales de la API, los archivos de certificado (.cer y .key) en formato PEM, el RFC del emisor y el UUID del comprobante del cual se desea obtener los CFDI relacionados.
La respuesta incluye un código de estado, un mensaje descriptivo y, en caso de éxito, una estructura JSON con la lista de los documentos relacionados.
Parámetros de Entrada (Input)
| Parámetro | Tipo de Dato | Descripción |
|---|---|---|
apikey |
string |
Credencial de acceso al servicio (Solicita aquí). |
keyPEM |
string |
Contenido del archivo de llave privada (.key) en formato PEM. |
cerPEM |
string |
Contenido del archivo de certificado (.cer) en formato PEM. |
uuid |
string |
Folio Fiscal (UUID) del CFDI del cual se consultarán los relacionados. |
rfcEmisor |
string |
RFC del contribuyente emisor del CFDI. |
Parámetros de Salida (Output) - RespuestaRelacionados
| 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 |
Estructura en formato JSON que contiene la lista de los CFDI relacionados. |
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 ConsultarRelacionadosRequest
{
public string Apikey { get; set; }
public string KeyPEM { get; set; }
public string CerPEM { get; set; }
public string Uuid { get; set; }
public string RfcEmisor { get; set; }
}
public async Task<RespuestaRelacionados> ConsultarRelacionadosAsync(ConsultarRelacionadosRequest request)
{
using var client = new ServicioTimbradoWSPortTypeClient("ServicioTimbradoWSPort");
try
{
var response = await client.consultarCfdisRelacionadosAsync(request.Apikey, request.KeyPEM, request.CerPEM, request.Uuid, request.RfcEmisor);
return response;
}
catch (Exception ex)
{
Console.WriteLine($"Error al consultar CFDI relacionados: {ex.Message}");
throw;
}
}
public class RespuestaRelacionados
{
public string? Code { get; set; }
public string? Message { get; set; }
public string? Data { get; set; }
}
// Ejemplo de uso
public async Task EjemploUsoConsultarRelacionadosAsync()
{
var request = new ConsultarRelacionadosRequest
{
Apikey = "TU_API_KEY_AQUI",
KeyPEM = "CONTENIDO_KEY_PEM",
CerPEM = "CONTENIDO_CER_PEM",
Uuid = "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168",
RfcEmisor = "ABC010101XYZ"
};
var resultado = await ConsultarRelacionadosAsync(request);
if (resultado != null && resultado.Code == "200")
{
Console.WriteLine("¡Consulta Exitosa!");
Console.WriteLine($"Mensaje: {resultado.Message}");
Console.WriteLine($"Datos: {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 ConsultarRelacionadosService {
// ... (Definición de ExecutorService, Logger, etc.)
public CompletableFuture<RespuestaRelacionados> consultarRelacionadosAsync(String apiKey, String keyPEM, String cerPEM, String uuid, String rfcEmisor) {
return CompletableFuture.supplyAsync(() -> {
try {
ServicioTimbradoWS service = new ServicioTimbradoWS();
ServicioTimbradoWSPortType port = service.getServicioTimbradoWSPort();
return port.consultarCfdisRelacionados(apiKey, keyPEM, cerPEM, uuid, rfcEmisor);
} catch (Exception ex) {
throw new RuntimeException("Error al consultar CFDI relacionados", ex);
}
}, executor);
}
// Ejemplo de uso
public static void main(String[] args) {
ConsultarRelacionadosService service = new ConsultarRelacionadosService();
String apiKey = "TU_API_KEY_AQUI";
String keyPEM = "CONTENIDO_KEY_PEM";
String cerPEM = "CONTENIDO_CER_PEM";
String uuid = "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168";
String rfcEmisor = "ABC010101XYZ";
service.consultarRelacionadosAsync(apiKey, keyPEM, cerPEM, uuid, rfcEmisor)
.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("Datos: " + 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 ConsultarRelacionadosService:
def __init__(self, wsdl_url: str):
self.wsdl_url = wsdl_url
self.async_client = AsyncClient(self.wsdl_url)
async def consultar_relacionados_async(self, **kwargs) -> dict:
response = await self.async_client.service.consultarCfdisRelacionados(**kwargs)
return response
async def main():
service = ConsultarRelacionadosService("https://dev.facturaloplus.com/ws/servicio.do?wsdl")
params = {
"apikey": "TU_API_KEY_AQUI",
"keyPEM": "CONTENIDO_KEY_PEM",
"cerPEM": "CONTENIDO_CER_PEM",
"uuid": "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168",
"rfcEmisor": "ABC010101XYZ"
}
resultado = await service.consultar_relacionados_async(**params)
if resultado and resultado['code'] == '200':
print("¡Consulta Exitosa!")
print(f"Mensaje: {resultado['message']}")
print(f"Datos: {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 ConsultarRelacionadosService {
private string $wsdlUrl;
public function __construct(string $wsdlUrl) {
$this->wsdlUrl = $wsdlUrl;
}
public function consultarRelacionados(array $params): ?object {
try {
$soapClient = new SoapClient($this->wsdlUrl, ['trace' => 1, 'exceptions' => true]);
$response = $soapClient->consultarCfdisRelacionados($params);
return $response->return ?? null;
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
return null;
}
}
}
// Ejemplo de uso
$service = new ConsultarRelacionadosService("https://dev.facturaloplus.com/ws/servicio.do?wsdl");
$params = [
'apikey' => "TU_API_KEY_AQUI",
'keyPEM' => "CONTENIDO_KEY_PEM",
'cerPEM' => "CONTENIDO_CER_PEM",
'uuid' => "5FD4E09E-52F4-4A0E-8E4D-39E6B8E47168",
'rfcEmisor' => "ABC010101XYZ"
];
$resultado = $service->consultarRelacionados($params);
header('Content-Type: application/json');
if ($resultado && $resultado->code == '200') {
echo json_encode([
'status' => 'success',
'message' => $resultado->message,
'data' => json_decode($resultado->data)
], JSON_PRETTY_PRINT);
} else {
echo json_encode([
'status' => 'error',
'message' => $resultado->message ?? 'Error al realizar la consulta.'
], JSON_PRETTY_PRINT);
}
?>
Respuesta (Response)
La respuesta SOAP contiene el resultado de la consulta de CFDI relacionados.
<?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:consultarCfdisRelacionadosResponse xmlns:ns1="urn:ws_api">
<return xsi:type="tns:RespuestaRelacionados">
<code xsi:type="xsd:string">200</code>
<message xsi:type="xsd:string">OK</code>
<data xsi:type="xsd:string">JSON DE CFDIs RELACIONADOS</data>
</return>
</ns1:consultarCfdisRelacionadosResponse>
</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 detalle específico de los CFDI relacionados se encuentra en el campo data de la respuesta.