En este artículo, te explicaremos paso a paso cómo comunicarte con el servicio XML de Hacienda Española para enviar facturas electrónicas utilizando PHP. Este enfoque es ideal para empresas o desarrolladores que necesitan automatizar el proceso de gestión de facturas.
Requisitos Previos
Antes de empezar, asegúrate de contar con lo siguiente:
-
Certificado Digital:
-
Necesitarás un certificado digital en formato PFX o PEM, como el certificado de la FNMT, para autenticarte ante Hacienda.
-
-
PHP Configurado:
-
PHP 7.4 o superior con las extensiones
cURLyopensslhabilitadas.
-
-
Acceso al Servicio SOAP:
-
Hacienda ofrece servicios web SOAP para gestionar facturas electrónicas. Necesitarás el endpoint y el esquema XML correspondiente.
-
-
Entorno de Pruebas:
-
Antes de enviar datos reales, utiliza el entorno de pruebas de Hacienda para verificar que todo funcione correctamente.
-
Paso 1: Configuración del Certificado Digital
El certificado digital es fundamental para autenticarte. Asegúrate de tenerlo almacenado en tu servidor y sigue estos pasos:
-
Guarda el archivo del certificado en un lugar seguro, por ejemplo,
/ruta/a/tu-certificado.pfx. -
Ten a mano la contraseña del certificado, ya que será necesaria para establecer la conexión segura.
Paso 2: Crear el Código PHP
A continuación, te proporcionamos el código PHP para enviar una factura electrónica a través del servicio SOAP de Hacienda:
XML;
}
try {
// XML de ejemplo de la factura (ajusta según el esquema de Hacienda)
$facturaXML = <<
12345678A
Mi Empresa S.L.
87654321B
Cliente Ejemplo S.L.
1000.00
210.00
1210.00
XML;
// Crear la solicitud SOAP
$soapRequest = createSoapRequest($facturaXML);
// Configuración del cliente cURL
$ch = curl_init(SOAP_ENDPOINT);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: ""'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soapRequest);
// Configurar el certificado para la conexión segura
curl_setopt($ch, CURLOPT_SSLCERT, CERT_FILE);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, CERT_PASS);
// Realizar la llamada
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception('Error en la conexión: ' . curl_error($ch));
}
// Verificar el código de respuesta HTTP
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
throw new Exception("HTTP Code: $httpCode. Respuesta del servidor: $response");
}
curl_close($ch);
// Mostrar la respuesta del servicio
echo "Respuesta de Hacienda: n$responsen";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
Paso 3: Personalizar el XML de la Factura
El bloque $facturaXML contiene el ejemplo de una factura electrónica. Adáptalo a las necesidades de tu negocio siguiendo el esquema requerido por Hacienda. Esto incluye:
-
Datos del emisor (NIF, nombre, etc.).
-
Datos del receptor.
-
Detalles de la factura (base imponible, IVA, total, etc.).
Paso 4: Realizar Pruebas
-
Usar el entorno de pruebas de Hacienda:
-
Verifica que tu integración funcione correctamente sin afectar datos reales.
-
-
Depurar errores:
-
Si encuentras problemas, revisa la respuesta del servicio y los mensajes de error.
-
Paso 5: Firmar el XML (Opcional)
Si el servicio SOAP lo requiere, deberás firmar digitalmente el XML antes de enviarlo. Para ello, puedes usar librerías como xmlseclibs.
Por ejemplo:
require_once 'xmlseclibs/xmlseclibs.php';
$doc = new DOMDocument();
$doc->loadXML($facturaXML);
$objDSig = new XMLSecurityDSig();
$objDSig->signWithKey($key, $cert);
$objDSig->add509Cert($cert);
$objDSig->appendSignature($doc->documentElement);
Conclusión
Con esta guía, deberías ser capaz de enviar facturas electrónicas a Hacienda utilizando PHP. Este enfoque combina cURL para realizar solicitudes SOAP seguras con certificados digitales para autenticarte.
Si tienes alguna duda o necesitas más ayuda, no dudes en contactarnos o dejar tus preguntas en los comentarios.