Rivoluzione Digitale

Vendi prodotti digitali — chiavi di licenza + registrazione dominio + download sicuri

Price: 299,00 €
Tax excluded

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.
Product availability: Download immediato dopo l'acquisto
Share
Totale opzioni: 0.00 €
6 visualizzato

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

Perché questo modulo è unico?

  • 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).

Casi d'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.
  • Reference
    mprdigitalrevolution
  • In stock
    4 Items
  • Compatibilità PrestaShop
    PS 1.7 – 9.x
  • Modello di prezzo
    Acquisto singolo
  • Tipo di modulo
    Front & Back-office
  • Rilevante per GDPR
    No
  • Obiettivo di business
    Ottimizzare le operazioni
  • Account esterno necessario
    No
  • Complessità del modulo
    Soluzione completa
  • Fase del percorso cliente
    Gestire il negozio
  • Funziona con piattaforma
    Nessuna piattaforma esterna

MPR Digital Products

Un modulo PrestaShop per la vendita e la distribuzione di prodotti digitali (moduli, temi, addon) con gestione delle licenze, associazione dei domini, download personalizzati con filigrana e aggiornamenti automatici con un clic.

Funzionalità

Gestione delle licenze

  • Tipi di licenza: Licenze perpetue, in abbonamento o di prova
  • Associazione dominio: Limitare le installazioni per licenza (es. 1 dominio per licenza)
  • Rilevamento domini dev: localhost, staging e domini dev non vengono conteggiati nei limiti
  • Monitoraggio stato licenza: Stati attivo, sospeso, scaduto, revocato
  • Periodo di grazia: Periodo di grazia configurabile per validazioni fallite (predefinito: 7 giorni)

Distribuzione dei prodotti

  • Gestione delle versioni: Tracciare le release con numeri di versione, changelog e informazioni di compatibilità
  • Supporto branch: Branch stable, beta, dev, legacy per prodotto
  • Download personalizzati: Ogni download e contrassegnato con informazioni sulla licenza per il tracciamento della pirateria
  • Token sicuri: Token di download a tempo limitato impediscono la condivisione non autorizzata

Portale clienti

  • Le mie licenze: I clienti visualizzano e gestiscono le proprie licenze su /licenses
  • Registrazione dominio: Registrare domini direttamente dal portale
  • Cronologia download: Tracciare tutti i download per licenza
  • Stato del supporto: Visualizzare la scadenza del supporto e le opzioni di rinnovo

Sistema di auto-update

  • Aggiornamenti con un clic: I moduli possono verificare e installare automaticamente gli aggiornamenti
  • Controlli preliminari: Valida spazio su disco, permessi ed estensioni PHP prima dell'aggiornamento
  • Atomic Swap: Il vecchio modulo viene salvato prima dell'installazione della nuova versione
  • Supporto rollback: Ripristino automatico in caso di aggiornamento fallito
  • Script di upgrade: Eseguire migrazioni del database tra le versioni

Pre-ordine / Prossimamente

  • Prodotti non ordinabili: Contrassegnare i prodotti come "prossimamente" con data di rilascio prevista
  • Notifiche di rilascio: I clienti possono iscriversi per essere notificati quando il prodotto e disponibile
  • Avvisi nel carrello: Visualizzare informazioni quando prodotti non ordinabili sono nel carrello

Sistema di prezzi

  • Periodi di licenza: Offrire diverse durate di licenza (1 mese, 1 anno, a vita, ecc.)
  • Periodi di supporto: Prezzi separati per la durata del supporto
  • Varianti di prodotto: Combinare licenza + supporto + servizi in pacchetti
  • Prezzi dinamici: Prezzi specifici per carrello tramite il sistema SpecificPrice di PrestaShop

Servizi e componenti aggiuntivi

  • Servizi in bundle: Installazione, personalizzazione, supporto prioritàrio
  • Prezzi per servizio: Ogni servizio ha il proprio prezzo aggiunto al totale

Abbonamenti supporto (Stripe)

  • Pagamenti ricorrenti: Integrazione Stripe per la fatturazione in abbonamento
  • Estensioni del supporto: I clienti possono estendere il supporto dopo la scadenza
  • Limite massimo supporto: Limite per prodotto su quanto in anticipo si puo acquistare il supporto (es. max 3 anni)
  • Gestione webhook: Aggiornamenti automatici dello stato da Stripe

