API REST - mdiago/VeriFactu GitHub Wiki

Ejemplos de llamadas al API REST

Java

Ejemplo llamada generación código QR

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class VerifactuApiPostExample {
    public static void main(String[] args) {
        // URL del endpoint
        String endpoint = "https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/GetQrCode";

        // Cuerpo de la solicitud (JSON)
        String requestBody = """
                {
                    "ServiceKey": "your service key",
                    "InvoiceID": "FRTEST1734699642488",
                    "InvoiceDate": "2024-12-20T13:00:42.488Z",
                    "SellerID": "B12959755",
                    "CompanyName": "IRENE SOLUTIONS SL",
                    "TaxItems": [
                        {
                            "TaxBase": 11.99,
                            "TaxAmount": 2.52
                        }
                    ]
                }
                """;

        try {
            // Crear cliente HTTP
            HttpClient client = HttpClient.newHttpClient();

            // Construir la solicitud
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(endpoint))
                    .header("Content-Type", "application/json") // Tipo de contenido
                    .POST(HttpRequest.BodyPublishers.ofString(requestBody)) // Método POST con el cuerpo
                    .build();

            // Enviar la solicitud y obtener la respuesta
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // Manejar la respuesta
            if (response.statusCode() == 200) {
                System.out.println("Respuesta exitosa:");
                System.out.println(response.body());
            } else {
                System.out.println("Error en la llamada: " + response.statusCode());
                System.out.println("Detalle: " + response.body());
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error al realizar la solicitud.");
        }
    }
}

Para deserializar el JSON en un objeto dinámico en Java, puedes usar bibliotecas como Jackson o Gson, que son populares y sencillas de usar.

A continuación, se muestra cómo hacerlo con Jackson, ya que permite trabajar fácilmente con objetos dinámicos.

Primero, asegúrate de incluir la dependencia de Jackson en tu archivo Maven (pom.xml) o Gradle:

Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>


Gradle:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

Código para Deserializar JSON en un Objeto Dinámico

