E-commerce sur mesure · développeurs
Spécifications d’intégration PunchOut pour boutiques sur mesure
Ce que votre boutique sur mesure ou headless doit implémenter pour fonctionner avec la passerelle PunchOut Rocket, avec les mêmes fonctions que nos plugins : sessions PunchOut avec connexion automatique, retour du panier, correspondances des catégories et, avec le forfait Premium, bons de commande, confirmations et avis d’expédition. La passerelle gère cXML et OCI avec le client.
- Les mêmes fonctions que les plugins
- JSON via HTTPS
- cXML et OCI gérés par la passerelle
Sur cette page
- Ce que votre boutique implémente
- 1. Configuration dans PunchOut Rocket
- Règles communes
- 2. Endpoint de clonage
- 3. Connexion SSO
- 4. Transfert du panier
- 5. Endpoint des catégories
- 6. Endpoint de création des commandes
- 7. Endpoint d’état des commandes
- 8. Notification de l’état des commandes
- 9. Contrôles avant la mise en production
Ce que votre boutique implémente
Chaque fonction est un petit endpoint JSON ou un formulaire de navigateur sur votre boutique. Implémentez d’abord les éléments obligatoires ; les bons de commande et leurs mises à jour peuvent suivre.
| Section | Fonctionnalité | Ce que votre boutique implémente | Obligatoire | Forfait |
|---|---|---|---|---|
| 2–3 | Session PunchOut (create, edit, inspect) avec connexion automatique | Endpoint de clonage et connexion SSO | Oui | Toutes les licences |
| 4 | Transfert du panier vers le système d’achat | Formulaire à envoi automatique vers PunchOut Rocket | Oui | Toutes les licences |
| 5 | Correspondances des catégories, par exemple UNSPSC | Endpoint des catégories | Recommandé | Toutes les licences |
| 6 | Bons de commande (cXML OrderRequest) | Endpoint de création des commandes | Facultatif | Forfait Premium |
| 7 | Confirmations de commande et avis d’expédition (cXML ConfirmationRequest, ShipNoticeRequest) | Endpoint d’état des commandes | Facultatif, nécessite 6 | Forfait Premium + option OC & ASN |
| 8 | Mises à jour immédiates des commandes | Notification à PunchOut Rocket | Facultatif, nécessite 7 | Forfait Premium + option OC & ASN |
| – | Paniers prédéfinis | Rien : PunchOut Rocket les présente au client et envoie lui-même le panier choisi au système d’achat | – | Forfait Premium |
L’essai gratuit inclut les fonctions du forfait Premium. Les confirmations et avis d’expédition sont une option du forfait Premium (OC & ASN) : contactez-nous pour l’activer.
1. Configuration dans PunchOut Rocket
Site e-commerce
| Champ | Valeur |
|---|---|
| E-commerce Platform | Custom |
| Site URL | URL de base de votre boutique, par exemple https://your-store.example.com. Elle peut inclure un chemin (https://example.com/shop) ; le / final est supprimé |
| API Key | Un secret d’au moins 10 caractères. PunchOut Rocket l’envoie à chaque appel à votre boutique : celle-ci doit connaître la même valeur |
| Custom Clone Endpoint | Chemin de l’endpoint de clonage. Si vide : /api/punchout/clone |
| Custom Categories Endpoint | Chemin de l’endpoint des catégories. Si vide : /api/punchout/categories |
| Custom Create Order Endpoint | Chemin de l’endpoint de création des commandes. Si vide : /api/punchout/create-order |
| Custom Order Status Endpoint | Chemin de l’endpoint d’état des commandes. Si vide : /api/punchout/order-status |
| Use Reverse Proxy, Reverse Proxy URL | Activé par défaut. Reverse Proxy URL est en lecture seule, générée à partir de Site Name, par exemple https://your-store.punchoutrocket.com : les clients ouvrent votre boutique par cette adresse, ce qui évite les problèmes SameSite et CORS dans les systèmes d’achat. Le schéma et l’hôte de sso_url retourné sont remplacés par ceux de cette URL ; le chemin et la requête sont conservés |
Les chemins des endpoints sont ajoutés tels quels à Site URL et doivent donc commencer par /. Exemple : Site URL https://your-store.example.com + /api/punchout/clone → https://your-store.example.com/api/punchout/clone.

