Revolución Digital

Vende productos digitales — claves de licencia + registro de dominio + descargas seguras

Precio: 299,00 €
Impuestos excluidos

Sell digital products professionally with Digital Revolution — an advanced module for managing software licenses, domain-restricted downloads, watermarked files, and support subscriptions. Perfect for selling PrestaShop modules, themes, software, digital media, or any downloadable product that needs licensing and access control.

Go beyond PrestaShop's basic virtual product support with per-domain licensing, automatic license key generation, download watermarking, expiration management, and tiered support plans with renewal tracking.

Key Benefits

  1. License Management: Generate and validate license keys with domain restrictions.
  2. Watermarked Downloads: Automatically watermark files with customer-specific identifiers.
  3. Support Subscriptions: Tiered support plans with expiration and renewal management.
  4. Domain Registration: Customers register domains for license activation and validation.
  5. Download Control: Expiring links, download limits, and version management.
Disponibilidad del producto: Descarga inmediata tras la compra
Compartir
Total de opciones: 0.00 €
6 visto

Professional Digital Product Sales

PrestaShop's built-in virtual product support is minimal — attach a file, set a download limit, done. If you sell software, modules, themes, or any digital product that requires licensing, Digital Revolution gives you the tools you need.

License Key System

Automatically generate unique license keys on purchase. Validate keys against registered domains via API. Set maximum domain activations per license. Revoke or transfer licenses from the admin panel.

Domain Registration

Customers register the domain(s) where they'll use your product. The license validation API checks the requesting domain against registered domains. This prevents unauthorized use while giving legitimate customers a smooth experience.

Watermarked Downloads

Automatically embed customer-specific identifiers into downloadable files. If a file appears on a piracy site, you can trace it back to the source. Supports PDF watermarking and ZIP file marking.

Support Subscriptions

Offer tiered support plans (e.g., 3 months free, 6/9/12 month paid options). Track expiration dates, send renewal reminders, and manage support access based on active subscription status.

Version Management

  • Upload multiple versions of a product
  • Customers always get the latest version
  • Changelog management per version
  • Selective access based on license tier
  • Automatic update notifications

¿Por qué este módulo es único?

  • License key generation with domain registration and validation API.
  • Watermarked downloads that embed customer information in delivered files.
  • Support subscription management with configurable duration and pricing.
  • Version management with release channels (stable, beta, development).

Casos de uso

  • Software developers selling modules, plugins, or themes with license protection.
  • Digital content creators selling downloadable assets with watermark protection.
  • SaaS-like businesses selling software with ongoing support subscriptions.
  • Referencia
    mprdigitalrevolution
  • En stock
    4 Artículos
  • Compatibilidad PrestaShop
    PS 1.7 – 9.x
  • Modelo de precio
    Compra única
  • Tipo de módulo
    Front & Back-office
  • Relevante para RGPD
    No
  • Objetivo comercial
    Optimizar operaciones
  • Cuenta externa necesaria
    No
  • Complejidad del módulo
    Solución completa
  • Etapa del recorrido del cliente
    Gestionar la tienda
  • Funciona con plataforma
    Sin plataforma externa

MPR Digital Products

Un modulo PrestaShop para la venta y distribucion de productos digitales (módulos, temas, complementos) con gestión de licencias, vinculacion de dominios, descargas personalizadas con marca de agua y actualizaciones automáticas con un clic.

Funciones

Gestión de licencias

  • Tipos de licencia: Licencias perpetuas, por suscripcion o de prueba
  • Vinculacion de dominio: Limitar instalaciónes por licencia (ej. 1 dominio por licencia)
  • Detección de dominios dev: localhost, staging y dominios dev no cuentan en los limites
  • Seguimiento del estado de licencia: Estados activo, suspendido, expirado, revocado
  • Periodo de gracia: Periodo de gracia configurable para validaciónes fallidas (por defecto: 7 dias)

