Le concepteur de produits vérifie déjà de lui-même la résolution, le contraste, la marge de sécurité, le chevauchement et le nombre de couleurs d'impression. Si votre production a d'autres règles, par exemple « un logo doit mesurer au moins 15 mm de large » ou « pas de texte de moins de 6 mm en dorure à chaud », vous ajoutez vos propres contrôles : dans le navigateur avec JavaScript ou sur votre serveur via un webhook.
| Méthode | Pour quoi | Limite |
|---|---|---|
Dans le navigateur (registerDesignCheck) |
Une remarque immédiate au niveau du champ pendant que votre client conçoit | Peut être contourné par une requête falsifiée |
| Sur le serveur (webhook) | Des règles impératives qu'aucune commande ne doit contourner | Ne fonctionne que si le plugin de votre boutique impose le contrôle du prix |
Pour une règle qui doit s'appliquer, utilisez le webhook. Idéalement, combinez les deux : le navigateur affiche la remarque immédiatement, le serveur garantit le respect de la règle.
Contrôle dans le navigateur
Vous enregistrez un contrôle via l'interface JavaScript :
Configento.registerDesignCheck('logo-largeur-min', (ctx) =>
ctx.placement && ctx.placement.widthMm < 15
? { level: 'block', message: 'Le logo doit mesurer au moins 15 mm de large.' }
: null,
{ appliesTo: ['logo'] });
- Le nom se compose de minuscules, de chiffres et de tirets.
appliesToindique les Noms internes (ID) des caractéristiques concernées. SansappliesTo, le contrôle s'exécute pour chaque texte et chaque image personnalisés.registerDesignCheckrenvoie une fonction qui désenregistre le contrôle.
Si votre script s'exécute avant le chargement de configento.js, définissez les contrôles à l'avance :
window.ConfigentoDesignChecks = {
'logo-largeur-min': [check, { appliesTo: ['logo'] }],
};
Ce que reçoit le contrôle
Le contrôle s'exécute à chaque modification et reçoit un objet ctx :
| Champ | Contenu |
|---|---|
characteristic |
id, key (nom interne), type (customtext ou customimage), title |
locale |
Langue du configurateur, p. ex. fr_FR |
zone |
widthMm, heightMm, plus background et safeMm s'ils sont définis |
box |
La surface réellement occupée par le texte ou l'image, en mm depuis le coin supérieur gauche ; null si rien n'est visible |
values |
Les autres caractéristiques par nom interne, telles que les formules les voient : une sélection donne sa valeur, les nombres restent des nombres |
text, lines |
Pour un texte personnalisé : le texte et ses lignes |
design |
Pour un texte personnalisé : font, sizeMm, drawnSizeMm, color, colorName, align, valign et finish si une finition s'applique |
image |
Pour une image personnalisée : file, type, width, height en pixels, vector pour un SVG |
placement |
Pour une image personnalisée : widthMm, heightMm, dpi, rotation, flipX, centerXMm, centerYMm |
Ce que répond le contrôle
null: tout est en ordre.{ level: 'warn', message: '…' }: la remarque apparaît au niveau du champ, la commande reste possible.{ level: 'block', message: '…' }: la remarque apparaît au niveau du champ et le configurateur retient le panier.- Une liste de tels résultats si plusieurs points ne conviennent pas.
Vous mettez en forme la remarque avec la classe .cfg-design__check ; data-configento-level indique s'il s'agit d'un avertissement ou d'un blocage, data-configento-check donne le nom de votre contrôle. Voir Personnaliser le design. Si un contrôle lève une erreur, le configurateur l'ignore et écrit l'erreur dans la console du navigateur.
Contrôle sur votre serveur
Avec un webhook, votre serveur contrôle chaque conception avant qu'elle n'arrive dans le panier. Ainsi, la règle tient même si quelqu'un contourne le navigateur.
Configuration
- Dans l'admin, ouvrez Paramètres → API, puis Webhook de contrôle des fichiers d'impression.
- Saisissez l'URL du webhook. Seul
httpsvers une adresse publique est autorisé. - configento.app génère une Clé de signature (
dcw_…). Enregistrez-la sur votre serveur. Nouvelle clé la remplace. - Cliquez sur Envoyer un appel de test. Si votre serveur répond, « Le webhook a répondu. » s'affiche.
- Décidez si Refuser le panier si le webhook ne répond pas doit s'appliquer (voir ci-dessous).
La requête
Lors de l'ajout au panier, configento.app recalcule le prix et envoie à votre URL, par POST, tous les textes et images personnalisés visibles et remplis :
{
"event": "design_check",
"component_id": "10000021",
"locale": "fr_FR",
"fields": [ { "characteristic": { "key": "logo", "type": "customimage" }, "placement": { "widthMm": 12.4, "dpi": 310 } } ]
}
Chaque élément de fields a la même structure que ctx dans le navigateur (présenté de façon abrégée). Seul box vaut toujours null sur le serveur.
Les en-têtes :
| En-tête | Contenu |
|---|---|
X-Configento-Event |
design_check, test pour l'appel de test (fields est alors vide) |
X-Configento-Timestamp |
Horodatage en secondes Unix |
X-Configento-Signature |
sha256= suivi de la valeur hexadécimale de HMAC-SHA256 avec votre clé sur horodatage + . + corps brut de la requête |
Vérifiez la signature avant de faire confiance à la requête, p. ex. en 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'] || ''));
Rejetez aussi les requêtes dont l'horodatage date de plus de quelques minutes.
La réponse
Votre serveur répond avec un statut 2xx et :
{ "findings": [ { "field": "logo", "level": "block", "message": "Le logo doit mesurer au moins 15 mm de large." } ] }
field est le nom interne de la caractéristique. Une liste vide signifie que tout est en ordre.
| Résultat | Effet |
|---|---|
Un résultat avec block |
Le contrôle du prix refuse (erreur design_check_failed avec votre message). La configuration n'arrive pas dans le panier. |
Seulement des résultats avec warn |
Le prix s'applique ; les remarques sont transmises sous design_checks. |
| Aucune réponse exploitable | Le panier passe. Avec Refuser le panier si le webhook ne répond pas, le contrôle du prix refuse à la place (design_check_unavailable). |
Votre serveur dispose de 2 secondes ; configento.app ne suit pas les redirections. Le résultat est valable 5 minutes avec le prix, et une configuration identique ne déclenche pas de nouvelle requête pendant ce temps.
Prérequis dans la boutique
Le webhook s'exécute dans le contrôle du prix. S'il bloque, la configuration n'est pas ajoutée au panier et votre client y voit votre message, à partir de ces versions du plugin :
| Boutique | Plugin à partir de | Le blocage s'applique |
|---|---|---|
| Shopware | 5.3.9 | toujours ; le plugin contrôle toujours de façon contraignante les configurations avec le concepteur de produits |
| Magento | 5.1.14 | avec le contrôle du prix réglé sur Enforce ; avec Shadow, la configuration passe et le blocage n'apparaît que dans le journal |
| PrestaShop | 0.6.10 | toujours |
| WooCommerce/WordPress | 0.6.5 | toujours |
Avec des versions plus anciennes du plugin, le blocage s'applique aussi, mais votre client ne voit que le message général indiquant que la configuration n'est plus valide ou que le prix n'a pas pu être confirmé.
Affichez donc aussi votre message via un contrôle dans le navigateur ; votre client le voit alors dès la conception.
Dépannage
- Le contrôle dans le navigateur n'a aucun effet : le nom interne dans
appliesToest-il correct ? Le script est-il chargé aprèsconfigento.js, ou utilisez-vouswindow.ConfigentoDesignChecks? Les erreurs du contrôle figurent dans la console du navigateur. - « Le webhook n'a pas donné de réponse exploitable » : votre serveur ne répond pas dans les 2 secondes, redirige, répond sans statut 2xx ou sans JSON valide.
- Le blocage n'a aucun effet dans la boutique : dans Magento, le contrôle du prix n'est pas réglé sur Enforce. Votre client ne voit qu'un message général : le plugin est plus ancien que les versions ci-dessus.
- La signature ne correspond pas : calculez-la sur le corps brut inchangé de la requête, pas sur un JSON réencodé, et vérifiez que vous avez enregistré la nouvelle clé après Nouvelle clé.