Les bons de commande (section 6) et paniers prédéfinis sont inclus dans le forfait Premium et l’essai gratuit : votre forfait les active sur le site et la page du client final affiche alors les sections Orders et Predefined Carts. Les confirmations et avis d’expédition (sections 7–8) nécessitent aussi l’option OC & ASN.
Client final
Chaque entreprise cliente est un client final de votre site. Outre ses identifiants de protocole (identités cXML et shared secret, ou utilisateur et mot de passe OCI), ces champs concernent votre boutique :
| Champ | Utilisé pour |
|---|---|
| E-commerce User to Clone | Nom d’utilisateur (ou email) d’un utilisateur de votre boutique. Envoyé comme username à l’endpoint de clonage et comme customer_email à la création de commande : les utilisateurs PunchOut du client sont clonés à partir de lui et ses commandes lui sont attribuées. Attribuez-lui les prix, remises et adresses prévus pour ce client |
| Default UNSPSC | Code de catégorie utilisé pour les produits dont les catégories n’ont pas de code associé (section 5) |
| Default Lead Time | Délai de livraison en jours envoyé avec chaque article OCI (3 par défaut) |
| EA Override, BX Override | Remplacent l’unité de mesure EA ou BX envoyée par votre boutique (section 4) par le code attendu par ce client. Appliqués uniquement lorsque la boutique envoie ce code : une unité vide devient EA sans remplacement |
| Category Mapping | Vos catégories, chargées avec « Update from e-commerce », chacune associée à un code (section 5) |
| Shipping Method, Payment Method | Envoyés à la création de commande (section 6). Laissez-les vides pour utiliser les valeurs par défaut de votre boutique |
| Send order status updates, Order status URL, Supplier shared secret | Activent les sections 7–8 pour ce client : l’URL et le secret sont ceux de son système d’achat |

