Révolution Digitale

Vendez des produits numériques — clés de licence + enregistrement de domaine + téléchargements sécurisés

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: Téléchargement immédiat après achat
Share
Total des options : 0.00 €
6 consulté

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

Pourquoi ce module est-il unique ?

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

Cas d'utilisation

  • 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
  • Modèle tarifaire
    Achat unique
  • Type de module
    Front & Back-office
  • Concerne le RGPD
    Non
  • Objectif commercial
    Optimiser les opérations
  • Compte externe requis
    Non
  • Complexité du module
    Solution complète
  • Étape du parcours client
    Gérer la boutique
  • Compatible avec la plateforme
    Aucune plateforme externe

MPR Digital Products

Un module PrestaShop pour la vente et la distribution de produits numériques (modules, themes, addons) avec gestion des licences, liaison de domaines, telechargements personnalisés avec filigrane et mises a jour automatiques en un clic.

Fonctionnalités

Gestion des licences

  • Types de licence: Licences perpetuelles, par abonnement ou d'essai
  • Liaison de domaine: Limiter les installations par licence (ex: 1 domaine par licence)
  • Detection des domaines dev: localhost, staging et domaines dev ne comptent pas dans les limites
  • Suivi du statut de licence: États actif, suspendu, expire, revoque
  • Periode de grace: Periode de grace configurable pour les validations echouees (par défaut: 7 jours)

Distribution des produits

  • Gestion des versions: Suivre les releases avec numéros de version, changelogs et informations de compatibilité
  • Support des branches: Branches stable, beta, dev, legacy par produit
  • Telechargements personnalisés: Chaque telechargement est marque avec les informations de licence pour le suivi du piratage
  • Tokens securises: Les tokens de telechargement a duree limitee empechent le partage non autorise

Portail client

  • Mes licences: Les clients visualisent et gerent leurs licences sur /licenses
  • Enregistrement de domaine: Enregistrer des domaines directement depuis le portail
  • Historique des telechargements: Suivre tous les telechargements par licence
  • Statut du support: Voir l'expiration du support et les options de renouvellement

Système d'auto-update

  • Mises a jour en un clic: Les modules peuvent vérifier et installer automatiquement les mises a jour
  • Verifications pre-vol: Valide l'espace disque, les permissions et les extensions PHP avant la mise a jour
  • Atomic Swap: L'ancien module est sauvegarde avant l'installation de la nouvelle version
  • Support de rollback: Restauration automatique en cas d'echec de la mise a jour
  • Scripts d'upgrade: Exécutér les migrations de base de données entre les versions

Pre-commande / Bientot disponible

  • Produits non commandables: Marquer les produits comme "bientot disponible" avec une date de sortie prevue
  • Notifications de release: Les clients peuvent s'abonner pour etre notifies a la sortie du produit
  • Avertissements panier: Afficher des informations quand des produits non commandables sont dans le panier

Système de tarification

  • Periodes de licence: Proposer différentes durees de licence (1 mois, 1 an, a vie, etc.)
  • Periodes de support: Tarification separee pour la duree du support
  • Variantes de produit: Combiner licence + support + services en packages
  • Tarification dynamique: Prix spécifiques au panier via le système SpecificPrice de PrestaShop

Services & Add-ons

  • Services groupes: Installation, personnalisation, support prioritaire
  • Tarification par service: Chaque service a son propre prix ajoute au total

Abonnements support (Stripe)

  • Paiements recurrents: Intégration Stripe pour la facturation par abonnement
  • Extensions de support: Les clients peuvent prolonger le support apres expiration
  • Plafond de support maximum: Limite par produit sur la duree maximale d'achat de support (ex: max 3 ans)
  • Gestion des webhooks: Mises a jour automatiques du statut depuis Stripe

Analyses & Journalisation

  • Logs de telechargement: Suivre chaque telechargement avec IP, user agent, ID de filigrane
  • Logs API: Toutes les requêtes de validation de licence sont enregistrees
  • Historique de validation de boutique: Suivre les tentatives de validation de domaine et les resultats

Installation

  1. Telecharger le dossier mprdigitalproducts dans /modules/
  2. Install from PrestaShop back office → Modules
  3. Configurer les cles API Stripe dans les paramètres (pour le support par abonnement)
  4. Vider le cache PrestaShop

