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:
<?php
// Ruta al archivo del certificado (formato PFX o PEM)
define('CERT_FILE', '/ruta/a/tu-certificado.pfx');
define('CERT_PASS', 'contraseña-certificado'); // Contraseña del certificado
// Endpoint del servicio SOAP de Hacienda (ajusta según el servicio específico)
define('SOAP_ENDPOINT', 'https://www2.agenciatributaria.gob.es/.../servicio');
// Namespace del servicio SOAP (ajusta según el WSDL específico)
define('SOAP_NAMESPACE', 'https://www2.agenciatributaria.gob.es/.../namespace');
// Crear el cuerpo de la solicitud SOAP (XML)
function createSoapRequest($facturaXML) {
return <<<XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="SOAP_NAMESPACE">
<soapenv:Header/>
<soapenv:Body>
<ns:EnviarFactura>
<ns:Factura>
<![CDATA[{$facturaXML}]]>
</ns:Factura>
</ns:EnviarFactura>
</soapenv:Body>
</soapenv:Envelope>
XML;
}
try {
// XML de ejemplo de la factura (ajusta según el esquema de Hacienda)
$facturaXML = <<<XML
<Factura>
<Emisor>
<NIF>12345678A</NIF>
<Nombre>Mi Empresa S.L.</Nombre>
</Emisor>
<Receptor>
<NIF>87654321B</NIF>
<Nombre>Cliente Ejemplo S.L.</Nombre>
</Receptor>
<Detalles>
<BaseImponible>1000.00</BaseImponible>
<IVA>210.00</IVA>
<Total>1210.00</Total>
</Detalles>
</Factura>
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.