Le reste des pages du site et du client final fonctionne comme pour les autres plateformes : consultez la documentation.
Règles communes
Elles s’appliquent à chaque appel de PunchOut Rocket à vos endpoints (sections 2, 5, 6 et 7) :
- Méthode et format : toujours
POSTavec un corps JSON (Content-Type: application/json). Répondez en JSON. - Authentification : le corps contient toujours
api_key. Comparez-la à la clé configurée dans votre boutique et rejetez l’appel avec HTTP 401 si elle ne correspond pas. - HTTPS uniquement.
- Erreurs : répondez avec un statut HTTP non 2xx et
{"status": "error", "message": "<reason>"}(error_codeest facultatif). Rendez le message explicite, par exempleProduct X-100 not found: il figure dans les journaux et les emails d’erreur envoyés au propriétaire du site. - Délais d’attente : les appels de création et d’état des commandes expirent après 30 secondes. Répondez rapidement et effectuez ensuite les opérations lentes.
2. Endpoint de clonage
Chemin par défaut : /api/punchout/clone. Appelé lorsqu’un client ouvre votre boutique depuis son système d’achat. Votre boutique crée (ou réutilise) un utilisateur cloné de username, lié à cette session PunchOut, et retourne une URL SSO qui connecte cet utilisateur (section 3).
Corps de la requête
| Champ | Type | Signification |
|---|---|---|
username | string | « E-commerce User to Clone » du client final |
api_key | string | Clé API du site |
session_token | string | ID de session PunchOut (BuyerCookie cXML ou UUID pour OCI). Conservez-le : il est renvoyé dans le formulaire du panier (section 4) |
end_customer_id | integer | ID du client final dans PunchOut Rocket. Conservez-le : il est renvoyé dans le formulaire du panier (section 4) |
operation | string | create, edit ou inspect pour cXML ; toujours create pour OCI |
gateway_base_url | string | URL de base de PunchOut Rocket : le formulaire du panier (section 4) envoie à {gateway_base_url}/start-sso-checkout |
selected_item | object, facultatif | cXML uniquement : le produit choisi par le client dans le catalogue du système d’achat. Contient supplier_part_id (SKU) et/ou supplier_part_auxiliary_id (ID produit), uniquement ceux envoyés par le client |
cart_items | array, facultatif | cXML edit et inspect uniquement : le panier à restaurer. Absent si le système du client n’a envoyé aucun article |
| Champ | Type | Signification |
|---|---|---|
sku | string | SKU (peut être vide) |
product_id | string | ID produit dans votre boutique (peut être vide) |
quantity | string | Quantité, par exemple "2" |
price | string | Prix unitaire, point comme séparateur décimal, par exemple "15.95". Informatif : le panier utilise vos prix actuels |
description | string | Description du produit |
currency | string | Code ISO 4217 |
quantity et price sont des chaînes : convertissez-les avant utilisation.
Requête : création avec un article sélectionné
{
"username": "buyer123",
"api_key": "site-api-key-abc",
"session_token": "sess-012345",
"operation": "create",
"end_customer_id": 2,
"gateway_base_url": "https://middleware.example.com",
"selected_item": {
"supplier_part_id": "X-100",
"supplier_part_auxiliary_id": "19853"
}
}Requête : edit, avec le panier à restaurer
{
"username": "buyer123",
"api_key": "site-api-key-abc",
"session_token": "sess-67890",
"operation": "edit",
"end_customer_id": 2,
"gateway_base_url": "https://middleware.example.com",
"cart_items": [
{"sku": "ABC-001", "product_id": "19852", "quantity": "2", "price": "15.95",
"description": "Example description", "currency": "EUR"},
{"sku": "XYZ-002", "product_id": "19854", "quantity": "1", "price": "249.00",
"description": "Another example description", "currency": "EUR"}
]
}Réponse de succès
HTTP 2xx
HTTP 200
{
"status": "success",
"sso_url": "https://your-store.example.com/punchout/sso?token=eyJ..."
}sso_url est le seul champ lu : il est obligatoire et doit être une URL absolue http:// ou https://. PunchOut Rocket y dirige le navigateur du client (via le système d’achat pour cXML, directement pour OCI).
Réponses d’erreur
Tout statut non 2xx ou réponse sans sso_url valide fait échouer le PunchOut : le client reçoit une erreur dans son système d’achat. Votre réponse (statut et corps) est enregistrée dans le journal de session PunchOut ; expliquez donc la raison dans le message.
| HTTP | Quand | Corps |
|---|---|---|
| 400 | Champs manquants ou non valides | {"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"} |
| 401 | api_key incorrecte | {"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"} |
| 422 | SSO impossible, par exemple username introuvable | {"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"} |
| 500 | Erreur interne | {"status": "error", "error_code": "internal_error", "message": "..."} |
3. Connexion SSO
Lorsque le client ouvre sso_url, votre boutique :
- consomme le jeton (usage unique) et connecte l’utilisateur cloné ;
- pour
editetinspect: remplit le panier avec exactement les produits et quantités decart_items, puis affiche le panier (les prix actuels s’appliquent) ; - pour
create: affiche le produitselected_items’il a été envoyé et existe encore, sinon la page d’accueil de la boutique.
Donnez au jeton une validité de quelques minutes, pas de secondes : lorsque le client final dispose de paniers prédéfinis, il voit d’abord leur page et n’ouvre sso_url qu’en choisissant de poursuivre vers la boutique.
4. Transfert du panier (formulaire à envoi automatique)
Pour un utilisateur PunchOut, le bouton de validation ne doit pas démarrer votre processus de commande : il envoie le panier à PunchOut Rocket. Votre boutique retourne une page HTML qui soumet automatiquement un formulaire masqué, idéalement avec un indicateur de chargement.
- URL :
{gateway_base_url}/start-sso-checkout(gateway_base_urlde la requête de clonage) - Méthode :
POST,application/x-www-form-urlencoded(envoi classique d’un formulaire du navigateur) - Pas d’
api_key: la session est identifiée parsession_tokenetend_customer_id.
| Champ | Obligatoire | Signification |
|---|---|---|
session_token | Oui | De la requête de clonage |
end_customer_id | Oui | De la requête de clonage |
products[i][sku] | Oui | SKU. Devient le SupplierPartID cXML ou la référence article fournisseur OCI |
products[i][product_id] | Oui | ID produit dans votre boutique. Devient le SupplierPartAuxiliaryID cXML : le client le renvoie dans edit et les bons de commande |
products[i][description] | Oui | Nom ou description du produit. Les balises HTML sont supprimées |
products[i][quantity] | Oui | Quantité, point comme séparateur décimal |
products[i][price] | Oui | Prix unitaire, point comme séparateur décimal, sans séparateur de milliers |
products[i][currency] | Oui | Code ISO 4217 |
products[i][unit_of_measure] | Non | Code d’unité UN/CEFACT. Par défaut EA |
products[i][manufacturer_name] | Non | Fabricant |
products[i][category_ids] | Non | ID séparés par des virgules des catégories auxquelles le produit appartient directement (feuilles de l’arbre), retournés par l’endpoint des catégories (section 5). Utilisés pour trouver l’UNSPSC du produit |
i commence à 0, sans interruption : PunchOut Rocket arrête la lecture au premier indice manquant. Pensez à échapper les valeurs pour HTML.
Exemple de page retournée à la validation de commande
<!doctype html>
<html>
<body>
<p>Sending your cart to your procurement system…</p>
<form id="punchout_repost" method="post" action="https://middleware.example.com/start-sso-checkout">
<input type="hidden" name="session_token" value="sess-012345"/>
<input type="hidden" name="end_customer_id" value="2"/>
<input type="hidden" name="products[0][sku]" value="ABC-001"/>
<input type="hidden" name="products[0][product_id]" value="19852"/>
<input type="hidden" name="products[0][description]" value="Example description"/>
<input type="hidden" name="products[0][quantity]" value="2"/>
<input type="hidden" name="products[0][price]" value="15.95"/>
<input type="hidden" name="products[0][currency]" value="EUR"/>
<input type="hidden" name="products[0][unit_of_measure]" value="EA"/>
<input type="hidden" name="products[0][manufacturer_name]" value="3M"/>
<input type="hidden" name="products[0][category_ids]" value="1145,3398"/>
<input type="hidden" name="products[1][sku]" value="XYZ-002"/>
<input type="hidden" name="products[1][product_id]" value="19854"/>
<input type="hidden" name="products[1][description]" value="Another example description"/>
<input type="hidden" name="products[1][quantity]" value="4"/>
<input type="hidden" name="products[1][price]" value="10.90"/>
<input type="hidden" name="products[1][currency]" value="EUR"/>
<input type="hidden" name="products[1][manufacturer_name]" value="DEWALT"/>
<input type="hidden" name="products[1][category_ids]" value="2146"/>
</form>
<script>document.getElementById('punchout_repost').submit();</script>
</body>
</html>PunchOut Rocket envoie alors le panier au système d’achat et termine la session. Une session n’accepte qu’un seul panier :
| HTTP | Quand |
|---|---|
| 400 | session_token ou end_customer_id manquant ou non valide, ou aucune session correspondante |
| 409 | Un panier a déjà été envoyé pour cette session |
5. Endpoint des catégories
Chemin par défaut : /api/punchout/categories. Appelé lorsque le propriétaire du site clique sur « Update from e-commerce » dans le Category Mapping d’un client final. Les catégories sont ensuite associées manuellement aux codes du client, comme UNSPSC.
Requête
{"api_key": "site-api-key-abc"}Succès : HTTP 200, status success ou ok
HTTP 200
{
"status": "success",
"categories": [
{"id": 1345, "name": "Office Supplies", "parent_id": 0},
{"id": 1847, "name": "Pens", "parent_id": 1345},
{"id": 2345, "name": "Electronics", "parent_id": 0}
]
}| Champ | Signification |
|---|---|
id | ID de catégorie dans votre boutique, entier différent de 0 : les mêmes ID que vous envoyez dans category_ids (section 4) |
name | Nom affiché. Les catégories sans nom sont ignorées |
parent_id | ID de la catégorie parente, 0 pour celles de premier niveau |
Retournez l’arbre complet en une réponse. Chaque mise à jour aligne la liste du client final sur votre réponse : les catégories non retournées sont supprimées avec leur code associé ; conservez donc des ID stables.