Aquí tienes un ejemplo de cómo deserializar el JSON recibido en un objeto dinámico utilizando ObjectMapper de Jackson:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonDeserializationExample {
    public static void main(String[] args) {
        // JSON como cadena (puedes obtenerlo desde una respuesta HTTP)
        String json = """
                {
                    "ServiceKey": "your service key",
                    "InvoiceID": "FRTEST1734699642488",
                    "InvoiceDate": "2024-12-20T13:00:42.488Z",
                    "SellerID": "B12959755",
                    "CompanyName": "IRENE SOLUTIONS SL",
                    "TaxItems": [
                        {
                            "TaxBase": 11.99,
                            "TaxAmount": 2.52
                        }
                    ]
                }
                """;

        try {
            // Crear instancia de ObjectMapper
            ObjectMapper objectMapper = new ObjectMapper();

            // Deserializar JSON en un objeto dinámico (JsonNode)
            JsonNode rootNode = objectMapper.readTree(json);

            // Acceder a los campos del JSON
            String serviceKey = rootNode.get("ServiceKey").asText();
            String invoiceId = rootNode.get("InvoiceID").asText();
            String invoiceDate = rootNode.get("InvoiceDate").asText();
            String sellerId = rootNode.get("SellerID").asText();
            String companyName = rootNode.get("CompanyName").asText();

            System.out.println("ServiceKey: " + serviceKey);
            System.out.println("InvoiceID: " + invoiceId);
            System.out.println("InvoiceDate: " + invoiceDate);
            System.out.println("SellerID: " + sellerId);
            System.out.println("CompanyName: " + companyName);

            // Acceder a los elementos de la lista TaxItems
            JsonNode taxItemsNode = rootNode.get("TaxItems");
            for (JsonNode item : taxItemsNode) {
                double taxBase = item.get("TaxBase").asDouble();
                double taxAmount = item.get("TaxAmount").asDouble();

                System.out.println("TaxBase: " + taxBase);
                System.out.println("TaxAmount: " + taxAmount);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error al deserializar el JSON.");
        }
    }
}

Llamada a API REST con Python

Para realizar una llamada POST a la API https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/Create utilizando Python, puedes usar la librería requests.

Requisitos ⚙️

Primero, asegúrate de tener instalada la librería requests. Si no la tienes, puedes instalarla desde tu terminal con pip:

pip install requests
import requests
import json
from datetime import datetime, timezone

# El endpoint de la API
url = "[https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/Create](https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/Create)"

# El cuerpo de la solicitud en formato de diccionario de Python
# La fecha de la factura se ha actualizado a la fecha actual para que sea válida
payload = {
    "ServiceKey": "zfzxgzxgcxzgdsaaaaa",
    "Status": "POST",
    "InvoiceType": "F1",
    "InvoiceID": "FRTEST1752504601220",
    "InvoiceDate": datetime.now(timezone.utc).isoformat(),
    "SellerID": "B12959755",
    "CompanyName": "IRENE SOLUTIONS SL",
    "RelatedPartyID": "B44531218",
    "RelatedPartyName": "WEFINZ SOLUTIONS SL",
    "Text": "SERVICIOS INFORMATICOS",
    "TaxItems": [
        {
            "TaxScheme": "01",
            "TaxType": "S1",
            "TaxRate": 21,
            "TaxBase": 11.99,
            "TaxAmount": 2.52
        }
    ]
}

try:
    # Realizar la solicitud POST
    # La librería requests convierte automáticamente el diccionario a JSON
    response = requests.post(url, json=payload)
    
    # Forzar una excepción si la respuesta es un error HTTP (ej. 4xx o 5xx)
    response.raise_for_status()

    # Imprimir el código de estado de la respuesta
    print(f"✅ Status Code: {response.status_code}")

    # Imprimir la respuesta de la API en formato JSON
    print("📝 Response JSON:")
    print(json.dumps(response.json(), indent=4))

except requests.exceptions.HTTPError as http_err:
    print(f"❌ HTTP error occurred: {http_err}")
    print(f"    Response body: {response.text}")
except requests.exceptions.RequestException as err:
    print(f"❌ Other error occurred: {err}")
except json.JSONDecodeError:
    print("❌ La respuesta no es un JSON válido.")

Explicación del Código

  1. import requests: Importa la librería requests.
  2. url: Define la URL del endpoint.
  3. payload: Es un diccionario de Python que contiene los datos a enviar. requests lo convertirá automáticamente a formato JSON y añadirá la cabecera Content-Type: application/json.
  4. requests.post(url, json=payload): Ejecuta la solicitud POST.
  5. response.raise_for_status(): Es una buena práctica para comprobar si la solicitud fue exitosa. Si el código de estado es un error (como 404 o 500), lanzará una excepción.
  6. response.json(): Convierte la respuesta JSON del servidor en un diccionario de Python.
  7. json.dumps(response.json(), indent=4): Muestra el JSON de la respuesta de forma legible y con sangría.
  8. try...except: El bloque try...except gestiona posibles errores, como problemas de red (requests.exceptions.RequestException), errores HTTP (requests.exceptions.HTTPError) o respuestas que no son JSON válido.

PHP

Ejemplo llamada generación código QR

<?php

$url = 'https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/GetQrCode';

$data = [
    "ServiceKey" => "your service key",  // Sustituye por tu clave real
    "InvoiceID" => "FRTEST1734699642488",
    "InvoiceDate" => "2024-12-20T13:00:42.488Z",
    "SellerID" => "B12959755",
    "CompanyName" => "IRENE SOLUTIONS SL",
    "TaxItems" => [
        [
            "TaxBase" => 11.99,
            "TaxAmount" => 2.52
        ]
    ]
];

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (curl_errno($ch)) {
    echo 'Error de cURL: ' . curl_error($ch);
} else {
    if ($httpCode === 200) {
        echo "QR generado correctamente:\n";
        echo $response; // Puedes decodificarlo con json_decode si quieres acceder a los campos
    } else {
        echo "Error HTTP: $httpCode\n";
        echo "Respuesta: $response";
    }
}

curl_close($ch);

✅ Notas:

  • Este código es completamente funcional en entornos con PHP >= 7.0 y soporte para cURL.

  • Puedes utilizar json_decode($response, true) si necesitas acceder a los datos como array asociativo.

  • Recuerda sustituir "your service key" por la clave válida que te haya sido asignada.

⚠️ **GitHub.com Fallback** ⚠️