Pre-requis

  • PrestaShop 1.7.0 - 8.x
  • PHP 7.4+
  • Extension ZipArchive (pour les telechargements)

Structure du Back Office

Le module ajoute un menu Digital Products sous VENDRE avec:

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

Tables de base de données

Table Objectif
mprdigitalproducts_product Catalogue de produits numériques
mprdigitalproducts_release Releases de versions avec informations de fichier
mprdigitalproducts_license Licences clients
mprdigitalproducts_shop Domaines/installations enregistres
mprdigitalproducts_license_shop Liaisons licence-domaine
mprdigitalproducts_download_token Tokens de telechargement temporaires
mprdigitalproducts_download_log Historique des telechargements
mprdigitalproducts_support_plan Plans d'abonnement support
mprdigitalproducts_support_subscription Abonnements actifs
mprdigitalproducts_support_payment Paiements d'abonnement
mprdigitalproducts_validation_log Requêtes de validation API
mprdigitalproducts_shop_validation_log Historique de validation de boutique
mprdigitalproducts_variant Packages de variantes de produit
mprdigitalproducts_license_price Tarification par periode de licence
mprdigitalproducts_support_price Tarification par periode de support
mprdigitalproducts_service Services complementaires
mprdigitalproducts_cart_variant Sélections de variantes dans le panier
mprdigitalproducts_notify Abonnes aux notifications de release
mprdigitalproducts_banned_domain Domaines sur liste noire
mprdigitalproducts_rate_limit Limitation du debit API

Points d'acces API

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

Validation de licence

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

Vérifier les mises a jour

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

Obtenir un token de telechargement

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

Telecharger un fichier

GET /download/{token}

Options de configuration

Paramètre Description Défaut
module_enabled Activer/désactiver le module true
api_rate_limit Requêtes par heure 100
default_support_months Support gratuit inclus 3
default_max_domains Domaines par licence 1
allow_domain_change Autoriser la reassignation de domaine true
dev_domains_free Les domaines dev ne comptent pas true
grace_period_days Periode de grace pour les validations echouees 7
watermark_downloads Intégrér les informations de licence dans les telechargements true
stripe_mode test ou live test

Paramètres par produit

Champ Description Défaut
support_months Support gratuit inclus avec l'achat 3
max_support_months Mois de support maximum achetables (-1 = illimite) 36
max_domains Domaines autorises par licence 1

Hooks utilises

Hook Objectif
displayBackOfficeHeader Charger CSS/JS admin
actionAdminControllerSetMedia Assets admin
displayCustomerAccount Lien "Mes licences" dans le compte client
actionValidateOrder Générer la licence a la validation de commande
actionOrderStatusPostUpdate Gérer les changements de statut de commande
moduleRoutes Enregistrer les URLs conviviales
actionFrontControllerSetMedia Charger CSS/JS front
displayProductAdditionalInfo Sélection de variante sur la page produit
actionCartUpdateQuantityBefore Sauvegarder la variante lors de l'ajout au panier
displayShoppingCartFooter Avertissements pour les produits non commandables
actionMPRCheckoutValidateOrder Bloquer le checkout pour les articles non commandables

Fonctionnalités prevues / TODO

  • Intégration d'un système de tickets (tickets de support par licence)
  • Support multi-devises pour les prix de licence
  • Generation de licences en masse pour les revendeurs
  • Transfert de licence entre clients
  • Tableau de bord d'analyse d'utilisation
  • Notifications webhook pour les événements de licence
  • Intégration avec le marketplace PrestaShop Addons

Workflow de release de module

Cette section couvre les étapes pratiques pour publier un nouveau module via le système MPR Digital Products.

Pre-requis

  • Code source du module pret pour la distribution
  • Acces au back office MPR Digital Products
  • Acces a la base de données pour la gestion des releases

Étape 1: Preparer votre module

Fichiers requis

Votre module doit inclure la classe UpdateChecker.php pour le support d'auto-update:

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

Copier UpdateChecker

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

Intégrér l'Update Checker dans le module

Ajoutez a la méthode getContent() de votre module:

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