Distribucion de productos

  • Gestión de versiones: Seguimiento de releases con números de version, changelogs e información de compatibilidad
  • Soporte de ramas: Ramas stable, beta, dev, legacy por producto
  • Descargas personalizadas: Cada descarga se marca con información de licencia para el seguimiento de la pirateria
  • Tokens seguros: Tokens de descarga con tiempo limitado previenen el intercambio no autorizado

Portal del cliente

  • Mis licencias: Los clientes visualizan y gestiónan sus licencias en /licenses
  • Registro de dominio: Registrar dominios directamente desde el portal
  • Historial de descargas: Seguimiento de todas las descargas por licencia
  • Estado del soporte: Ver la expiracion del soporte y opciones de renovacion

Sistema de auto-update

  • Actualizaciones con un clic: Los módulos pueden verificar e instalar actualizaciones automáticamente
  • Verificaciónes previas: Valida espacio en disco, permisos y extensiones PHP antes de la actualizacion
  • Atomic Swap: El modulo antiguo se respalda antes de instalar la nueva version
  • Soporte de rollback: Restauracion automática si la actualizacion falla
  • Scripts de upgrade: Ejecutar migraciónes de base de datos entre versiones

Pre-pedido / Proximamente

  • Productos no pedibles: Marcar productos como "proximamente" con fecha de lanzamiento prevista
  • Notificaciones de lanzamiento: Los clientes pueden suscribirse para ser notificados cuando el producto este disponible
  • Avisos en el carrito: Mostrar información cuando productos no pedibles estan en el carrito

Sistema de precios

  • Periodos de licencia: Ofrecer diferentes duraciones de licencia (1 mes, 1 ano, de por vida, etc.)
  • Periodos de soporte: Precios separados para la duracion del soporte
  • Variantes de producto: Combinar licencia + soporte + servicios en paquetes
  • Precios dinámicos: Precios específicos por carrito mediante el sistema SpecificPrice de PrestaShop

Servicios y complementos

  • Servicios incluidos: Instalación, personalización, soporte prioritario
  • Precios por servicio: Cada servicio tiene su propio precio anadido al total

Suscripciones de soporte (Stripe)

  • Pagos recurrentes: Integración con Stripe para facturacion por suscripcion
  • Extensiones de soporte: Los clientes pueden extender el soporte despues de la expiracion
  • Limite maximo de soporte: Limite por producto sobre cuanto tiempo de soporte se puede comprar por adelantado (ej. max 3 anos)
  • Manejo de webhooks: Actualizaciones automáticas de estado desde Stripe

Análisis y registro

  • Logs de descarga: Seguimiento de cada descarga con IP, user agent, ID de marca de agua
  • Logs de API: Todas las solicitudes de validación de licencia se registran
  • Historial de validación de tienda: Seguimiento de intentos de validación de dominio y resultados

Instalación

  1. Subir la carpeta mprdigitalproducts a /modules/
  2. Install from PrestaShop back office → Modules
  3. Configurar las claves API de Stripe en Ajustes (para soporte por suscripcion)
  4. Limpiar la cache de PrestaShop

Requisitos

  • PrestaShop 1.7.0 - 8.x
  • PHP 7.4+
  • Extension ZipArchive (para descargas)

Estructura del Back Office

El modulo agrega un menu Digital Products bajo VENDER con:

Digital Products
├── Dashboard
├── Catalog
│   ├── Products        - Digital products catalog
│   ├── Releases        - Version releases and ZIPs
│   └── Services        - Add-on services (installation, etc.)
├── Licensing
│   ├── Licenses        - Customer licenses
│   └── Domains         - Registered domains/shops
├── Support
│   ├── Subscriptions   - Active support subscriptions
│   └── Support Plans   - Subscription plan configuration
├── Analytics
│   ├── Downloads       - Download history
│   └── API Logs        - License validation logs
├── Settings            - Module configuration
└── System Check        - Integrity verification

Tablas de la base de datos