Analisi e registrazione

  • Log dei download: Tracciare ogni download con IP, user agent, ID filigrana
  • Log API: Tutte le richieste di validazione licenza vengono registrate
  • Cronologia validazione negozio: Tracciare i tentativi di validazione del dominio e i risultati

Installazione

  1. Caricare la cartella mprdigitalproducts in /modules/
  2. Install from PrestaShop back office → Modules
  3. Configurare le chiavi API Stripe nelle Impostazioni (per il supporto in abbonamento)
  4. Svuotare la cache di PrestaShop

Requisiti

  • PrestaShop 1.7.0 - 8.x
  • PHP 7.4+
  • Estensione ZipArchive (per i download)

Struttura del Back Office

Il modulo aggiunge un menu Digital Products sotto VENDITE 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

Tabelle del database

Tabella Scopo
mprdigitalproducts_product Catalogo prodotti digitali
mprdigitalproducts_release Release delle versioni con informazioni sui file
mprdigitalproducts_license Licenze dei clienti
mprdigitalproducts_shop Domini/installazioni registrati
mprdigitalproducts_license_shop Associazioni licenza-dominio
mprdigitalproducts_download_token Token di download temporanei
mprdigitalproducts_download_log Cronologia dei download
mprdigitalproducts_support_plan Piani di abbonamento supporto
mprdigitalproducts_support_subscription Abbonamenti attivi
mprdigitalproducts_support_payment Pagamenti degli abbonamenti
mprdigitalproducts_validation_log Richieste di validazione API
mprdigitalproducts_shop_validation_log Cronologia validazione negozio
mprdigitalproducts_variant Pacchetti varianti prodotto
mprdigitalproducts_license_price Prezzi per periodo di licenza
mprdigitalproducts_support_price Prezzi per periodo di supporto
mprdigitalproducts_service Servizi aggiuntivi
mprdigitalproducts_cart_variant Selezioni varianti nel carrello
mprdigitalproducts_notify Iscritti alle notifiche di rilascio
mprdigitalproducts_banned_domain Domini nella lista nera
mprdigitalproducts_rate_limit Limitazione della velocità API

Endpoint API

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

Validazione licenza

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

Verifica aggiornamenti

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

Ottenere un token di download

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

Scaricare il file

GET /download/{token}

Opzioni di configurazione

Impostazione Descrizione Predefinito
module_enabled Attivare/disattivare il modulo true
api_rate_limit Richieste all'ora 100
default_support_months Supporto gratuito incluso 3
default_max_domains Domini per licenza 1
allow_domain_change Consentire la riassegnazione del dominio true
dev_domains_free I domini dev non contano true
grace_period_days Periodo di grazia per validazioni fallite 7
watermark_downloads Incorporare informazioni licenza nei download true
stripe_mode test o live test

Impostazioni per prodotto

Campo Descrizione Predefinito
support_months Supporto gratuito incluso con l'acquisto 3
max_support_months Mesi massimi di supporto acquistabili (-1 = illimitato) 36
max_domains Domini consentiti per licenza 1

Hook utilizzati

Hook Scopo
displayBackOfficeHeader Caricare CSS/JS admin
actionAdminControllerSetMedia Asset admin
displayCustomerAccount Link "Le mie licenze" nell'account cliente
actionValidateOrder Generare la licenza al completamento dell'ordine
actionOrderStatusPostUpdate Gestire i cambiamenti di stato dell'ordine
moduleRoutes Registrare URL amichevoli
actionFrontControllerSetMedia Caricare CSS/JS front
displayProductAdditionalInfo Selezione variante nella pagina prodotto
actionCartUpdateQuantityBefore Salvare la variante quando si aggiunge al carrello
displayShoppingCartFooter Avvisi per prodotti non ordinabili
actionMPRCheckoutValidateOrder Bloccare il checkout per articoli non ordinabili

Funzionalità previste / TODO

  • Integrazione del sistema di ticket (ticket di supporto per licenza)
  • Supporto multi-valuta per i prezzi delle licenze
  • Generazione di licenze in massa per i rivenditori
  • Trasferimento di licenze tra clienti
  • Dashboard di analisi dell'utilizzo
  • Notifiche webhook per eventi di licenza
  • Integrazione con il marketplace PrestaShop Addons

Workflow di rilascio del modulo

Questa sezione illustra i passaggi pratici per rilasciare un nuovo modulo tramite il sistema MPR Digital Products.

