Zum Inhalt springen
 PrestaShop · 20–25 Min · mittel

Perfect Day in PrestaShop anbinden.

Verkauf deine Perfect-Day-Coupons über deinen PrestaShop. PrestaShop hat keine eingebaute Webhook-Funktion — du brauchst ein kleines Custom-Modul, das auf das Bestell-Event lauscht. Hinweis: Diese Anleitung gilt für PrestaShop 1.7+.

Vorab nötig: Geh einmal die allgemeine Vorbereitung durch — Coupon anlegen, Anwendungspasswort holen, Webhook-URL bereitlegen. Dauert rund fünf Minuten und gilt für alle Shop-Systeme.

Schritt 1 — Eigenschaft für die Coupon-ID anlegen

PrestaShop hat sogenannte „Eigenschaften" (engl. „Features"), mit denen du beliebige Daten an Produkte hängen kannst.

  1. Neue Eigenschaft erstellen

    PrestaShop-Admin → Katalog → Attribute & Eigenschaften → Eigenschaften„Neue Eigenschaft hinzufügen". Name: Perfect Day Coupon-ID. Speichern. Dann unter „Werte" pro Coupon-Variante einen Wert anlegen (z. B. 15114, 15115).

  2. Eigenschaft pro Produkt zuweisen

    Im Produkt-Editor → Tab „Funktionen"„Perfect Day Coupon-ID" wählen → den passenden Wert zuweisen → speichern.

    Die Eigenschaften-Variante ist besser geeignet als ein Custom-Field, da Custom-Fields in PrestaShop nur für Kunden-Eingaben gedacht sind, nicht für Backend-Verknüpfungen.

Schritt 2 — Custom-Modul für den Webhook

Das Modul lauscht auf den Hook actionValidateOrder und schickt die Bestellung an Perfect Day.

  1. Modul-Struktur anlegen

    Das Modul besteht aus zwei Dateien:

    Verzeichnisstruktur
    modules/perfectdayconnector/
    ├── perfectdayconnector.php
    └── config.xml
  2. perfectdayconnector.php

    Die Hauptdatei des Moduls — registriert den Order-Hook, liest die Coupon-ID-Eigenschaft pro Produkt und sendet den Webhook. Rund 80 Zeilen.

    Vollständigen Code anzeigen — PHP · perfectdayconnector.php
    PHP · perfectdayconnector.php
    <?php
    if (!defined('_PS_VERSION_')) exit;
    
    class PerfectDayConnector extends Module
    {
        public function __construct()
        {
            $this->name = 'perfectdayconnector';
            $this->tab = 'export';
            $this->version = '1.0.0';
            $this->author = 'DigElite';
            $this->bootstrap = true;
            parent::__construct();
            $this->displayName = $this->l('Perfect Day Connector');
            $this->description = $this->l('Schickt Bestellungen mit Perfect-Day-Coupon-IDs an die Plattform.');
            $this->ps_versions_compliancy = ['min' => '1.7', 'max' => _PS_VERSION_];
        }
    
        public function install()
        {
            return parent::install()
                && $this->registerHook('actionValidateOrder')
                && Configuration::updateValue('PFD_API_USER', '')
                && Configuration::updateValue('PFD_API_PASSWORD', '');
        }
    
        public function uninstall()
        {
            Configuration::deleteByName('PFD_API_USER');
            Configuration::deleteByName('PFD_API_PASSWORD');
            return parent::uninstall();
        }
    
        public function hookActionValidateOrder($params)
        {
            $order = $params['order'];
            if (!$order) return;
    
            $items = [];
            foreach ($params['cart']->getProducts() as $p) {
                $couponId = $this->getProductFeatureValue($p['id_product'], 'Perfect Day Coupon-ID');
                if (!$couponId) continue;
                $items[] = ['coupon_id' => (int)$couponId, 'count' => (int)$p['cart_quantity']];
            }
            if (empty($items)) return;
    
            $customer = new Customer($order->id_customer);
            $payload = [
                'shop_order_id' => (string) $order->reference,
                'shop_type'     => 'prestashop',
                'shop_domain'   => Tools::getShopDomain(),
                'customer' => [
                    'email'  => $customer->email,
                    'name'   => trim($customer->firstname . ' ' . $customer->lastname),
                    'locale' => substr(Context::getContext()->language->iso_code, 0, 2),
                ],
                'items'             => $items,
                'order_total_cents' => (int) round($order->total_paid * 100),
                'currency'          => Context::getContext()->currency->iso_code,
                'placed_at'         => $order->date_add,
            ];
    
            $user = Configuration::get('PFD_API_USER');
            $pwd  = Configuration::get('PFD_API_PASSWORD');
    
            $ch = curl_init('https://plattform.deinperfectday.de/wp-json/perfectday/shop/webhook/order');
            curl_setopt_array($ch, [
                CURLOPT_POST           => 1,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_HTTPHEADER     => [
                    'Content-Type: application/json',
                    'Authorization: Basic ' . base64_encode($user . ':' . $pwd),
                ],
                CURLOPT_POSTFIELDS => json_encode($payload),
                CURLOPT_TIMEOUT    => 15,
            ]);
            curl_exec($ch);
            curl_close($ch);
        }
    
        private function getProductFeatureValue($idProduct, $featureName)
        {
            $sql = 'SELECT fvl.value FROM ' . _DB_PREFIX_ . 'feature_product fp'
                 . ' INNER JOIN ' . _DB_PREFIX_ . 'feature_lang fl ON fl.id_feature = fp.id_feature'
                 . ' INNER JOIN ' . _DB_PREFIX_ . 'feature_value_lang fvl ON fvl.id_feature_value = fp.id_feature_value'
                 . ' WHERE fp.id_product = ' . (int)$idProduct
                 . " AND fl.name = '" . pSQL($featureName) . "'"
                 . ' LIMIT 1';
            return Db::getInstance()->getValue($sql);
        }
    }
  3. Modul installieren

    Den Modul-Ordner als ZIP packen, dann PrestaShop-Admin → Module → Module-Manager → Modul hochladen → ZIP rein → installieren → aktivieren.

  4. Credentials konfigurieren

    Trag deine Zugangsdaten als Konfigurations-Werte ein — PFD_API_USER (dein WordPress-Username) und PFD_API_PASSWORD (dein Anwendungspasswort). Das geht über die Modul-Konfiguration oder direkt in der ps_configuration-Tabelle.

