PrestaShop 1.7 · PrestaShop 8

VeriFactu en PrestaShop. El pago confirmado dispara la factura en AEAT.

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.

Flujo del pedido a AEAT

  1. 01 Pedido pagado en tu tienda

    PrestaShop dispara su evento de pago, como ya hace hoy.

  2. 02 Un POST al webhook de Cofactu

    Desde el hook nativo o desde Make. JSON normalizado, API key en la cabecera.

  3. 03 Factura encadenada

    Cofactu numera, calcula la huella SHA-256 encadenada y genera el PDF con QR.

  4. 04 Registrada en AEAT

    Con tu certificado, el registro sale a AEAT en segundo plano y guarda el CSV de respuesta.

Con código · el hook nativo

actionPaymentConfirmation

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
<?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

Sin tocar PHP: Make

  1. 1

    Crea una API key en Cofactu (Configuración → API keys).

  2. 2

    En Make, módulo «PrestaShop → Watch Orders» (usa el webservice de PrestaShop; actívalo en Parámetros avanzados → Webservice).

  3. 3

    Módulo HTTP: POST a https://api.cofactu.com/api/webhooks/ecommerce-orders con Authorization: Bearer vf_live_….

  4. 4

    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

Un solo formato para todas las tiendas

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.

json
{
  "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

PrestaShop y VeriFactu, en corto

¿Las facturas que genera PrestaShop cumplen VeriFactu?

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.

¿Hay módulo de Cofactu en PrestaShop Addons?

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.

¿Funciona en PrestaShop 1.6?

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.

¿Qué campo de PrestaShop es el NIF?

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.

¿Se duplica la factura si el hook se ejecuta dos veces?

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.

Tu tienda sigue siendo PrestaShop. La factura, VeriFactu.

Cuenta gratis, API key en un minuto y un pedido de prueba para ver la primera factura encadenada.

¿Listo para facturar sin sustos?

Empieza gratis o mira los planes. Tu primera factura VeriFactu en menos de 10 minutos.

Sin tarjetaCancela en 1 clicExporta cuando quieras