PrestaShop 1.7 · PrestaShop 8
PrestaShop es la segunda plataforma más usada en España y la que más preguntas genera sobre VeriFactu, porque sus facturas nativas no lo cumplen. Cofactu no tiene módulo en Addons; tiene un webhook, y el hook `actionPaymentConfirmation` de PrestaShop es el sitio natural para llamarlo.
PrestaShop dispara su evento de pago, como ya hace hoy.
Desde el hook nativo o desde Make. JSON normalizado, API key en la cabecera.
Cofactu numera, calcula la huella SHA-256 encadenada y genera el PDF con QR.
Con tu certificado, el registro sale a AEAT en segundo plano y guarda el CSV de respuesta.
Con código · el hook nativo
Se dispara cuando el pedido pasa a un estado de pago aceptado. Un módulo mínimo que registre este hook basta; no hace falta tocar el core ni los overrides.
<?php
// modules/cofactuverifactu/cofactuverifactu.php
class CofactuVerifactu extends Module
{
public function install(): bool
{
return parent::install() && $this->registerHook('actionPaymentConfirmation');
}
public function hookActionPaymentConfirmation(array $params): void
{
$order = new Order((int) $params['id_order']);
$customer = new Customer((int) $order->id_customer);
$address = new Address((int) $order->id_address_invoice);
$lines = [];
foreach ($order->getProducts() as $p) {
$lines[] = [
'descripcion' => $p['product_name'],
'cantidad' => (float) $p['product_quantity'],
'precioUnitario' => (float) $p['unit_price_tax_excl'],
'tipoIva' => (float) $p['tax_rate'],
];
}
$ch = curl_init('https://api.cofactu.com/api/webhooks/ecommerce-orders');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . Configuration::get('COFACTU_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'platform' => 'prestashop',
'externalOrderId' => $order->reference,
'client' => $address->dni ? [
'nif' => $address->dni,
'nombre' => $address->company ?: $customer->firstname . ' ' . $customer->lastname,
'email' => $customer->email,
'direccion' => $address->address1,
'codigoPostal' => $address->postcode,
'ciudad' => $address->city,
'pais' => Country::getIsoById((int) $address->id_country),
] : null, // F2 simplificada
'lines' => $lines,
]),
]);
curl_exec($ch);
curl_close($ch);
}
} Sin código
Crea una API key en Cofactu (Configuración → API keys).
En Make, módulo «PrestaShop → Watch Orders» (usa el webservice de PrestaShop; actívalo en Parámetros avanzados → Webservice).
Módulo HTTP: POST a https://api.cofactu.com/api/webhooks/ecommerce-orders con Authorization: Bearer vf_live_….
Mapea reference a externalOrderId y las líneas del pedido a lines con unit_price_tax_excl y tax_rate.
El JSON que espera Cofactu
POST https://api.cofactu.com/api/webhooks/ecommerce-orders con
Authorization: Bearer vf_live_…. Precios sin IVA y tipoIva por
línea; client: null emite una factura simplificada F2; externalOrderId
hace la llamada idempotente. Desde
Configuración → Integraciones → Ecommerce
se lanza un pedido de prueba y se ve cada pedido con su estado en AEAT.
{
"platform": "prestashop",
"externalOrderId": "2026-000123",
"client": {
"nif": "B12345678",
"nombre": "Tienda Ejemplo SL",
"email": "compras@ejemplo.com",
"direccion": "C/ Mayor 1",
"codigoPostal": "28001",
"ciudad": "Madrid",
"pais": "ES"
},
"lines": [
{
"descripcion": "Zapatillas running 42",
"cantidad": 1,
"precioUnitario": 79.34,
"tipoIva": 21
},
{
"descripcion": "Gastos de envío",
"cantidad": 1,
"precioUnitario": 4.13,
"tipoIva": 21
}
],
"autoSubmit": true
} Preguntas frecuentes
No. PrestaShop numera y genera un PDF, pero no calcula la huella encadenada, no imprime el QR de verificación ni registra nada en AEAT. Desde 2027 esa factura no es válida como registro de facturación; la tienda puede seguir siendo PrestaShop, la factura la emite un sistema VeriFactu.
Todavía no. El módulo mínimo de esta página (un hook y un POST) es lo que haría un módulo publicado, y Make lo sustituye sin código. Publicaremos el módulo en Addons cuando haya tiendas reales detrás.
El hook actionPaymentConfirmation existe desde 1.5, así que el módulo funciona. Pero 1.6 lleva sin soporte de seguridad desde 2019; lo probamos en 1.7 y 8.
El dni de la dirección de facturación, que PrestaShop pide según el país. Si está vacío, manda client: null y Cofactu emite factura simplificada F2.
No: el webhook es idempotente por platform + externalOrderId, y la referencia del pedido de PrestaShop es única. El JSON es el mismo para las cuatro tiendas: platform, externalOrderId, client (o null para una factura simplificada F2) y lines con precio sin IVA y tipoIva por línea.
Cuenta gratis, API key en un minuto y un pedido de prueba para ver la primera factura encadenada.
Usamos cookies propias, de Google (qué anuncios traen registros) y de PostHog (cómo se usa la web). Si las rechazas, la web funciona igual. Más información .
Empieza gratis o mira los planes. Tu primera factura VeriFactu en menos de 10 minutos.