Étape 2: Créer le ZIP de release

Structure des répertoires

Les ZIPs de release sont stockes dans:

modules/mprdigitalproducts/releases/{module_name}/

Exigences de structure ZIP

Le ZIP doit contenir le module dans un dossier correspondant au nom du module:

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

Exemple de script de build

Créez build_release.php dans votre module:

<?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");
}

Exécutér:

php modules/yourmodule/build_release.php 1.0.0

Étape 3: Enregistrer le produit dans la base de données

Créer l'entrée du produit numerique

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

Créer l'entrée de release

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

Étape 4: Publier une nouvelle version

Lors de la publication d'une mise a jour:

1. Construire le nouveau ZIP

php modules/yourmodule/build_release.php 1.1.0

2. Mettre a jour les 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';

Fonctionnement des auto-updates

Deroulement de la mise a jour

  1. Verification des mises a jour: Le module appelle l'API updates/check avec le license key
  2. Obtention du token de telechargement: Si une mise a jour est disponible, appelle updates/download pour obtenir un token temporaire
  3. Verifications pre-vol: Valide l'espace disque, les permissions, la disponibilité de ZipArchive
  4. Backup: Cree un backup ZIP du module actuel + dump SQL des tables du module
  5. Telechargement & verification: Telecharge le ZIP, valide la structure (verification du hash ignoree pour les fichiers personnalisés)
  6. Atomic Swap: Renomme le module actuel en _old, deplace le nouveau module en place
  7. Restauration de la licence: Preserve .mpr_license.json de l'installation precedente
  8. Execution des upgrades: Exécuté tous les scripts upgrade/upgrade-X.X.X.php
  9. Nettoyage: Supprime les fichiers temporaires et l'ancien répertoire du module

Telechargements personnalisés

Les telechargements sont personnalisés avec la configuration de licence intégrée (.mpr_license.json), donc le hash du fichier differera de l'original. Le système ignore la verification du hash pour les fichiers personnalisés mais valide toujours la structure ZIP.

Rollback

Si la mise a jour echoue a tout moment apres l'atomic swap, le système restaure automatiquement le module sauvegarde.


Scripts d'upgrade

Pour les migrations de base de données entre versions, créez des scripts dans upgrade/:

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

Format du 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()->exécuté($sql);
}

Référence de la structure des fichiers

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 de release rapide

  • Mettre a jour le numéro de version dans le fichier PHP principal du module
  • Copier la dernière version de UpdateChecker.php dans le dossier classes du module
  • Construire le ZIP de release avec la structure correcte
  • Calculer le hash SHA256
  • Créer le répertoire de release: releases/{module_name}/
  • Placer le ZIP dans le répertoire de release
  • Inserer l'enregistrement de release dans la base de données
  • Mettre a jour le flag is_latest (supprimer de l'ancien, definir sur le nouveau)
  • Mettre a jour current_version dans la table produit
  • Tester le telechargement depuis le portail client
  • Tester l'auto-update depuis le module installe

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 résuméd 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 conçurrent download limit not enforcing across multiple browser sessions

v1.0.3 — 2025-05-12

  • Fixed download notification email not including order référence 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 résumé support
  • Email notifications with secure download links
  • Support for PS 1.7.6+ and PS 8.x
0.0
0 avis
5 ★
0
4 ★
0
3 ★
0
2 ★
0
1 ★
0

Aucun avis pour le moment. Soyez le premier à donner le vôtre !

Écrire un avis

Évaluez des aspects spécifiques (optionnel)
Qualité
Rapport qualité-prix
Stabilité
Compatibilité
Support
7 Implemented
7 demandes

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
Réponse: 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
Réponse: 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
Réponse: 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
Réponse: 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
Réponse: 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
Réponse: 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
Réponse: Done in v1.5.0! Annual/monthly subscriptions, configurable renewal reminders, grace period, discounted renewal pricing, and upgrade paths.
2 ouvert 10 résolu
Signaler un problème
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.
Voir tous les problèmes connus
Retour sous 30 jours
Retour simple - sans questions
Modules Plug & Play
Installer, configurer et profiter
Support en priorité
Aide et satisfaction avant tout

Plus de cette catégorie

Loading...
Back to top