API REST - mdiago/VeriFactu GitHub Wiki
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.");
}
}
}
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
.
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.")
-
import requests
: Importa la libreríarequests
. -
url
: Define la URL del endpoint. -
payload
: Es un diccionario de Python que contiene los datos a enviar.requests
lo convertirá automáticamente a formato JSON y añadirá la cabeceraContent-Type: application/json
. -
requests.post(url, json=payload)
: Ejecuta la solicitudPOST
. -
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 (como404
o500
), lanzará una excepción. -
response.json()
: Convierte la respuesta JSON del servidor en un diccionario de Python. -
json.dumps(response.json(), indent=4)
: Muestra el JSON de la respuesta de forma legible y con sangría. -
try...except
: El bloquetry...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
$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.