Descripción del proyecto
He creado una API en PHP que recibe un JSON con los datos de una factura y devuelve el XML compatible con la AEAT. Además, valida la información, guarda los datos en base de datos y consulta la factura anterior para el encadenamiento correcto.
Detalles técnicos
- URL: https://diaml.es/api/verifactu.php
- Método: POST
- Header:
Content-Type: application/json - Autenticación: mediante tokens temporales
- Base de datos: conexión segura y transaccional con
mysql
Ejemplo de cuerpo JSON
{
"pruebas": true,
"numeroCliente": "1",
"obligadoNombre": "NombreEMISOR",
"obligadoNif": "MICIF",
...
}
Respuesta obtenida
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/s...
Gestión de errores
La API valida el JSON recibido y devuelve mensajes claros si faltan campos o hay errores de autenticación (aunque en la versión de demostración están deshabilitados):
{
"error": "Falta clave: obligadoNombre",
"recibido": {
"calificacionOperacion": "N2",
"tipoImpositivo": 0
}
}
Estructura y arquitectura
El proyecto está organizado en clases:
- Conexión: Clase general reutilizable para acceder a la base de datos.
- Autenticación: Clase independiente para validar tokens.
- JsonValidator: Validación de estructura y contenido del JSON.
- Creación del XML: Clase para transformar JSON a XML y guardar datos.
Cada clase tiene su propio constructor, funciones cortas y variables descriptivas para facilitar el mantenimiento y reutilización.
Galería del Proyecto
Esta API es para mostrarla y no está conectada a ninguna base de datos ni requiere autentificación. Solo devuelve un trozo del xml y es solo para mostrarla en esta web.
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/s...
Además para evitar que devuelva errores de servidor tipo 500, se valida la estructura del json. Si falta alguno de los campos devuelve un error como este:
{
"error": "Falta clave: obligadoNombre",
"recibido": {
"calificacionOperacion": "N2",
"tipoImpositivo": 0
}
}
Y se muestra el json recibido junto con el error 400
También muestra una serie de errores si falla la autentificación, errores 401 pero como está deshabilitada no se puede ver en esta API de pruebas. He intentado ser cuidadoso en probar todos los distintos tipos de error para evitar que puedan suceder.
También y teniendo en cuenta que el encadenamiento es muy importante y no puede fallar, la query de mysql que guarda los datos se hace mediante transacción y bloqueando la base de datos hasta que se guarden los datos. Esto ralentiza un poco si hay muchas consultas al mismo tiempo pero evita errores de encadenamiento que no se deben producir bajo ningún concepto.
A continuación se muestran algunas imágenes ilustrativas del proyecto:
El flujo empieza creando una conexión a la base de datos.Esta conexión se hace mediante una clase que reutilizo. Seguidamente se ejecuta una clase para validar la autentificación. También esta clase se reutiliza en otras APIs. Luego mediante la clase JsonValidatos valido que el json tenga las claves que tiene que tener y que tenga estructura de json.

Finalmente, ejecuto la clase para transformar el json en xml y guardar los datos. Cada clase tiene su constructor y sus variables:

En la clase puede haber otras validaciones:

Cada clase está formada por funciones que en general son cortas. El nombre de las funciones explica qué hacen, las variables también.

Cuando hay que ir a buscar datos de la base de datos utilizo funciones reutilizables.

Proyectos php:
Proyecto de API de tipo GET con php: https://diaml.es/proyectoGet.html
Volver al Indice: https://diaml.es