Tabla Proposito
mprdigitalproducts_product Catalogo de productos digitales
mprdigitalproducts_release Versiones con información de archivos
mprdigitalproducts_license Licencias de clientes
mprdigitalproducts_shop Dominios/instalaciónes registrados
mprdigitalproducts_license_shop Vinculaciones licencia-dominio
mprdigitalproducts_download_token Tokens de descarga temporales
mprdigitalproducts_download_log Historial de descargas
mprdigitalproducts_support_plan Planes de suscripcion de soporte
mprdigitalproducts_support_subscription Suscripciones activas
mprdigitalproducts_support_payment Pagos de suscripcion
mprdigitalproducts_validation_log Solicitudes de validación API
mprdigitalproducts_shop_validation_log Historial de validación de tienda
mprdigitalproducts_variant Paquetes de variantes de producto
mprdigitalproducts_license_price Precios por periodo de licencia
mprdigitalproducts_support_price Precios por periodo de soporte
mprdigitalproducts_service Servicios adicionales
mprdigitalproducts_cart_variant Selecciones de variantes en el carrito
mprdigitalproducts_notify Suscriptores de notificaciones de lanzamiento
mprdigitalproducts_banned_domain Dominios en lista negra
mprdigitalproducts_rate_limit Limitacion de velocidad de API

Endpoints de API

URL base: https://yoursite.com/api/license/{action}

Validación de licencia

POST /api/license/validate
Headers: X-License-Key: YOUR-LICENSE-KEY
Body: { "domain": "example.com", "module": "yourmodule" }

Verificar actualizaciones

POST /api/license/check
Headers: X-License-Key: YOUR-LICENSE-KEY
Body: { "module": "yourmodule", "version": "1.0.0" }

Obtener token de descarga

POST /api/license/download
Headers: X-License-Key: YOUR-LICENSE-KEY
Body: { "id_release": 123, "id_shop": 456 }

Descargar archivo

GET /download/{token}

Opciones de configuración

Ajuste Descripción Por defecto
module_enabled Activar/desactivar modulo true
api_rate_limit Solicitudes por hora 100
default_support_months Soporte gratuito incluido 3
default_max_domains Dominios por licencia 1
allow_domain_change Permitir reasignacion de dominio true
dev_domains_free Los dominios dev no cuentan true
grace_period_days Periodo de gracia para validaciónes fallidas 7
watermark_downloads Incorporar información de licencia en descargas true
stripe_mode test o live test

Ajustes por producto

Campo Descripción Por defecto
support_months Soporte gratuito incluido con la compra 3
max_support_months Meses maximos de soporte comprables (-1 = ilimitado) 36
max_domains Dominios permitidos por licencia 1

Hooks utilizados

Hook Proposito
displayBackOfficeHeader Cargar CSS/JS de admin
actionAdminControllerSetMedia Assets de admin
displayCustomerAccount Enlace "Mis licencias" en la cuenta del cliente
actionValidateOrder Generar licencia al completar el pedido
actionOrderStatusPostUpdate Manejar cambios de estado del pedido
moduleRoutes Registrar URLs amigables
actionFrontControllerSetMedia Cargar CSS/JS del front
displayProductAdditionalInfo Seleccion de variante en la página del producto
actionCartUpdateQuantityBefore Guardar variante al agregar al carrito
displayShoppingCartFooter Avisos para productos no pedibles
actionMPRCheckoutValidateOrder Bloquear checkout para articulos no pedibles

Funciones previstas / TODO

  • Integración del sistema de tickets (tickets de soporte por licencia)
  • Soporte multi-moneda para precios de licencia
  • Generación masiva de licencias para revendedores
  • Transferencia de licencias entre clientes
  • Panel de análisis de uso
  • Notificaciones webhook para eventos de licencia
  • Integración con el marketplace de PrestaShop Addons

Workflow de lanzamiento de modulo

Esta seccion cubre los pasos practicos para lanzar un nuevo modulo a traves del sistema MPR Digital Products.

Prerrequisitos

  • Código fuente del modulo listo para distribucion
  • Acceso al back office de MPR Digital Products
  • Acceso a la base de datos para la gestión de releases

