Digitale Revolution

Digitale Produkte verkaufen — Lizenzschlüssel + Domainregistrierung + sichere Downloads

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: Sofortiger Download nach dem Kauf
Share
Optionen gesamt: 0.00 €
6 angesehen

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 reqüsting 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

Warum ist dieses Modul einzigartig?

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

Anwendungsfälle

  • 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
  • PrestaShop-Kompatibilität
    PS 1.7 – 9.x
  • Preismodell
    Einmalkauf
  • Modultyp
    Front & Back-office
  • DSGVO-relevant
    Nein
  • Geschäftsziel
    Abläufe optimieren
  • Externes Konto erforderlich
    Nein
  • Modul-Komplexität
    Komplettlösung
  • Phase der Customer Journey
    Shop verwalten
  • Funktioniert mit Plattform
    Keine externe Plattform

MPR Digital Products

Ein PrestaShop-Modul für den Verkauf und die Verteilung digitaler Produkte (Module, Themes, Addons) mit Lizenzverwaltung, Domain-Binding, personalisierten Downloads mit Wasserzeichen und Auto-Updates per Mausklick.

Funktionen

Lizenzverwaltung

  • Lizenztypen: Unbefristete Lizenzen, Abonnement- oder Testlizenzen
  • Domain-Binding: Installationen pro Lizenz begrenzen (z.B. 1 Domain pro Lizenz)
  • Dev-Domain-Erkennung: localhost, Staging- und Dev-Domains werden nicht mitgezaehlt
  • Lizenzstatus-Verfolgung: Aktiv, gesperrt, abgelaufen, widerrufen
  • Karenzzeit: Konfigurierbare Karenzzeit für fehlgeschlagene Validierungen (Standard: 7 Tage)

Produktverteilung

  • Versionsverwaltung: Releases mit Versionsnummern, Changelogs und Kompatibilitätsinformationen verfolgen
  • Branch-Unterstützung: stable, beta, dev, legacy Branches pro Produkt
  • Personalisierte Downloads: Jeder Download wird mit Lizenzinformationen als Wasserzeichen versehen zur Piraterie-Verfolgung
  • Sichere Tokens: Zeitlich begrenzte Download-Tokens verhindern unbefugtes Teilen

Kundenportal

  • Meine Lizenzen: Kunden können ihre Lizenzen unter /licenses einsehen und verwalten
  • Domain-Registrierung: Domains direkt über das Portal registrieren
  • Download-Verlauf: Alle Downloads pro Lizenz verfolgen
  • Support-Status: Ablauf des Supports und Verlängerungsoptionen einsehen

Auto-Update-System

  • Updates per Mausklick: Module können automatisch nach Updates suchen und diese installieren
  • Pre-flight-Prüfungen: Validiert Speicherplatz, Berechtigungen und PHP-Erweiterungen vor dem Update
  • Atomic Swap: Altes Modul wird gesichert, bevor die neue Version installiert wird
  • Rollback-Unterstützung: Automatische Wiederherstellung bei fehlgeschlagenem Update
  • Upgrade-Scripts: Datenbank-Migrationen zwischen Versionen ausführen

Vorbestellung / Demnaechst verfügbar

  • Nicht bestellbare Produkte: Produkte als "demnaechst verfügbar" markieren mit erwartetem Erscheinungsdatum
  • Release-Benachrichtigungen: Kunden können sich benachrichtigen lassen, wenn ein Produkt veröffentlicht wird
  • Warenkorb-Warnungen: Informationen anzeigen, wenn nicht bestellbare Produkte im Warenkorb sind

Preissystem

  • Lizenzlaufzeiten: Verschiedene Lizenzlaufzeiten anbieten (1 Monat, 1 Jahr, unbefristet usw.)
  • Support-Zeiträume: Separate Preisgestaltung für die Support-Dauer
  • Produktvarianten: Lizenz + Support + Dienstleistungen zu Paketen kombinieren
  • Dynamische Preisgestaltung: Warenkorbspezifische Preise über PrestaShops SpecificPrice-System

Dienstleistungen & Add-ons

  • Gebundelte Dienstleistungen: Installation, Anpassung, Prioritäts-Support
  • Einzelpreise pro Dienstleistung: Jede Dienstleistung hat einen eigenen Preis, der zum Gesamtbetrag hinzugefügt wird

Support-Abonnements (Stripe)

  • Wiederkehrende Zahlungen: Stripe-Integration für Abonnement-Abrechnung
  • Support-Verlängerungen: Kunden können den Support nach Ablauf verlängern
  • Maximale Support-Obergrenze: Pro-Produkt-Limit, wie weit im Voraus Support erworben werden kann (z.B. max. 3 Jahre)
  • Webhook-Verarbeitung: Automatische Statusaktualisierungen von Stripe