Schritt 3 — Test-Bestellung

  1. Bestellung auslösen und prüfen

    Im PrestaShop-Frontend eine Test-Bestellung tätigen, Zahlung abschließen (Bank-Wire reicht für den Test). Dann prüfen: Plattform-Backoffice → Perfect Day → Shop-Bestellungen (Eintrag mit shop_type=prestashop?) und die Kunden-Mailbox auf die Brand-Mail mit Druck-Button.

Wenn etwas klemmt

Troubleshooting.

Der Modul-Hook feuert nicht

PrestaShop-Cache leeren: Erweiterte Parameter → Leistung → Cache leeren. Außerdem prüfen, ob das Modul aktiv ist.

Eigenschaft-Wert bleibt leer

Der Modul-Code sucht nach dem Feature-Namen Perfect Day Coupon-ID. Hast du den Namen geändert, musst du ihn im Code anpassen. Bei mehrsprachigen Shops muss der Feature-Name pro Sprache übersetzt sein.

HTTP 401 / 403

401 = Username oder Anwendungspasswort falsch (Username ist der WordPress-Benutzername, nicht die E-Mail). 403 = die Coupon-ID gehört nicht zu deinem Anbieter-Account.

Setup-Service

Lieber von uns einrichten lassen?

Wir bieten dir ein vollständiges PrestaShop-Modul mit komfortablem Konfigurations-UI, eine Hosted-Bridge über Make.com/Zapier oder ein Code-Review deines eigenen Custom-Moduls.

Häufige Fragen

Noch Fragen?

Funktioniert das auch mit PrestaShop 1.6?
Diese Anleitung ist für PrestaShop 1.7+. Für ältere Versionen schick uns einen Support-Request — der Modul-Code müsste angepasst werden.
Kann ich statt der Eigenschaft ein Custom-Field nutzen?
Technisch ja, aber nicht empfohlen. Custom-Fields in PrestaShop sind für Kunden-Eingaben gedacht, nicht für Backend-Verknüpfungen. Die Eigenschaften-Variante ist stabiler.

Shop verbunden — und jetzt?

Sobald der Webhook läuft, erscheinen alle Bestellungen automatisch in deinem Backoffice. Brauchst du eine weitere Anbindung, geht jeder weitere Shop in wenigen Minuten.

Zur Shop-Übersicht