Paso 1: Preparar el modulo

Archivos requeridos

Su modulo debe incluir la clase UpdateChecker.php para soporte de auto-update:

yourmodule/
├── yourmodule.php           # Main module file
├── classes/
│   └── UpdateChecker.php    # Copy from mprdigitalproducts/src/Classes/Protection/
├── views/
├── controllers/
└── ...

Copiar UpdateChecker

cp modules/mprdigitalproducts/src/Classes/Protection/UpdateChecker.php \
   modules/yourmodule/classes/

Integrar el Update Checker en el modulo

Agregar al método getContent() de su modulo:

public function getContent()
{
    $output = '';

    // Handle auto-update AJAX request
    if (Tools::getValue('ajax') && Tools::getValue('action') === 'mpr_auto_update') {
        $this->handleAutoUpdate();
    }

    // Check for updates and show notification
    $output .= $this->checkForUpdates();

    // ... rest of your configuration
    return $output . $this->renderConfigurationForm();
}

private function checkForUpdates()
{
    $checkerPath = dirname(__FILE__) . '/classes/UpdateChecker.php';
    if (!file_exists($checkerPath)) {
        return '';
    }

    require_once $checkerPath;

    $checker = \MPRDigitalProducts\Classes\Protection\UpdateChecker::fromModule(
        $this->name,
        $this->version
    );

    if (!$checker) {
        return '';
    }

    return $checker->getUpdateNotification();
}

private function handleAutoUpdate()
{
    require_once dirname(__FILE__) . '/classes/UpdateChecker.php';

    $checker = \MPRDigitalProducts\Classes\Protection\UpdateChecker::fromModule(
        $this->name,
        $this->version
    );

    if (!$checker) {
        header('Content-Type: application/json');
        die(json_encode(['success' => false, 'error' => 'License configuration not found']));
    }

    header('Content-Type: application/json');
    die(json_encode($checker->handleAjaxUpdate()));
}

Paso 2: Crear el ZIP de lanzamiento

Estructura de directorios

Los ZIPs de lanzamiento se almacenan en:

modules/mprdigitalproducts/releases/{module_name}/

Requisitos de estructura del ZIP

El ZIP debe contener el modulo dentro de una carpeta que coincida con el nombre del modulo:

yourmodule-1.0.0.zip
└── yourmodule/
    ├── yourmodule.php
    ├── classes/
    │   └── UpdateChecker.php
    └── ...

Ejemplo de script de construccion

Crear build_release.php en su modulo:

<?php
/**
 * Build release ZIP for yourmodule
 * Usage: php build_release.php [version]
 */

$moduleName = 'yourmodule';
$modulePath = dirname(__FILE__);
$version = $argv[1] ?? null;

if (!$version) {
    die("Usage: php build_release.php <version>\n");
}

// Update version in main file
$mainFile = file_get_contents("$modulePath/$moduleName.php");
$mainFile = preg_replace(
    '/\$this->version\s*=\s*\'[^\']+\';/',
    "\$this->version = '$version';",
    $mainFile
);
file_put_contents("$modulePath/$moduleName.php", $mainFile);

// Output directory
$outputDir = dirname($modulePath) . "/mprdigitalproducts/releases/$moduleName";
if (!is_dir($outputDir)) {
    mkdir($outputDir, 0755, true);
}

// Create ZIP
$zip = new ZipArchive();
$zipPath = "$outputDir/$moduleName-$version.zip";

