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.

Ejemplos de uso del API REST VeriFactu en .NET

A continuación mostramos cómo realizar llamadas al API REST de Veri*Factu desde aplicaciones .NET.
Recuerda sustituir el campo ServiceKey por tu clave real de acceso.


📌 Ejemplo en C# – Generar Código QR

using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    private static readonly HttpClient http = new HttpClient();

    static async Task Main()
    {
        var url = "https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/GetQrCode";

        var payload = new
        {
            ServiceKey = "your service key",
            InvoiceID = "FRTEST1734699642488",
            InvoiceDate = "2024-12-20T13:00:42.488Z",
            SellerID = "B12959755",
            CompanyName = "IRENE SOLUTIONS SL",
            TaxItems = new[]
            {
                new { TaxBase = 11.99, TaxAmount = 2.52 }
            }
        };

        var json = JsonSerializer.Serialize(payload);
        using var content = new StringContent(json, Encoding.UTF8, "application/json");

        using var resp = await http.PostAsync(url, content);
        var body = await resp.Content.ReadAsStringAsync();

        Console.WriteLine($"Status: {(int)resp.StatusCode}");
        Console.WriteLine(body);
    }
}

📌 Ejemplo en C# – Crear Factura

using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    private static readonly HttpClient http = new HttpClient();

    static async Task Main()
    {
        var url = "https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/Create";

        var payload = new
        {
            ServiceKey = "zfzxgzxgcxzgdsaaaaa",
            Status = "POST",
            InvoiceType = "F1",
            InvoiceID = "FRTEST1752504601220",
            InvoiceDate = DateTime.UtcNow.ToString("o"),
            SellerID = "B12959755",
            CompanyName = "IRENE SOLUTIONS SL",
            RelatedPartyID = "B44531218",
            RelatedPartyName = "WEFINZ SOLUTIONS SL",
            Text = "SERVICIOS INFORMATICOS",
            TaxItems = new[]
            {
                new { TaxScheme = "01", TaxType = "S1", TaxRate = 21, TaxBase = 11.99, TaxAmount = 2.52 }
            }
        };

        var json = JsonSerializer.Serialize(payload);
        using var content = new StringContent(json, Encoding.UTF8, "application/json");

        using var resp = await http.PostAsync(url, content);
        var body = await resp.Content.ReadAsStringAsync();

        Console.WriteLine($"Status: {(int)resp.StatusCode}");
        Console.WriteLine(body);
    }
}

📌 Ejemplo en Visual Basic – Generar Código QR

Imports System
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Private ReadOnly http As New HttpClient()

    Async Function Main() As Task
        Dim url = "https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/GetQrCode"

        Dim payload = New With {
            .ServiceKey = "your service key",
            .InvoiceID = "FRTEST1734699642488",
            .InvoiceDate = "2024-12-20T13:00:42.488Z",
            .SellerID = "B12959755",
            .CompanyName = "IRENE SOLUTIONS SL",
            .TaxItems = {New With {.TaxBase = 11.99, .TaxAmount = 2.52}}
        }

        Dim json = JsonSerializer.Serialize(payload)
        Dim content = New StringContent(json, Encoding.UTF8, "application/json")

        Dim resp = Await http.PostAsync(url, content)
        Dim body = Await resp.Content.ReadAsStringAsync()

        Console.WriteLine($"Status: {CInt(resp.StatusCode)}")
        Console.WriteLine(body)
    End Function
End Module

📌 Ejemplo en Visual Basic – Crear Factura

Imports System
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Private ReadOnly http As New HttpClient()

    Async Function Main() As Task
        Dim url = "https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/Invoices/Create"

        Dim payload = New With {
            .ServiceKey = "zfzxgzxgcxzgdsaaaaa",
            .Status = "POST",
            .InvoiceType = "F1",
            .InvoiceID = "FRTEST1752504601220",
            .InvoiceDate = DateTime.UtcNow.ToString("o"),
            .SellerID = "B12959755",
            .CompanyName = "IRENE SOLUTIONS SL",
            .RelatedPartyID = "B44531218",
            .RelatedPartyName = "WEFINZ SOLUTIONS SL",
            .Text = "SERVICIOS INFORMATICOS",
            .TaxItems = {New With {.TaxScheme = "01", .TaxType = "S1", .TaxRate = 21, .TaxBase = 11.99, .TaxAmount = 2.52}}
        }

        Dim json = JsonSerializer.Serialize(payload)
        Dim content = New StringContent(json, Encoding.UTF8, "application/json")

        Dim resp = Await http.PostAsync(url, content)
        Dim body = Await resp.Content.ReadAsStringAsync()

        Console.WriteLine($"Status: {CInt(resp.StatusCode)}")
        Console.WriteLine(body)
    End Function
End Module

⚠️ Notas importantes

  • Los endpoints de pruebas están disponibles en https://facturae.irenesolutions.com:8050/Kivu/Taxes/Verifactu/.
  • Sustituir ServiceKey por la clave real que se obtiene al registrarse en el panel de la API.
  • Los ejemplos muestran únicamente llamadas básicas; el modelo de datos admite más campos según la casuística de la factura.
⚠️ **GitHub.com Fallback** ⚠️