Prerequisiti

  • Codice sorgente del modulo pronto per la distribuzione
  • Accesso al back office MPR Digital Products
  • Accesso al database per la gestione delle release

Passo 1: Preparare il modulo

File richiesti

Il modulo deve includere la classe UpdateChecker.php per il supporto auto-update:

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

Copiare UpdateChecker

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

Integrare l'Update Checker nel modulo

Aggiungere al metodo getContent() del 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()));
}

Passo 2: Creare il ZIP di rilascio

Struttura delle directory

I ZIP di rilascio sono archiviati in:

modules/mprdigitalproducts/releases/{module_name}/

Requisiti della struttura ZIP

Il ZIP deve contenere il modulo in una cartella corrispondente al nome del modulo:

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

Esempio di script di build

Creare build_release.php nel 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");
}

Eseguire:

php modules/yourmodule/build_release.php 1.0.0

Passo 3: Registrare il prodotto nel database

Creare la voce del prodotto digitale

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()
);

Creare la voce di rilascio

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()
);

Passo 4: Rilasciare una nuova versione

Quando si rilascia un aggiornamento:

1. Costruire il nuovo ZIP

php modules/yourmodule/build_release.php 1.1.0

2. Aggiornare i flag 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';

Come funzionano gli auto-updates

Flusso di aggiornamento

  1. Verifica aggiornamenti: Il modulo chiama l'API updates/check con il license key
  2. Ottenimento del token di download: Se disponibile un aggiornamento, chiama updates/download per ottenere un token temporaneo
  3. Controlli preliminari: Valida spazio su disco, permessi, disponibilita di ZipArchive
  4. Backup: Crea un backup ZIP del modulo corrente + dump SQL delle tabelle del modulo
  5. Download e verifica: Scarica il ZIP, valida la struttura (verifica hash ignorata per file personalizzati)
  6. Atomic Swap: Rinomina il modulo corrente in _old, sposta il nuovo modulo al suo posto
  7. Ripristino della licenza: Preserva .mpr_license.json dall'installazione precedente
  8. Esecuzione degli upgrade: Esegue tutti gli script upgrade/upgrade-X.X.X.php
  9. Pulizia: Rimuove i file temporanei e la vecchia directory del modulo

Download personalizzati

I download sono personalizzati con la configurazione della licenza incorporata (.mpr_license.json), quindi l'hash del file sara diverso dall'originale. Il sistema salta la verifica dell'hash per i file personalizzati ma valida comunque la struttura ZIP.

Rollback

Se l'aggiornamento fallisce in qualsiasi momento dopo l'atomic swap, il sistema ripristina automaticamente il modulo salvato.


Script di upgrade

Per le migrazioni del database tra le versioni, creare script in upgrade/:

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

Formato dello 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);
}

Riferimento alla struttura dei file

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.)

Checklist rapida di rilascio

  • Aggiornare il numero di versione nel file PHP principale del modulo
  • Copiare l'ultima versione di UpdateChecker.php nella cartella classes del modulo
  • Costruire il ZIP di rilascio con la struttura corretta
  • Calcolare l'hash SHA256
  • Creare la directory di rilascio: releases/{module_name}/
  • Posizionare il ZIP nella directory di rilascio
  • Inserire il record di rilascio nel database
  • Aggiornare il flag is_latest (rimuovere dal vecchio, impostare sul nuovo)
  • Aggiornare current_version nella tabella prodotti
  • Testare il download dal portale clienti
  • Testare l'auto-update dal modulo installato

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 recensioni
5 ★
0
4 ★
0
3 ★
0
2 ★
0
1 ★
0

Ancora nessuna recensione. Sii il primo!

Scrivi una recensione

Valuta aspetti specifici (facoltativo)
Qualità
Rapporto qualità-prezzo
Stabilità
Compatibilità
Supporto
7 Implemented
7 richieste

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
Risposta: 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
Risposta: 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
Risposta: 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
Risposta: 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
Risposta: 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
Risposta: 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
Risposta: Done in v1.5.0! Annual/monthly subscriptions, configurable renewal reminders, grace period, discounted renewal pricing, and upgrade paths.
2 aperto 10 risolto
Segnala 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.
Vedi tutti i problemi noti
Reso entro 30 giorni
Reso semplice - senza domande
Moduli Plug & Play
Installa, configura e guadagna
Supporto al primo posto
Priorità ad aiuto e soddisfazione

Altro da questa categoria

Loading...
Back to top