if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($modulePath, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    $excludePatterns = [
        'node_modules', '.git', 'build_release.php', '_releases',
        '.mpr_license.json', 'yarn.lock', 'package-lock.json',
        'package.json', 'Gruntfile.js', 'gulpfile.js', '.env'
    ];

    foreach ($iterator as $file) {
        $filePath = $file->getRealPath();
        $relativePath = "$moduleName/" . substr($filePath, strlen($modulePath) + 1);

        // Skip excluded files
        $skip = false;
        foreach ($excludePatterns as $pattern) {
            if (strpos($relativePath, $pattern) !== false) {
                $skip = true;
                break;
            }
        }
        if ($skip) continue;

        $zip->addFile($filePath, $relativePath);
    }
    $zip->close();

    $hash = hash_file('sha256', $zipPath);
    $size = filesize($zipPath);

    echo "Created: $zipPath\n";
    echo "Hash: $hash\n";
    echo "Size: $size bytes\n";
    echo "\n--- SQL to insert release ---\n";
    echo "INSERT INTO ps_mprdigitalproducts_release
    (id_digital_product, version, file_path, file_hash, file_size, is_latest, active, date_add)
    VALUES (
        (SELECT id_digital_product FROM ps_mprdigitalproducts_product WHERE module_name = '$moduleName'),
        '$version',
        '$moduleName/$moduleName-$version.zip',
        '$hash',
        $size,
        1,
        1,
        NOW()
    );\n";
} else {
    die("Failed to create ZIP\n");
}

Ejecutar:

php modules/yourmodule/build_release.php 1.0.0

Paso 3: Registrar el producto en la base de datos

Crear la entrada del producto digital

INSERT INTO ps_mprdigitalproducts_product (
    id_product,          -- PrestaShop product ID (for shop integration)
    type,                -- 'module', 'theme', or 'addon'
    module_name,         -- Technical name (folder name)
    display_name,        -- Human-readable name
    current_version,     -- Latest version
    min_ps_version,      -- Minimum PrestaShop version
    max_ps_version,      -- Maximum PrestaShop version
    min_php_version,     -- Minimum PHP version
    support_months,      -- Support duration
    max_domains,         -- Domains per license
    active,
    orderable,
    date_add,
    date_upd
) VALUES (
    NULL,                -- Or link to PrestaShop product
    'module',
    'yourmodule',
    'Your Module Name',
    '1.0.0',
    '1.7.0.0',
    '8.99.99',
    '7.4',
    12,                  -- 12 months support
    1,                   -- 1 domain per license
    1,
    1,
    NOW(),
    NOW()
);

Crear la entrada de lanzamiento

INSERT INTO ps_mprdigitalproducts_release (
    id_digital_product,
    version,
    file_path,           -- Relative to releases/ directory
    file_hash,           -- SHA256 hash of ZIP
    file_size,           -- Size in bytes
    changelog,
    min_php_version,
    min_ps_version,
    max_ps_version,
    is_latest,           -- Set to 1 for latest version
    active,
    date_add
) VALUES (
    (SELECT id_digital_product FROM ps_mprdigitalproducts_product WHERE module_name = 'yourmodule'),
    '1.0.0',
    'yourmodule/yourmodule-1.0.0.zip',
    'abc123...64char_sha256_hash...',
    12345,
    '# Version 1.0.0\n\n- Initial release',
    '7.4',
    '1.7.0.0',
    '8.99.99',
    1,
    1,
    NOW()
);

Paso 4: Lanzar una nueva version

Al publicar una actualizacion:

1. Construir el nuevo ZIP

php modules/yourmodule/build_release.php 1.1.0

2. Actualizar los flags is_latest

-- Remove latest flag from old versions
UPDATE ps_mprdigitalproducts_release
SET is_latest = 0
WHERE id_digital_product = (
    SELECT id_digital_product FROM ps_mprdigitalproducts_product
    WHERE module_name = 'yourmodule'
);

-- Insert new release (with is_latest = 1)
INSERT INTO ps_mprdigitalproducts_release (...) VALUES (...);

-- Update product's current_version
UPDATE ps_mprdigitalproducts_product
SET current_version = '1.1.0', date_upd = NOW()
WHERE module_name = 'yourmodule';

Como funcionan los auto-updates

