Une boutique ou un ERP sur mesure est un cas où il n’existe pas de plug-in prêt à l’emploi : votre développeur connecte donc lui-même le configurateur au panier. La règle qui sous-tend tout ici tient en une phrase : un prix envoyé par le navigateur ne doit jamais devenir un prix de panier. Votre serveur le vérifie d’abord auprès de CutOptim.
CutOptim n’encaisse aucun paiement et n’héberge aucune boutique ; le panier, le paiement et le règlement restent chez vous. Il n’y a pas encore de SDK. La référence de l’API du configurateur liste chaque route, chaque code d’erreur et chaque limite, avec un document OpenAPI 3.1 ; cette page, la page des commandes et le code de référence guident l’intégration pas à pas.
Deux clés
- La clé publiable (publishable key) figure dans votre page pour l’intégration. Elle ne peut faire que ce que fait un acheteur, et uniquement depuis les domaines que vous avez listés pour elle.
- La clé secrète (secret key) est destinée à votre serveur et n’est jamais placée dans une page. Elle est envoyée sous la forme
Authorization: Bearer <key>au service, par défauthttps://cfg.cutoptim.com. Envoyez toujoursContent-Type: application/jsonsur un POST.
Étape 1 : vérifier le devis avant le panier
Quand le client commande, votre page reçoit un événement cutoptim:order avec un jeton de devis. Envoyez le jeton à votre serveur, et depuis celui-ci :
curl -X POST https://cfg.cutoptim.com/cfg/v1/quote/verify \
-H "Authorization: Bearer $CFG_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"quoteToken":"<token from the page>"}'
La réponse est 200 avec {"valid": true, "redeemed": false, "claims": {...}} ou {"valid": false, "reason": "..."}. Un refus reste un 200 : lisez donc valid. Traitez un délai dépassé, un 401, un 500 ou un corps illisible comme non vérifié et refusez la ligne. Comparez ensuite les revendications à votre ligne de panier : le tenant est le vôtre, la devise est celle du panier, l’expiration est dans le futur, et le hachage du devis est égal au hachage du devis que votre page a affiché. Le code de référence inclut la fonction qui calcule ce hachage.
Un contrôle local de la forme du jeton, du tenant et de l’expiration coûte moins cher mais ne peut pas prouver la signature, car la clé de signature n’est pas communiquée. Utilisez-le seulement comme pré-contrôle.
Étape 2 : contrôler la commande
Vérifier le devis montre que la promesse de prix est authentique. Cela ne montre pas de quelle commande parle le navigateur. Avant de stocker ou d’exécuter à partir d’un identifiant de commande, récupérez-la sur votre serveur avec GET /cfg/v1/orders/{id} et votre clé secrète. Elle renvoie le hachage du plan, le hachage du devis, le statut, la devise et les trois totaux en unités mineures, et aucune donnée personnelle. Comparez-les à ce que vous avez vérifié.
Étape 3 : recevoir le webhook
Configurez un webhook comme décrit sur la page des commandes. Votre récepteur :
- lit le corps brut avant de l’analyser ;
- lit l’en-tête
CutOptim-Signature,t=<unix seconds>,v1=<hex>(il peut y avoir deux valeursv1pendant la rotation d’un secret) ; - recalcule
HMAC-SHA256(secret, "<t>.<raw body>"), compare en temps constant, et refuse un horodatage éloigné de plus de cinq minutes environ ; - réserve l’identifiant d’événement issu de
CutOptim-Event-Idavant tout traitement, et ignore un identifiant déjà traité ; - ignore les types d’événements qu’il ne connaît pas et répond
2xx, afin que l’expéditeur ne réessaie pas inutilement.
Vous obtenez le secret du récepteur avec POST /cfg/v1/admin/webhooks/{id}/secret et votre clé secrète. Gardez les secrets dans votre environnement, jamais dans une page, un dépôt ou un journal.
Code de référence
Deux petits exemples sans dépendances illustrent les trois étapes. C’est du code à lire et à copier, pas un service hébergé :
- Node 18 ou ultérieur : cutoptim-verify.mjs et example-server.mjs.
- PHP 7.4 ou ultérieur : CutOptimVerify.php et example-webhook.php.
Leurs secrets sont des valeurs fictives. Le stockage de doublons en mémoire dans les exemples est un substitut : en production, conservez les identifiants d’événements traités dans votre base de données et réservez un identifiant dans la même transaction que celle qui enregistre la commande.
Les mêmes étapes, avec les requêtes et les réponses exactes, figurent dans la référence : Boutique sur mesure ou ERP.
Rotation des clés
Une clé ou un secret de webhook peut être renouvelé avec un chevauchement, de sorte que l’ancien continue de fonctionner pendant une durée définie le temps que vous déployiez le nouveau. Pendant une rotation de webhook, une livraison porte deux signatures v1 pendant sept jours ; en accepter une seule vous permet de basculer sans interruption. Les boutons de console pour la rotation avec chevauchement ne sont pas encore construits ; la console peut créer et révoquer des clés.
Autres façons de recevoir des commandes
Pour WooCommerce, utilisez le plug-in. Si vous n’avez besoin que de plans de coupe dans votre propre logiciel, sans écran client intégré, c’est l’Engine API.