Analysen & Protokollierung

  • Download-Logs: Jeden Download mit IP, User Agent, Wasserzeichen-ID verfolgen
  • API-Logs: Alle Lizenzvalidierungsanfragen werden protokolliert
  • Shop-Validierungsverlauf: Domain-Validierungsversuche und Ergebnisse verfolgen

Installation

  1. Ordner mprdigitalproducts nach /modules/ hochladen
  2. Install from PrestaShop back office → Modules
  3. Stripe API-Schlüssel in den Einstellungen konfigurieren (für Support-Abonnements)
  4. PrestaShop Cache leeren

Voraussetzungen

  • PrestaShop 1.7.0 - 8.x
  • PHP 7.4+
  • ZipArchive-Erweiterung (für Downloads)

Back-Office-Struktur

Das Modul fügt ein Digital Products-Menue unter VERKAUF hinzu mit:

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

Datenbanktabellen

Tabelle Zweck
mprdigitalproducts_product Katalog digitaler Produkte
mprdigitalproducts_release Versions-Releases mit Dateiinformationen
mprdigitalproducts_license Kundenlizenzen
mprdigitalproducts_shop Registrierte Domains/Installationen
mprdigitalproducts_license_shop Lizenz-Domain-Zuordnungen
mprdigitalproducts_download_token Temporäre Download-Tokens
mprdigitalproducts_download_log Download-Verlauf
mprdigitalproducts_support_plan Support-Abonnement-Plaene
mprdigitalproducts_support_subscription Aktive Abonnements
mprdigitalproducts_support_payment Abonnement-Zahlungen
mprdigitalproducts_validation_log API-Validierungsanfragen
mprdigitalproducts_shop_validation_log Shop-Validierungsverlauf
mprdigitalproducts_variant Produktvarianten-Pakete
mprdigitalproducts_license_price Lizenzlaufzeit-Preise
mprdigitalproducts_support_price Support-Zeitraum-Preise
mprdigitalproducts_service Zusatzdienstleistungen
mprdigitalproducts_cart_variant Warenkorb-Variantenauswahl
mprdigitalproducts_notify Release-Benachrichtigungs-Abonnenten
mprdigitalproducts_banned_domain Gesperrte Domains
mprdigitalproducts_rate_limit API-Rate-Limiting

API-Endpunkte

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

Lizenzvalidierung

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

Nach Updates suchen

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

Download-Token erhalten

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

Datei herunterladen

GET /download/{token}

Konfigurationsoptionen

Einstellung Beschreibung Standard
module_enabled Modul aktivieren/deaktivieren true
api_rate_limit Anfragen pro Stunde 100
default_support_months Inkludierter kostenloser Support 3
default_max_domains Domains pro Lizenz 1
allow_domain_change Domain-Neuzuweisung erlauben true
dev_domains_free Dev-Domains zaehlen nicht true
grace_period_days Karenzzeit für fehlgeschlagene Validierungen 7
watermark_downloads Lizenzinformationen in Downloads einbetten true
stripe_mode test oder live test

Produktspezifische Einstellungen

Feld Beschreibung Standard
support_months Kostenloser Support beim Kauf inklusive 3
max_support_months Maximal erwerbbare Support-Monate (-1 = unbegrenzt) 36
max_domains Erlaubte Domains pro Lizenz 1

Verwendete Hooks

Hook Zweck
displayBackOfficeHeader Admin-CSS/JS laden
actionAdminControllerSetMedia Admin-Assets
displayCustomerAccount "Meine Lizenzen"-Link im Kundenkonto
actionValidateOrder Lizenz bei Bestellabschluss generieren
actionOrderStatusPostUpdate Bestellstatusänderungen verarbeiten
moduleRoutes Freundliche URLs registrieren
actionFrontControllerSetMedia Frontend-CSS/JS laden
displayProductAdditionalInfo Variantenauswahl auf der Produktseite
actionCartUpdateQuantityBefore Variante beim Hinzufügen zum Warenkorb speichern
displayShoppingCartFooter Warnungen für nicht bestellbare Produkte
actionMPRCheckoutValidateOrder Checkout für nicht bestellbare Artikel blockieren

Geplante Funktionen / TODO

  • Ticketsystem-Integration (Support-Tickets pro Lizenz)
  • Mehrwährungsunterstützung für Lizenzpreise
  • Massenlizenzgenerierung für Wiederverkäufer
  • Lizenzübertragung zwischen Kunden
  • Nutzungsanalyse-Dashboard
  • Webhook-Benachrichtigungen für Lizenzereignisse
  • Integration mit dem PrestaShop Addons Marktplatz

Modul-Release-Workflow

Dieser Abschnitt behandelt die praktischen Schritte zur Veröffentlichung eines neuen Moduls über das MPR Digital Products System.

Voraussetzungen

  • Modul-Quellcode bereit zur Verteilung
  • Zugang zum MPR Digital Products Back Office
  • Datenbankzugang für die Release-Verwaltung