Flujo de actualizacion

  1. Verificar actualizaciones: El modulo llama a la API updates/check con el license key
  2. Obtener token de descarga: Si hay actualizacion disponible, llama a updates/download para obtener un token temporal
  3. Verificaciónes previas: Valida espacio en disco, permisos, disponibilidad de ZipArchive
  4. Backup: Crea un backup ZIP del modulo actual + dump SQL de las tablas del modulo
  5. Descarga y verificación: Descarga el ZIP, valida la estructura (verificación de hash omitida para archivos personalizados)
  6. Atomic Swap: Renombra el modulo actual a _old, mueve el nuevo modulo a su lugar
  7. Restauracion de licencia: Preserva .mpr_license.json de la instalación anterior
  8. Ejecución de upgrades: Ejecuta todos los scripts upgrade/upgrade-X.X.X.php
  9. Limpieza: Elimina archivos temporales y el directorio del modulo antiguo

Descargas personalizadas

Las descargas se personalizan con la configuración de licencia incorporada (.mpr_license.json), por lo que el hash del archivo sera diferente al original. El sistema omite la verificación del hash para archivos personalizados pero aun valida la estructura ZIP.

Rollback

Si la actualizacion falla en cualquier momento despues del atomic swap, el sistema restaura automáticamente el modulo respaldado.


Scripts de upgrade

Para migraciónes de base de datos entre versiones, crear scripts en upgrade/:

yourmodule/
└── upgrade/
    ├── upgrade-1.1.0.php
    └── upgrade-2.0.0.php

Formato del script:

<?php
function upgrade_module_1_1_0($module)
{
    // Run database migrations
    $sql = 'ALTER TABLE `' . _DB_PREFIX_ . 'yourmodule_data` ADD `new_field` VARCHAR(255)';
    return Db::getInstance()->execute($sql);
}

Referencia de la estructura de archivos

modules/mprdigitalproducts/
├── releases/                          # Release ZIPs organized by module
│   └── yourmodule/
│       ├── yourmodule-1.0.0.zip
│       ├── yourmodule-1.1.0.zip
│       └── yourmodule-2.0.0.zip
├── temp/                              # Temporary files during download personalization
├── uploads/                           # Customer uploads (tickets, etc.)
├── src/
│   └── Classes/
│       ├── MPRDigitalProductsProduct.php
│       ├── MPRDigitalProductsLicense.php
│       ├── MPRDigitalProductsRelease.php
│       ├── MPRDigitalProductsShop.php
│       ├── MPRDigitalProductsVariant.php
│       ├── MPRDigitalProductsNotify.php
│       ├── ... (20+ entity classes)
│       ├── Protection/
│       │   ├── UpdateChecker.php      # Copy to your modules
│       │   ├── IntegrityCore.php      # File integrity verification
│       │   └── Obfuscator.php         # Code protection
│       └── Services/
│           ├── DownloadService.php    # Handles watermarked downloads
│           ├── UpdateService.php      # Auto-update logic
│           ├── LicenseService.php     # License operations
│           ├── ValidationService.php  # Domain validation
│           ├── ReleasePackagerService.php
│           └── ... (10+ services)
├── controllers/
│   ├── admin/                         # 14 admin controllers
│   │   ├── AdminMPRDigitalProductsDashboardController.php
│   │   ├── AdminMPRDigitalProductsProductsController.php
│   │   ├── AdminMPRDigitalProductsLicensesController.php
│   │   └── ...
│   └── front/                         # 7 front controllers
│       ├── Api.php                    # License validation API
│       ├── Download.php               # Secure file downloads
│       ├── Portal.php                 # Customer license portal
│       ├── Subscription.php           # Support checkout
│       ├── Ticket.php                 # Support tickets
│       └── Webhook.php                # Stripe webhooks
├── views/
│   ├── css/
│   ├── js/
│   └── templates/
├── sql/
│   ├── install.php
│   └── uninstall.php
├── mprdigitalproducts.php             # Main module class
└── vendor/                            # Composer dependencies (Stripe, etc.)