Comment un produit du panier obtient son code :
- le code associé à l’un de ses
category_ids; - sinon, le code de la catégorie parente la plus proche qui en possède un ;
- sinon, le Default UNSPSC du client final.
6. Endpoint de création des commandes
Chemin par défaut : /api/punchout/create-order. Appelé lorsque le système d’achat du client envoie un bon de commande (cXML OrderRequest). Votre boutique crée la commande et retourne son ID et l’ID de l’article de commande créé pour chaque ligne du PO. PunchOut Rocket répond au système d’achat avec le résultat. Nécessite le forfait Premium.
Le client envoie ses bons de commande à l’« Order request URL » affichée dans la section Orders du client final, où sont définis Shipping Method, Payment Method et les mises à jour d’état (section 7) :

Corps de la requête
| Champ | Type | Signification |
|---|---|---|
api_key | string | Clé API du site |
gateway_url | string | URL de base de PunchOut Rocket, pour la notification d’état (section 8) |
customer_email | string | « E-commerce User to Clone » du client final (même valeur que username dans la requête de clonage, donc pas nécessairement un email) : attribuez la commande à cet utilisateur |
order_id | string | Numéro de PO du client. Enregistrez-le dans la commande : c’est la référence connue du client |
order_date | string | Date du PO envoyée par le client (ISO 8601) |
currency | string | ISO 4217 |
total | string | Total du PO, point comme séparateur décimal |
shipping_method | string | Shipping Method du client final. Peut être vide : utilisez votre valeur par défaut |
payment_method | string | Payment Method du client final, par exemple virement bancaire. Peut être vide : utilisez votre valeur par défaut |
billing_address, shipping_address | object | name, street (plusieurs lignes séparées par \n, par exemple une ligne « Attn: » avant la rue), city, state, postal_code, country_code (ISO 3166-1 alpha-2), email. Les champs absents du PO sont des chaînes vides |
items | array | Lignes du PO, voir ci-dessous |
| Champ | Type | Signification |
|---|---|---|
line_number | string | Numéro de ligne du PO : renvoyez-le dans la réponse |
sku | string | SKU (cXML SupplierPartID) |
product_id | string | ID produit (SupplierPartAuxiliaryID cXML). Peut être vide : recherchez alors le produit par sku |
quantity | integer | Quantité commandée |
unit_price | string | Prix unitaire du PO (prix approuvé par le client), point comme séparateur décimal |
currency | string | ISO 4217 |
description | string | Description de la ligne |
Requête
{
"api_key": "site-api-key-abc",
"gateway_url": "https://middleware.example.com",
"customer_email": "buyer123",
"order_id": "PO-4500123",
"order_date": "2026-11-10T10:00:00+01:00",
"currency": "EUR",
"total": "280.90",
"shipping_method": "Standard",
"payment_method": "Bank transfer",
"billing_address": {"name": "ACME Spa", "street": "Via Roma 1", "city": "Milano",
"state": "MI", "postal_code": "20100", "country_code": "IT", "email": "ap@acme.example"},
"shipping_address": {"name": "ACME Spa - Warehouse", "street": "Attn: Mario Rossi\nVia Milano 5",
"city": "Torino", "state": "TO", "postal_code": "10100", "country_code": "IT", "email": ""},
"items": [
{"line_number": "1", "sku": "ABC-001", "product_id": "19852", "quantity": 2,
"unit_price": "15.95", "currency": "EUR", "description": "Example description"},
{"line_number": "2", "sku": "XYZ-002", "product_id": "19854", "quantity": 1,
"unit_price": "249.00", "currency": "EUR", "description": "Another example description"}
]
}Réponse de succès
HTTP 2xx
HTTP 200
{
"status": "success",
"order_id": "100045",
"items": [
{"line_number": "1", "order_item_id": "5501"},
{"line_number": "2", "order_item_id": "5502"}
]
}| Champ | Obligatoire | Signification |
|---|---|---|
status | Oui | Exactement success |
order_id | Oui | ID de commande dans votre boutique : PunchOut Rocket le transmet à l’endpoint d’état des commandes (section 7). Il doit rester inchangé pendant toute la vie de la commande |
items | Recommandé | Pour chaque ligne du PO créée, l’ID de son article de commande (les mêmes ID retournés par l’endpoint d’état). Si deux lignes deviennent le même article de commande (même produit), listez les deux valeurs line_number avec cet order_item_id |
items permet à PunchOut Rocket de confirmer le PO et de notifier les expéditions ligne par ligne. Sans ce champ, confirmations et expéditions partielles ne peuvent pas être signalées : la commande est confirmée en totalité et seule sa première expédition est notifiée, comme une expédition complète.
Erreurs
Tout statut non 2xx ou un status autre que success signifie que la commande n’a pas été créée : le système d’achat reçoit une erreur et le propriétaire du site un email avec votre message. Cas courants : customer_email introuvable, produit introuvable, commande impossible à créer.
Si un produit est introuvable, vous pouvez créer la commande sans lui et omettre son line_number de items : cette ligne sera rejetée dans la confirmation de commande.
PunchOut Rocket ne détecte pas un PO envoyé deux fois : si votre boutique possède déjà une commande pour cet order_id et cet utilisateur, retournez-la au lieu d’en créer une seconde.
7. Endpoint d’état des commandes
Chemin par défaut : /api/punchout/order-status. Appelé uniquement pour les clients finaux avec « Send order status updates » activé, pour les commandes créées via la section 6 : chaque heure pendant 60 jours après la commande et immédiatement après une notification (section 8). Nécessite l’option OC & ASN. À partir de la réponse, PunchOut Rocket envoie au système d’achat du client :
- une confirmation de commande (cXML ConfirmationRequest), une seule fois, lorsque la commande est acceptée ou annulée ;
- un avis d’expédition (cXML ShipNoticeRequest) pour chaque nouvelle expédition d’une commande confirmée.
PunchOut Rocket mémorise ses envois : répondez toujours avec l’état actuel de la commande et PunchOut Rocket détermine les nouveautés.
Requête : order_id est celui retourné par votre endpoint de création des commandes
{"api_key": "site-api-key-abc", "order_id": "100045"}Réponse de succès
HTTP 200
HTTP 200
{
"status": "success",
"order_status": "shipped",
"items": ["5501", "5502"],
"quantities": [
{"order_item_id": "5501", "quantity": 2},
{"order_item_id": "5502", "quantity": 1}
],
"shipments": [
{
"id": "SH-1",
"shipped_at": "2026-11-12T09:30:00+01:00",
"carrier": "UPS",
"tracking": "1Z999AA10123456784",
"items": [{"order_item_id": "5501", "quantity": 2}]
}
]
}| Champ | Obligatoire | Signification |
|---|---|---|
status | Oui | Exactement success |
order_status | Oui | L’état de votre commande associé à l’une des valeurs ci-dessous |
items | Oui | ID des articles encore présents dans la commande. Un article supprimé n’apparaît pas ici |
quantities | Recommandé | Quantité actuelle de chaque article de commande. Sans ce champ, un article encore présent est considéré comme contenant intégralement ses lignes du PO : une quantité réduite ne peut pas être signalée |
shipments | Recommandé | Une entrée par expédition envoyée. Vide ([]) si votre boutique ne suit pas les expéditions : seules les confirmations sont alors envoyées, sans avis d’expédition |
| Valeur | Signification | Envoyé au client |
|---|---|---|
pending | Reçue, pas encore acceptée | Rien |
processing | Acceptée | Confirmation |
shipped | Expédiée, partiellement ou totalement | Confirmation si elle n’a pas encore été envoyée, puis avis d’expédition |
delivered | Livrée | Identique à shipped |
cancelled | Annulée | Rejet de toute la commande, même après confirmation. Définitif : la commande n’est plus vérifiée |
La confirmation est envoyée une seule fois, lorsque la commande devient pour la première fois processing, shipped ou delivered :
- elle accepte toute la commande si chaque ligne du PO y figure intégralement ;
- sinon, elle accepte chaque ligne pour la quantité présente dans la commande et rejette le reste (articles supprimés, quantités réduites). Une quantité supérieure au PO est confirmée à hauteur de celle du PO ;
- s’il ne reste aucune ligne, rien n’est envoyé : utilisez
cancelledpour rejeter la commande.
Les modifications ultérieures des articles ne sont pas reconfirmées : modifiez la commande avant de l’accepter.
| Champ | Obligatoire | Signification |
|---|---|---|
id | Oui | ID d’expédition, unique dans la commande et jamais réutilisé : chaque ID est notifié une seule fois |
shipped_at | Recommandé | Date d’expédition, ISO 8601 avec décalage de fuseau horaire |
carrier | Non | Nom du transporteur |
tracking | Non | Numéro de suivi. Le transporteur n’est signalé qu’avec ce numéro |
items | Oui | Articles de cette expédition et quantité expédiée (order_item_id de la création de commande). Une expédition sans aucun article du PO n’est pas notifiée |
Signalez une expédition seulement après son départ. Les modifications effectuées après sa notification ne sont pas renvoyées. Si le système d’achat refuse une confirmation ou un avis d’expédition, PunchOut Rocket le renvoie au prochain contrôle et bloque les envois suivants jusqu’à son acceptation.
| HTTP | Quand | Effet |
|---|---|---|
404 avec {"status": "error", ...} | La commande n’existe pas, par exemple elle a été supprimée | Journalisé, vérifié à nouveau au prochain cycle |
| Autres statuts non 2xx | Tout autre échec | Journalisé, vérifié à nouveau au prochain cycle |
8. Notification de l’état des commandes (facultative)
Sans elle, PunchOut Rocket lit l’état des commandes chaque heure. Pour envoyer confirmations et avis d’expédition en quelques secondes, notifiez PunchOut Rocket dès qu’une commande créée via la section 6 change (état, articles, nouvelle expédition) :
- URL :
{gateway_url}/order-status-changed(gateway_urlde la requête de création de commande) - Méthode :
POST,Content-Type: application/json - Sans authentification : la notification ne transporte aucune donnée ; elle déclenche seulement l’appel de votre endpoint d’état (section 7) par PunchOut Rocket pour cette commande.
Notification et réponse
POST {gateway_url}/order-status-changed
Content-Type: application/json
{"order_id": "100045"}
HTTP 202
{"status": "queued"}Envoyez-la après l’enregistrement de la modification, sans faire attendre l’utilisateur (fire and forget, délai d’attente court). Les échecs peuvent être ignorés : le contrôle horaire rattrape les changements.
9. Contrôles avant la mise en production
- Configurez le site (section 1) et renseignez la même clé API dans votre boutique.
- Créez un client final et définissez son « E-commerce User to Clone ».
- Cliquez sur « Update from e-commerce » dans son Category Mapping et associez les catégories ; définissez un Default UNSPSC.
- Testez un PunchOut avec le formulaire de test cXML du panneau d’administration : create, puis edit avec un panier, puis retournez le panier.
- Pour les bons de commande (forfait Premium) : envoyez un OrderRequest de test et vérifiez la commande dans votre boutique.
- Pour les mises à jour d’état (option OC & ASN) : activez « Send order status updates » sur le client final, faites passer la commande de test par vos états et vérifiez que le système du client reçoit la confirmation et les avis d’expédition.
À retenir :
- Les utilisateurs PunchOut ne doivent pas finaliser une commande sur votre boutique : leur panier retourne au système d’achat (section 4) et la commande arrive ensuite via la section 6.
- Les commandes reçues via la section 6 sont déjà approuvées par le système d’achat du client : aucun paiement en ligne n’est nécessaire.
Besoin d’un client de test ou d’une revue de votre implémentation ? Parlez à nos développeurs ou confiez-nous le développement avec Go-Live Assist.
FAQ
Questions sur l’intégration
Quels champs dois-je renseigner dans PunchOut Rocket ?
Avec E-commerce Platform défini sur Custom : Site URL et API Key. Les quatre chemins d’endpoints (clonage, catégories, création et état des commandes) ne sont nécessaires que si vous n’utilisez pas ceux par défaut.
L’endpoint des catégories est-il nécessaire ?
Il est recommandé. Il permet d’associer vos catégories aux codes requis par les clients, comme UNSPSC ; sans lui, chaque produit reçoit le Default UNSPSC du client final.
Le lien SSO peut-il être réutilisé ?
Non. Le jeton doit fonctionner une seule fois, en HTTPS. Donnez-lui une validité de quelques minutes, pas de secondes : avec les paniers prédéfinis, le client ouvre le lien seulement après avoir choisi de poursuivre vers votre boutique.
Comment les bons de commande arrivent-ils dans une boutique sur mesure ?
Via votre endpoint de création des commandes : la passerelle reçoit le cXML OrderRequest du client et l’envoie à votre boutique en JSON. Cette fonction est incluse dans le forfait Premium et l’essai gratuit.
Ma boutique peut-elle envoyer des confirmations et avis d’expédition ?
Oui, avec l’option OC & ASN du forfait Premium (contactez-nous pour l’activer). Implémentez l’endpoint d’état : la passerelle lit l’état de chaque commande et envoie cXML ConfirmationRequest et ShipNoticeRequest au système du client.
Essai gratuit de 30 jours · sans carte bancaire
Votre client attend. Passons à l’action.
Installez le plugin aujourd’hui et lancez votre première session de test cet après-midi. Si votre échéance est proche, dites-le-nous : nous traiterons votre demande en priorité.