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.
-
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). -
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.
-
Modul-Struktur anlegen
Das Modul besteht aus zwei Dateien:
modules/perfectdayconnector/ ├── perfectdayconnector.php └── config.xml -
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 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); } } -
Modul installieren
Den Modul-Ordner als ZIP packen, dann PrestaShop-Admin → Module → Module-Manager → Modul hochladen → ZIP rein → installieren → aktivieren.
-
Credentials konfigurieren
Trag deine Zugangsdaten als Konfigurations-Werte ein —
PFD_API_USER(dein WordPress-Username) undPFD_API_PASSWORD(dein Anwendungspasswort). Das geht über die Modul-Konfiguration oder direkt in derps_configuration-Tabelle.
Schritt 3 — Test-Bestellung
-
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.
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.
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.
Noch Fragen?
Funktioniert das auch mit PrestaShop 1.6?
Kann ich statt der Eigenschaft ein Custom-Field nutzen?
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