Lista de verificación rápida de lanzamiento

  • Actualizar el número de version en el archivo PHP principal del modulo
  • Copiar la ultima version de UpdateChecker.php a la carpeta classes del modulo
  • Construir el ZIP de lanzamiento con la estructura correcta
  • Calcular el hash SHA256
  • Crear el directorio de lanzamiento: releases/{module_name}/
  • Colocar el ZIP en el directorio de lanzamiento
  • Insertar el registro de lanzamiento en la base de datos
  • Actualizar el flag is_latest (eliminar del antiguo, establecer en el nuevo)
  • Actualizar current_version en la tabla de productos
  • Probar la descarga desde el portal del cliente
  • Probar la auto-update desde el modulo instalado

v1.1.0 — 2026-02-01

  • Added PS 9.1 compatibility with updated virtual product handling
  • New download analytics dashboard showing downloads per product, customer, and time period
  • Added automatic download link expiration with configurable renewal workflow
  • Fixed download limit counter not decrementing for resumed downloads
  • Added digital product bundle support (multiple files per virtual product)
  • Improved download speed with chunked transfer and range request support

v1.0.4 — 2025-09-20

  • Added PS 9.0 compatibility
  • Fixed download links breaking when shop URL uses subfolder configuration
  • Added file integrity verification (SHA-256 checksum) shown to customer before download
  • Fixed concurrent download limit not enforcing across multiple browser sessions

v1.0.3 — 2025-05-12

  • Fixed download notification email not including order reference number
  • Added S3-compatible cloud storage support for digital product files
  • Fixed large file downloads (2GB+) timing out on shared hosting
  • Improved download token security with HMAC-based URL signing

v1.0.2 — 2024-12-08

  • Added PS 8.2 compatibility with new virtual product tab
  • Fixed download page not respecting shop-specific SSL configuration
  • Added customer download history page in My Account section
  • Fixed file access control allowing downloads from cancelled orders

v1.0.1 — 2024-08-22

  • Fixed download counter displaying incorrectly for multi-file products
  • Added watermark injection for PDF digital products with customer info
  • Fixed download manager JavaScript not loading on order confirmation page

v1.0.0 — 2024-05-20

  • Initial release with enhanced digital product delivery system
  • Configurable download limits per product and per customer
  • Time-limited download links with expiration management
  • Download progress tracking and resume support
  • Email notifications with secure download links
  • Support for PS 1.7.6+ and PS 8.x
0.0
0 opiniones
5 ★
0
4 ★
0
3 ★
0
2 ★
0
1 ★
0

¡Aún no hay opiniones. Sé el primero!

Escribir una opinión

Valora aspectos específicos (opcional)
Calidad
Relación calidad-precio
Estabilidad
Compatibilidad
Soporte
7 Implemented
7 solicitudes

License key generation and management

Implemented
Automatically generate unique license keys on purchase with configurable format, prefix, and character sets. Manage activation and revocation.
Sandra Müller Mar 10, 2025
Respuesta: Core feature since v1.0.0! Automatic generation on payment, configurable key format, pre-generated pools, per-product licensing rules, and full status management (activate/suspend/revoke/transfer).

Auto-update notifications for installed modules

Implemented
When a new version is available, show a notification in the customer's back office with a one-click update button.
Patrick O'Brien Apr 05, 2025
Respuesta: Available since v1.1.0! Modules check for updates daily and show a non-intrusive notification. One-click update with automatic backup and rollback on failure.

Customer domain registration with verification

Implemented
Customers should be able to register their domain against their license, with optional DNS/HTTP verification to prevent piracy.
Jacob Wilson May 18, 2025
Respuesta: Shipped in v1.2.0! Self-service domain registration, configurable domain limits per license, domain swap, DNS/HTTP verification, wildcard subdomain support, and environment tagging.

Version management with changelog display

Implemented
Upload new file versions and show a changelog to customers. They should always get the latest version and be able to rollback if needed.
Natasha Volkova Jul 22, 2025
Respuesta: Added in v1.4.0! Version management with version history, customer-facing changelog, automatic "latest version" download, download expiry, and download limits.

Demo download with watermark and time limit

