Der Produktdesigner prüft schon von sich aus Auflösung, Kontrast, Sicherheitsabstand, Überlappung und die Zahl der Druckfarben. Hat deine Produktion weitere Regeln, etwa „ein Logo muss mindestens 15 mm breit sein“ oder „auf Heißfolie keine Schrift unter 6 mm“, ergänzt du eigene Prüfungen: im Browser mit JavaScript oder auf deinem Server per Webhook.
| Weg | Wofür | Grenze |
|---|---|---|
Im Browser (registerDesignCheck) |
Sofortiger Hinweis am Feld, während dein Kunde gestaltet | Lässt sich mit einer präparierten Anfrage umgehen |
| Auf dem Server (Webhook) | Verbindliche Regeln, die keine Bestellung umgehen darf | Wirkt nur, wenn dein Shop-Plugin die Preisprüfung erzwingt |
Für eine Regel, die gelten muss, nimmst du den Webhook. Am besten kombinierst du beide: Der Browser zeigt den Hinweis sofort, der Server sichert ab.
Prüfung im Browser
Du meldest eine Prüfung über die JavaScript-Schnittstelle an:
Configento.registerDesignCheck('logo-mindestbreite', (ctx) =>
ctx.placement && ctx.placement.widthMm < 15
? { level: 'block', message: 'Das Logo muss mindestens 15 mm breit sein.' }
: null,
{ appliesTo: ['logo'] });
- Der Name besteht aus Kleinbuchstaben, Ziffern und Bindestrichen.
appliesTonennt die Internen Namen (ID) der Merkmale, für die die Prüfung gilt. OhneappliesToläuft sie für jeden eigenen Text und jedes eigene Bild.registerDesignCheckgibt eine Funktion zurück, die die Prüfung wieder abmeldet.
Läuft dein Skript, bevor configento.js geladen ist, legst du die Prüfungen vorab an:
window.ConfigentoDesignChecks = {
'logo-mindestbreite': [check, { appliesTo: ['logo'] }],
};
Was die Prüfung bekommt
Die Prüfung läuft bei jeder Änderung und bekommt ein Objekt ctx:
| Feld | Inhalt |
|---|---|
characteristic |
id, key (Interner Name), type (customtext oder customimage), title |
locale |
Sprache des Konfigurators, z. B. de_DE |
zone |
widthMm, heightMm, dazu background und safeMm, wenn gesetzt |
box |
Die Fläche, die Text oder Bild tatsächlich belegt, in mm von links oben; null, wenn nichts zu sehen ist |
values |
Die übrigen Merkmale nach Internem Namen, so wie Formeln sie sehen: eine Auswahl liefert ihren Wert, Zahlen bleiben Zahlen |
text, lines |
Beim eigenen Text: der Text und seine Zeilen |
design |
Beim eigenen Text: font, sizeMm, drawnSizeMm, color, colorName, align, valign und finish, wenn eine Veredelung gilt |
image |
Beim eigenen Bild: file, type, width, height in Pixeln, vector bei SVG |
placement |
Beim eigenen Bild: widthMm, heightMm, dpi, rotation, flipX, centerXMm, centerYMm |
Was die Prüfung antwortet
null: alles in Ordnung.{ level: 'warn', message: '…' }: Der Hinweis steht am Feld, bestellt werden kann trotzdem.{ level: 'block', message: '…' }: Der Hinweis steht am Feld, und der Konfigurator hält den Warenkorb zurück.- Eine Liste solcher Ergebnisse, wenn mehrere Dinge nicht passen.
Den Hinweis gestaltest du über die Klasse .cfg-design__check; data-configento-level sagt, ob es eine Warnung oder eine Sperre ist, data-configento-check nennt den Namen deiner Prüfung. Siehe Design anpassen. Wirft eine Prüfung einen Fehler, ignoriert der Konfigurator sie und schreibt den Fehler in die Browser-Konsole.
Prüfung auf deinem Server
Mit einem Webhook prüft dein Server jede Gestaltung, bevor sie in den Warenkorb kommt. So hält die Regel auch dann, wenn jemand den Browser umgeht.
Einrichten
- Öffne im Admin Einstellungen → API und dort Druckdatenprüfung per Webhook.
- Trage die Webhook-URL ein. Erlaubt ist nur
httpsan eine öffentliche Adresse. - configento.app erzeugt einen Signatur-Schlüssel (
dcw_…). Hinterlege ihn auf deinem Server. Neuer Schlüssel ersetzt ihn. - Klicke auf Testaufruf senden. Antwortet dein Server, erscheint „Der Webhook hat geantwortet.“
- Entscheide, ob Warenkorb ablehnen, wenn der Webhook nicht antwortet gelten soll (siehe unten).
Die Anfrage
Beim Hinzufügen zum Warenkorb rechnet configento.app den Preis nach und schickt dabei alle sichtbaren, ausgefüllten eigenen Texte und Bilder per POST an deine URL:
{
"event": "design_check",
"component_id": "10000021",
"locale": "de_DE",
"fields": [ { "characteristic": { "key": "logo", "type": "customimage" }, "placement": { "widthMm": 12.4, "dpi": 310 } } ]
}
Jedes Element in fields hat denselben Aufbau wie ctx im Browser (gekürzt dargestellt). Nur box ist auf dem Server immer null.
Die Kopfzeilen:
| Kopfzeile | Inhalt |
|---|---|
X-Configento-Event |
design_check, beim Testaufruf test (dann ist fields leer) |
X-Configento-Timestamp |
Zeitpunkt in Unix-Sekunden |
X-Configento-Signature |
sha256= und der Hex-Wert von HMAC-SHA256 mit deinem Schlüssel über Zeitpunkt + . + Rohtext der Anfrage |
Prüfe die Signatur, bevor du der Anfrage traust, z. B. in Node.js:
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', process.env.CONFIGENTO_DCW_SECRET)
.update(req.headers['x-configento-timestamp'] + '.' + rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-configento-signature'] || ''));
Verwirf außerdem Anfragen mit einem Zeitpunkt, der mehr als ein paar Minuten zurückliegt.
Die Antwort
Dein Server antwortet mit Status 2xx und:
{ "findings": [ { "field": "logo", "level": "block", "message": "Das Logo muss mindestens 15 mm breit sein." } ] }
field ist der Interne Name des Merkmals. Eine leere Liste heißt: alles in Ordnung.
| Ergebnis | Wirkung |
|---|---|
Ein Fund mit block |
Die Preisprüfung lehnt ab (Fehler design_check_failed mit deiner Meldung). Die Konfiguration kommt nicht in den Warenkorb. |
Nur Funde mit warn |
Der Preis gilt; die Hinweise gehen als design_checks mit. |
| Keine verwertbare Antwort | Der Warenkorb geht durch. Mit Warenkorb ablehnen, wenn der Webhook nicht antwortet lehnt die Preisprüfung stattdessen ab (design_check_unavailable). |
Dein Server hat 2 Sekunden Zeit; Weiterleitungen folgt configento.app nicht. Das Ergebnis gilt zusammen mit dem Preis 5 Minuten, eine gleiche Konfiguration fragt in dieser Zeit nicht noch einmal an.
Voraussetzung im Shop
Der Webhook läuft in der Preisprüfung. Sperrt er, kommt die Konfiguration nicht in den Warenkorb, und dein Kunde sieht dort deine Meldung, ab diesen Plugin-Versionen:
| Shop | Plugin ab | Sperre wirkt |
|---|---|---|
| Shopware | 5.3.9 | immer, das Plugin prüft Konfigurationen mit Produktdesigner stets verbindlich |
| Magento | 5.1.14 | mit Preisprüfung auf Erzwingen; bei Beobachten geht die Konfiguration durch, die Sperre steht nur im Log |
| PrestaShop | 0.6.10 | immer |
| WooCommerce/WordPress | 0.6.5 | immer |
Mit älteren Plugin-Versionen wirkt die Sperre ebenso, dein Kunde sieht aber nur die allgemeine Meldung, dass die Konfiguration nicht mehr gültig ist oder der Preis nicht bestätigt werden konnte.
Gib deine Meldung deshalb auch über eine Prüfung im Browser aus, dann sieht dein Kunde sie schon beim Gestalten.
Fehlersuche
- Die Prüfung im Browser greift nicht: Stimmt der Interne Name in
appliesTo? Ist das Skript nachconfigento.jsgeladen, oder nutzt duwindow.ConfigentoDesignChecks? Fehler der Prüfung stehen in der Browser-Konsole. - „Der Webhook hat nicht verwertbar geantwortet“: Dein Server antwortet nicht innerhalb von 2 Sekunden, leitet weiter, antwortet ohne 2xx oder ohne gültiges JSON.
- Die Sperre wirkt nicht im Shop: In Magento steht die Preisprüfung nicht auf Erzwingen. Dein Kunde sieht nur eine allgemeine Meldung: Das Plugin ist älter als die Versionen oben.
- Die Signatur stimmt nicht: Rechne über den unveränderten Rohtext der Anfrage, nicht über ein neu erzeugtes JSON, und prüfe, ob du nach Neuer Schlüssel den neuen Schlüssel hinterlegt hast.