Schritt 1: Modul vorbereiten

Erforderliche Dateien

Ihr Modul muss die UpdateChecker.php-Klasse für Auto-Update-Unterstützung enthalten:

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

UpdateChecker kopieren

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

Update Checker in das Modul integrieren

Fügen Sie Folgendes zur getContent()-Methode Ihres Moduls hinzu:

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

    // Handle auto-update AJAX reqüst
    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()));
}

Schritt 2: Release-ZIP erstellen

Verzeichnisstruktur

Release-ZIPs werden gespeichert in:

modules/mprdigitalproducts/releases/{module_name}/

ZIP-Strukturanforderungen

Das ZIP muss das Modul in einem Ordner enthalten, der dem Modulnamen entspricht:

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

Build-Script-Beispiel

Erstellen Sie build_release.php in Ihrem Modul:

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

Ausführen:

php modules/yourmodule/build_release.php 1.0.0

Schritt 3: Produkt in der Datenbank registrieren

Digitalen Produkteintrag erstellen

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

Release-Eintrag erstellen

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

Schritt 4: Neue Version veröffentlichen

Beim Veröffentlichen eines Updates:

1. Neues ZIP erstellen

php modules/yourmodule/build_release.php 1.1.0

2. is_latest-Flags aktualisieren

-- 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';

Funktionsweise der Auto-Updates

Update-Ablauf

  1. Nach Updates suchen: Modul ruft API updates/check mit License Key auf
  2. Download-Token erhalten: Falls Update verfügbar, wird updates/download aufgerufen für temporären Token
  3. Pre-flight-Prüfungen: Validiert Speicherplatz, Berechtigungen, ZipArchive-Verfügbarkeit
  4. Backup: Erstellt ZIP-Backup des aktuellen Moduls + SQL-Dump der Modultabellen
  5. Download & Verifizierung: Lädt ZIP herunter, validiert Struktur (Hash-Prüfung wird bei personalisierten Dateien übersprungen)
  6. Atomic Swap: Benennt aktuelles Modul in _old um, verschiebt neues Modul an die Stelle
  7. Lizenz wiederherstellen: Bewahrt .mpr_license.json aus der vorherigen Installation
  8. Upgrades ausführen: Führt alle upgrade/upgrade-X.X.X.php-Scripts aus
  9. Aufraumen: Entfernt temporäre Dateien und altes Modulverzeichnis

Personalisierte Downloads

Downloads werden mit eingebetteter Lizenzkonfiguration (.mpr_license.json) personalisiert, sodass der Datei-Hash vom Original abweicht. Das System überspringt die Hash-Verifizierung für personalisierte Dateien, validiert aber weiterhin die ZIP-Struktur.

Rollback

Wenn das Update nach dem Atomic Swap an irgendeinem Punkt fehlschlaegt, stellt das System automatisch das gesicherte Modul wieder her.


Upgrade-Scripts

Für Datenbank-Migrationen zwischen Versionen erstellen Sie Scripts in upgrade/:

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

Script-Format:

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

Dateistruktur-Referenz

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

Schnelle Release-Checkliste

  • Versionsnummer in der Haupt-PHP-Datei des Moduls aktualisieren
  • Neüste UpdateChecker.php in den Classes-Ordner des Moduls kopieren
  • Release-ZIP mit korrekter Struktur erstellen
  • SHA256-Hash berechnen
  • Release-Verzeichnis erstellen: releases/{module_name}/
  • ZIP im Release-Verzeichnis ablegen
  • Release-Eintrag in der Datenbank erstellen
  • is_latest-Flag aktualisieren (bei altem entfernen, bei neuem setzen)
  • current_version in der Produkttabelle aktualisieren
  • Download über das Kundenportal testen
  • Auto-Update vom installierten Modul testen

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 reqüst 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 Bewertungen
5 ★
0
4 ★
0
3 ★
0
2 ★
0
1 ★
0

Noch keine Bewertungen. Seien Sie der Erste!

Bewertung schreiben

Bestimmte Aspekte bewerten (optional)
Qualität
Preis-Leistung
Stabilität
Kompatibilität
Support
7 Implemented
7 Anfragen

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
Antwort: 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
Antwort: 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
Antwort: 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
Antwort: 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
Antwort: 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
Antwort: 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
Antwort: Done in v1.5.0! Annual/monthly subscriptions, configurable renewal reminders, grace period, discounted renewal pricing, and upgrade paths.
2 offen 10 gelöst
Problem melden
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.
Alle bekannten Probleme anzeigen
30 Tage Rückgaberecht
Einfache Rückgabe – keine Fragen
Plug & Play Module
Installieren, einrichten und profitieren
Support an erster Stelle
Priorität für Hilfe & Zufriedenheit

Mehr aus dieser Kategorie

  • New
Lager Revolution
299,00 €
Loading...
Back to top