Implemented
Let potential customers download a demo version of modules that expires after 14-30 days. Helps them evaluate before buying.
Lena Schneider Jun 18, 2025
Respuesta: Shipped in v1.3.0! Configurable demo period, personalized watermarks for piracy tracking, and email/domain deduplication.

REST API for license validation

Implemented
A public API endpoint that our module can call to check if a license is valid, what domains are registered, and when it expires.
Paul Eriksen Apr 20, 2025
Respuesta: Core feature! POST /api/license/validate returns license status, product info, expiry, registered domains, and metadata. API key auth with rate limiting.

Subscription renewals with reminder emails

Implemented
Support annual subscriptions with automated renewal reminder emails at 30, 7, and 1 day before expiry. Discounted renewal pricing for existing customers.
Marie-Claire Dubois Sep 08, 2025
Respuesta: Done in v1.5.0! Annual/monthly subscriptions, configurable renewal reminders, grace period, discounted renewal pricing, and upgrade paths.
2 abierto 10 resuelto
Reportar un problema
The download link expiration check uses server time while the link generation uses shop time. On servers where PHP timezone differs from shop timezone, links can expire before the customer clicks them. Unified time source to use Configuration::get('PS_TIMEZONE'). Fixed in v1.0.0 — commit d4e8c12
Downloaded PDF files are corrupted (0 bytes or HTML prepended) when PHP output buffering is enabled by another module or the server configuration. Added ob_end_clean() before sending the file stream. Fixed in v1.0.0 — commit 7b3a9e5
Download links remain active even after the order is cancelled or refunded. The link validity only checks expiration date, not order status. Added order status validation to the download controller. Fixed in v1.0.0 — commit a2c5f84
Uploading digital product files larger than 64MB fails silently — the admin interface shows success but no file is saved. The issue is PHP's default upload_max_filesize. Added a preflight check that validates PHP settings and shows an admin warning if limits are too low. Fixed in v1.0.0 — commit c8d4e71
When a customer resumes a partial download (HTTP Range request), the download counter increments again, eventually hitting the download limit. Changed to only increment on the first byte range (Range: bytes=0-). Fixed in v1.0.0 — commit 5e9b3a2
On stores using 'Set order status to Delivered for virtual products' option, the status update fails because the module's hook fires before the core's virtual product check. Changed hook priority to ensure it runs after core processing. Fixed in v1.0.0 — commit 8f1c7d4
The rich text editor for release notes strips HTML on save, converting formatted text to plain text. The AdminController was using strip_tags in the validation step. Changed to use the HTML purifier instead. Fixed in v1.0.0 — commit 3a7e2b9
When creating a ZIP archive of multiple digital files, files with Unicode characters in their names (e.g., 'présentation.pdf') are silently skipped. The ZipArchive class needs the ENC_UTF_8 flag. Added Unicode handling. Fixed in v1.0.0 — commit e7c1d58
Pre-signed S3 URLs default to 15-minute expiration. For large files (>2GB) on slower connections, the download times out. Made the expiration configurable with a default of 2 hours. Fixed in v1.0.0 — commit b5a8f23
Guest customers receive a download link pointing to the customer account page, which they can't access. The link should point to the guest order tracking page with the download attached. Fixed the email template logic. Fixed in v1.0.0 — commit 4d2e9c7
Adding a new file to a product that already has version 3.2 resets the version counter to 1.0 instead of auto-incrementing to 3.3. The version field was being reset during form submission. Now reads the latest version and increments.
When uploading 3 files at once via the admin drag-and-drop interface, only the last file is saved. The async upload handler uses the same temporary filename for all concurrent uploads. Added UUID-based temp filenames.
Ver todos los problemas conocidos
30 días de devolución
Devolución fácil - sin preguntas
Módulos Plug & Play
Instalar, configurar y beneficiarse
Soporte ante todo
Prioridad en ayuda y satisfacción

Más de esta categoría

  • Nuevo
Almacén Revolution
299,00 €
Cargando...
Volver arriba