E-commerce personalizzati · sviluppatori
Specifiche di integrazione PunchOut per e-commerce personalizzati
Cosa deve implementare il tuo e-commerce su misura o headless per funzionare con il gateway PunchOut Rocket, con le stesse funzioni dei nostri plugin: sessioni PunchOut con accesso automatico, ritorno del carrello, mappatura delle categorie e, con il piano Premium, ordini d’acquisto, conferme d’ordine e avvisi di spedizione. Il gateway gestisce cXML e OCI con il cliente.
- Le stesse funzioni dei plugin
- JSON tramite HTTPS
- cXML e OCI gestiti dal gateway
In questa pagina
- Cosa implementa il tuo e-commerce
- 1. Configurazione in PunchOut Rocket
- Regole comuni
- 2. Endpoint di clonazione
- 3. Accesso SSO
- 4. Trasferimento del carrello
- 5. Endpoint delle categorie
- 6. Endpoint di creazione degli ordini
- 7. Endpoint dello stato degli ordini
- 8. Notifica dello stato degli ordini
- 9. Controlli prima della messa online
Cosa implementa il tuo e-commerce
Ogni funzione è un piccolo endpoint JSON o un modulo del browser nel tuo negozio. Implementa prima quelli obbligatori; ordini d’acquisto e relativi aggiornamenti possono seguire.
| Sezione | Funzionalità | Cosa implementa il tuo e-commerce | Obbligatorio | Piano |
|---|---|---|---|---|
| 2–3 | Sessione PunchOut (create, edit, inspect) con accesso automatico | Endpoint di clonazione e accesso SSO | Sì | Tutte le licenze |
| 4 | Trasferimento del carrello al sistema di acquisto | Modulo con invio automatico a PunchOut Rocket | Sì | Tutte le licenze |
| 5 | Mappatura delle categorie, ad esempio UNSPSC | Endpoint delle categorie | Consigliato | Tutte le licenze |
| 6 | Ordini d’acquisto (cXML OrderRequest) | Endpoint di creazione degli ordini | Facoltativo | Piano Premium |
| 7 | Conferme d’ordine e avvisi di spedizione (cXML ConfirmationRequest, ShipNoticeRequest) | Endpoint dello stato degli ordini | Facoltativo, richiede 6 | Piano Premium + opzione OC & ASN |
| 8 | Aggiornamenti immediati degli ordini | Notifica a PunchOut Rocket | Facoltativo, richiede 7 | Piano Premium + opzione OC & ASN |
| – | Carrelli predefiniti | Nulla: PunchOut Rocket li mostra al cliente e invia direttamente il carrello scelto al sistema di acquisto | – | Piano Premium |
La prova gratuita include le funzioni del piano Premium. Le conferme d’ordine e gli avvisi di spedizione sono un’opzione del piano Premium (OC & ASN): contattaci per attivarla.
1. Configurazione in PunchOut Rocket
Sito e-commerce
| Campo | Valore |
|---|---|
| E-commerce Platform | Custom |
| Site URL | URL di base del tuo e-commerce, ad esempio https://your-store.example.com. Può includere un percorso (https://example.com/shop); un eventuale / finale viene rimosso |
| API Key | Un segreto di almeno 10 caratteri. PunchOut Rocket lo invia a ogni chiamata al tuo negozio: il negozio deve conoscere lo stesso valore |
| Custom Clone Endpoint | Percorso dell’endpoint di clonazione. Se vuoto: /api/punchout/clone |
| Custom Categories Endpoint | Percorso dell’endpoint delle categorie. Se vuoto: /api/punchout/categories |
| Custom Create Order Endpoint | Percorso dell’endpoint di creazione degli ordini. Se vuoto: /api/punchout/create-order |
| Custom Order Status Endpoint | Percorso dell’endpoint dello stato degli ordini. Se vuoto: /api/punchout/order-status |
| Use Reverse Proxy, Reverse Proxy URL | Attivo per impostazione predefinita. Reverse Proxy URL è di sola lettura e viene generato da Site Name, ad esempio https://your-store.punchoutrocket.com: i clienti aprono il negozio tramite questo indirizzo, evitando problemi SameSite e CORS nei sistemi di acquisto. Lo schema e l’host di sso_url restituito vengono sostituiti con quelli di questo URL; percorso e query vengono mantenuti |
I percorsi degli endpoint vengono aggiunti a Site URL così come sono, quindi devono iniziare con /. Esempio: Site URL https://your-store.example.com + /api/punchout/clone → https://your-store.example.com/api/punchout/clone.

Ordini d’acquisto (sezione 6) e carrelli predefiniti sono inclusi nel piano Premium, compreso nella prova gratuita: il piano li abilita sul sito e la pagina dell’end customer mostra le sezioni Orders e Predefined Carts. Conferme d’ordine e avvisi di spedizione (sezioni 7–8) richiedono anche l’opzione OC & ASN.
End customer / cliente finale
Ogni azienda cliente è un end customer del tuo sito. Oltre alle credenziali del protocollo (identità cXML e shared secret oppure utente e password OCI), questi campi riguardano il tuo negozio:
| Campo | Usato per |
|---|---|
| E-commerce User to Clone | Nome utente (o email) di un utente del tuo negozio. Inviato come username all’endpoint di clonazione e come customer_email per creare l’ordine: gli utenti PunchOut del cliente vengono clonati da questo utente e gli ordini gli vengono associati. Assegnagli i prezzi, gli sconti e gli indirizzi previsti per questo cliente |
| Default UNSPSC | Codice categoria usato per i prodotti le cui categorie non hanno un codice associato (sezione 5) |
| Default Lead Time | Tempo di consegna in giorni inviato con ogni articolo OCI (predefinito 3) |
| EA Override, BX Override | Sostituiscono l’unità di misura EA o BX inviata dal tuo negozio (sezione 4) con il codice atteso dal cliente. Si applicano solo quando il negozio invia quel codice: un’unità vuota diventa EA senza sostituzione |
| Category Mapping | Le tue categorie, caricate con “Update from e-commerce”, ciascuna associata a un codice (sezione 5) |
| Shipping Method, Payment Method | Inviati per creare l’ordine (sezione 6). Lasciali vuoti per usare i valori predefiniti del tuo negozio |
| Send order status updates, Order status URL, Supplier shared secret | Abilitano le sezioni 7–8 per questo cliente: URL e segreto sono quelli del sistema di acquisto del cliente |

Il resto delle pagine del sito e dell’end customer funziona come per le altre piattaforme: consulta la documentazione.
Regole comuni
Si applicano a ogni chiamata di PunchOut Rocket ai tuoi endpoint (sezioni 2, 5, 6 e 7):
- Metodo e formato: sempre
POSTcon corpo JSON (Content-Type: application/json). Rispondi in JSON. - Autenticazione: il corpo contiene sempre
api_key. Confrontalo con la chiave configurata nel negozio e rifiuta la chiamata con HTTP 401 se non corrisponde. - Solo HTTPS.
- Errori: rispondi con uno stato HTTP non 2xx e
{"status": "error", "message": "<reason>"}(error_codeè facoltativo). Rendi esplicito il messaggio, ad esempioProduct X-100 not found: compare nei registri e nelle email di errore inviate al proprietario del sito. - Timeout: le chiamate di creazione e stato degli ordini scadono dopo 30 secondi. Rispondi rapidamente ed esegui le operazioni lente in seguito.
2. Endpoint di clonazione
Percorso predefinito: /api/punchout/clone. Chiamato quando un cliente apre il negozio dal sistema di acquisto. Il negozio crea (o riutilizza) un utente clonato da username, associato a questa sessione PunchOut, e restituisce un URL SSO che lo autentica (sezione 3).
Corpo della richiesta
| Campo | Tipo | Significato |
|---|---|---|
username | string | “E-commerce User to Clone” dell’end customer |
api_key | string | Chiave API del sito |
session_token | string | ID della sessione PunchOut (BuyerCookie cXML o UUID per OCI). Conservalo: viene restituito nel modulo del carrello (sezione 4) |
end_customer_id | integer | ID dell’end customer in PunchOut Rocket. Conservalo: viene restituito nel modulo del carrello (sezione 4) |
operation | string | create, edit o inspect per cXML; sempre create per OCI |
gateway_base_url | string | URL di base di PunchOut Rocket: il modulo del carrello (sezione 4) invia a {gateway_base_url}/start-sso-checkout |
selected_item | object, facoltativo | Solo cXML: il prodotto scelto dal cliente nel catalogo del sistema di acquisto. Contiene supplier_part_id (SKU) e/o supplier_part_auxiliary_id (ID prodotto), solo quelli inviati dal cliente |
cart_items | array, facoltativo | Solo cXML edit e inspect: il carrello da ripristinare. Assente se il sistema del cliente non ha inviato articoli |
| Campo | Tipo | Significato |
|---|---|---|
sku | string | SKU (può essere vuoto) |
product_id | string | ID prodotto nel tuo negozio (può essere vuoto) |
quantity | string | Quantità, ad esempio "2" |
price | string | Prezzo unitario, punto come separatore decimale, ad esempio "15.95". Informativo: il carrello usa i tuoi prezzi attuali |
description | string | Descrizione del prodotto |
currency | string | Codice ISO 4217 |
quantity e price sono stringhe: convertile prima dell’uso.
Richiesta: creazione con un articolo selezionato
{
"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"
}
}Richiesta: edit, con il carrello da ripristinare
{
"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"}
]
}Risposta di esito positivo
HTTP 2xx
HTTP 200
{
"status": "success",
"sso_url": "https://your-store.example.com/punchout/sso?token=eyJ..."
}sso_url è l’unico campo letto: è obbligatorio e deve essere un URL assoluto http:// o https://. PunchOut Rocket indirizza lì il browser del cliente (tramite il sistema di acquisto per cXML, direttamente per OCI).
Risposte di errore
Qualsiasi stato non 2xx o risposta senza un sso_url valido causa il fallimento del PunchOut: il cliente riceve un errore nel sistema di acquisto. La tua risposta (stato e corpo) viene salvata nel registro della sessione PunchOut, quindi spiega il motivo nel messaggio.
| HTTP | Quando | Corpo |
|---|---|---|
| 400 | Campi mancanti o non validi | {"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"} |
| 401 | api_key errata | {"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"} |
| 422 | SSO impossibile, ad esempio username non trovato | {"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"} |
| 500 | Errore interno | {"status": "error", "error_code": "internal_error", "message": "..."} |
3. Accesso SSO
Quando il cliente apre sso_url, il tuo negozio:
- consuma il token (monouso) ed effettua l’accesso con l’utente clonato;
- per
editeinspect: riempie il carrello esattamente con prodotti e quantità dicart_items, poi mostra il carrello (si applicano i prezzi attuali); - per
create: mostra il prodottoselected_itemse è stato inviato ed esiste ancora, altrimenti la pagina iniziale del negozio.
Assegna al token una validità di alcuni minuti, non secondi: quando l’end customer ha carrelli predefiniti, il cliente vede prima la relativa pagina e apre sso_url solo scegliendo di proseguire nel negozio.
4. Trasferimento del carrello (modulo con invio automatico)
Per un utente PunchOut, il pulsante di checkout non deve avviare il normale processo d’ordine: invia invece il carrello a PunchOut Rocket. Il negozio restituisce una pagina HTML che invia automaticamente un modulo nascosto, preferibilmente con un indicatore di caricamento.
- URL:
{gateway_base_url}/start-sso-checkout(gateway_base_urldalla richiesta di clonazione) - Metodo:
POST,application/x-www-form-urlencoded(normale invio di un modulo del browser) - Nessuna
api_key: la sessione è identificata dasession_tokeneend_customer_id.
| Campo | Obbligatorio | Significato |
|---|---|---|
session_token | Sì | Dalla richiesta di clonazione |
end_customer_id | Sì | Dalla richiesta di clonazione |
products[i][sku] | Sì | SKU. Diventa SupplierPartID cXML o il codice materiale fornitore OCI |
products[i][product_id] | Sì | ID prodotto nel tuo negozio. Diventa SupplierPartAuxiliaryID cXML: il cliente lo restituisce in edit e negli ordini d’acquisto |
products[i][description] | Sì | Nome o descrizione del prodotto. I tag HTML vengono rimossi |
products[i][quantity] | Sì | Quantità, punto come separatore decimale |
products[i][price] | Sì | Prezzo unitario, punto come separatore decimale, senza separatore delle migliaia |
products[i][currency] | Sì | Codice ISO 4217 |
products[i][unit_of_measure] | No | Codice unità UN/CEFACT. Predefinito EA |
products[i][manufacturer_name] | No | Produttore |
products[i][category_ids] | No | ID separati da virgole delle categorie a cui il prodotto appartiene direttamente (foglie dell’albero), come restituiti dall’endpoint delle categorie (sezione 5). Servono a individuare l’UNSPSC del prodotto |
i parte da 0 e non ha interruzioni: PunchOut Rocket smette di leggere al primo indice mancante. Ricorda di applicare l’escape HTML ai valori.
Esempio di pagina restituita al checkout
<!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 invia quindi il carrello al sistema di acquisto e termina la sessione. Ogni sessione accetta un solo carrello:
| HTTP | Quando |
|---|---|
| 400 | session_token o end_customer_id mancanti o non validi, oppure nessuna sessione corrispondente |
| 409 | È già stato inviato un carrello per questa sessione |
5. Endpoint delle categorie
Percorso predefinito: /api/punchout/categories. Chiamato quando il proprietario del sito fa clic su “Update from e-commerce” nel Category Mapping di un end customer. Le categorie vengono poi associate manualmente ai codici del cliente, ad esempio UNSPSC.
Richiesta
{"api_key": "site-api-key-abc"}Esito positivo: HTTP 200, status success oppure 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}
]
}| Campo | Significato |
|---|---|
id | ID categoria nel negozio, intero diverso da 0: gli stessi ID inviati in category_ids (sezione 4) |
name | Nome visualizzato. Le categorie senza nome vengono ignorate |
parent_id | ID della categoria padre, 0 per quelle di primo livello |
Restituisci l’intero albero in una sola risposta. Ogni aggiornamento allinea l’elenco dell’end customer alla risposta: le categorie non più restituite vengono rimosse insieme al codice associato, quindi mantieni stabili gli ID.

Come viene assegnato il codice a un prodotto del carrello:
- il codice associato a una delle sue
category_ids; - altrimenti il codice della categoria padre più vicina che ne ha uno;
- altrimenti il Default UNSPSC dell’end customer.
6. Endpoint di creazione degli ordini
Percorso predefinito: /api/punchout/create-order. Chiamato quando il sistema di acquisto del cliente invia un ordine d’acquisto (cXML OrderRequest). Il negozio crea l’ordine e restituisce il suo ID e l’ID della voce d’ordine creata per ogni riga del PO. PunchOut Rocket risponde al sistema di acquisto con l’esito. Richiede il piano Premium.
Il cliente invia gli ordini d’acquisto all’“Order request URL” mostrato nella sezione Orders dell’end customer, dove si impostano Shipping Method, Payment Method e gli aggiornamenti dello stato degli ordini (sezione 7):

Corpo della richiesta
| Campo | Tipo | Significato |
|---|---|---|
api_key | string | Chiave API del sito |
gateway_url | string | URL di base di PunchOut Rocket, per la notifica dello stato (sezione 8) |
customer_email | string | “E-commerce User to Clone” dell’end customer (lo stesso valore di username nella richiesta di clonazione, quindi potrebbe non essere un’email): associa l’ordine a questo utente |
order_id | string | Numero PO del cliente. Salvalo nell’ordine: è il riferimento che il cliente conosce |
order_date | string | Data del PO come inviata dal cliente (ISO 8601) |
currency | string | ISO 4217 |
total | string | Totale del PO, punto come separatore decimale |
shipping_method | string | Shipping Method dell’end customer. Può essere vuoto: usa il valore predefinito |
payment_method | string | Payment Method dell’end customer, ad esempio bonifico bancario. Può essere vuoto: usa il valore predefinito |
billing_address, shipping_address | object | name, street (più righe separate da \n, ad esempio una riga “Attn:” prima della via), city, state, postal_code, country_code (ISO 3166-1 alpha-2), email. I campi non presenti nel PO sono stringhe vuote |
items | array | Righe del PO, vedi sotto |
| Campo | Tipo | Significato |
|---|---|---|
line_number | string | Numero di riga del PO: restituiscilo nella risposta |
sku | string | SKU (cXML SupplierPartID) |
product_id | string | ID prodotto (SupplierPartAuxiliaryID cXML). Può essere vuoto: in tal caso cerca il prodotto tramite sku |
quantity | integer | Quantità ordinata |
unit_price | string | Prezzo unitario nel PO (il prezzo approvato dal cliente), punto come separatore decimale |
currency | string | ISO 4217 |
description | string | Descrizione della riga |
Richiesta
{
"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"}
]
}Risposta di esito positivo
HTTP 2xx
HTTP 200
{
"status": "success",
"order_id": "100045",
"items": [
{"line_number": "1", "order_item_id": "5501"},
{"line_number": "2", "order_item_id": "5502"}
]
}| Campo | Obbligatorio | Significato |
|---|---|---|
status | Sì | Esattamente success |
order_id | Sì | ID ordine nel tuo negozio: PunchOut Rocket lo passa all’endpoint dello stato degli ordini (sezione 7). Deve restare invariato per tutta la vita dell’ordine |
items | Consigliato | Per ogni riga del PO creata, l’ID della relativa voce d’ordine (gli stessi ID restituiti dall’endpoint dello stato). Se due righe diventano la stessa voce d’ordine (stesso prodotto), elenca entrambi i valori line_number con quell’order_item_id |
items permette a PunchOut Rocket di confermare il PO e notificare le spedizioni riga per riga. Senza questo campo non si possono comunicare conferme e spedizioni parziali: l’ordine viene confermato per intero e viene notificata solo la prima spedizione, come spedizione completa.
Errori
Qualsiasi stato non 2xx o un status diverso da success indica che l’ordine non è stato creato: il sistema di acquisto riceve un errore e il proprietario del sito un’email con il tuo messaggio. Casi tipici: customer_email non trovato, prodotto non trovato, impossibilità di creare l’ordine.
Se un prodotto non viene trovato, puoi invece creare l’ordine senza quel prodotto e omettere il suo line_number da items: quella riga viene poi rifiutata nella conferma d’ordine.
PunchOut Rocket non rileva un PO inviato due volte: se nel negozio esiste già un ordine per questo order_id e utente, restituiscilo invece di crearne un secondo.
7. Endpoint dello stato degli ordini
Percorso predefinito: /api/punchout/order-status. Chiamato solo per gli end customer con “Send order status updates” attivo, per gli ordini creati tramite la sezione 6: ogni ora per 60 giorni dall’ordine e subito dopo una notifica (sezione 8). Richiede l’opzione OC & ASN. Dalla risposta, PunchOut Rocket invia al sistema di acquisto del cliente:
- una conferma d’ordine (cXML ConfirmationRequest), una sola volta, quando l’ordine viene accettato o annullato;
- un avviso di spedizione (cXML ShipNoticeRequest) per ogni nuova spedizione di un ordine confermato.
PunchOut Rocket ricorda cosa ha inviato: rispondi sempre con lo stato attuale dell’ordine e PunchOut Rocket individua le novità.
Richiesta: order_id è quello restituito dall’endpoint di creazione degli ordini
{"api_key": "site-api-key-abc", "order_id": "100045"}Risposta di esito positivo
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}]
}
]
}| Campo | Obbligatorio | Significato |
|---|---|---|
status | Sì | Esattamente success |
order_status | Sì | Lo stato del tuo ordine associato a uno dei valori seguenti |
items | Sì | ID delle voci ancora presenti nell’ordine. Una voce rimossa dall’ordine non compare qui |
quantities | Consigliato | Quantità attuale di ogni voce d’ordine. Senza questo campo, una voce ancora presente è considerata comprensiva delle intere quantità delle sue righe PO: non è possibile comunicare una riduzione della quantità |
shipments | Consigliato | Una voce per ogni spedizione inviata. Vuoto ([]) se il negozio non tiene traccia delle spedizioni: in tal caso vengono inviate solo le conferme, senza avvisi di spedizione |
| Valore | Significato | Inviato al cliente |
|---|---|---|
pending | Ricevuto, non ancora accettato | Nulla |
processing | Accettato | Conferma |
shipped | Spedito, parzialmente o interamente | Conferma se non ancora inviata, poi avvisi di spedizione |
delivered | Consegnato | Come shipped |
cancelled | Annullato | Rifiuto dell’intero ordine, anche dopo una conferma. Definitivo: l’ordine non viene più controllato |
La conferma viene inviata una sola volta, la prima volta che l’ordine è processing, shipped o delivered:
- accetta l’intero ordine quando ogni riga del PO è presente per intero;
- altrimenti accetta ogni riga per la quantità presente nell’ordine e rifiuta il resto (articoli rimossi, quantità ridotte). Una quantità superiore al PO viene confermata per la quantità del PO;
- se non resta alcuna riga, non viene inviato nulla: usa
cancelledper rifiutare l’ordine.
Le modifiche successive agli articoli non vengono confermate di nuovo: modifica l’ordine prima di accettarlo.
| Campo | Obbligatorio | Significato |
|---|---|---|
id | Sì | ID spedizione, univoco nell’ordine e mai riutilizzato: ogni ID viene notificato una sola volta |
shipped_at | Consigliato | Data di spedizione, ISO 8601 con scostamento del fuso orario |
carrier | No | Nome del corriere |
tracking | No | Numero di tracciamento. Il corriere viene comunicato solo insieme a questo numero |
items | Sì | Voci d’ordine di questa spedizione e quantità spedita (order_item_id dalla creazione dell’ordine). Una spedizione senza articoli del PO non viene notificata |
Comunica una spedizione solo dopo la partenza. Le modifiche a una spedizione già notificata non vengono inviate di nuovo. Se il sistema di acquisto rifiuta una conferma o un avviso di spedizione, PunchOut Rocket lo reinvia al controllo successivo e non invia nulla di successivo finché non viene accettato.
| HTTP | Quando | Effetto |
|---|---|---|
404 con {"status": "error", ...} | L’ordine non esiste, ad esempio è stato eliminato | Registrato, ricontrollato al ciclo successivo |
| Altri stati non 2xx | Qualsiasi altro errore | Registrato, ricontrollato al ciclo successivo |
8. Notifica dello stato degli ordini (facoltativa)
Senza questa notifica, PunchOut Rocket legge lo stato degli ordini ogni ora. Per inviare conferme e avvisi di spedizione in pochi secondi, notifica PunchOut Rocket ogni volta che cambia un ordine creato tramite la sezione 6 (stato, articoli, nuova spedizione):
- URL:
{gateway_url}/order-status-changed(gateway_urldalla richiesta di creazione dell’ordine) - Metodo:
POST,Content-Type: application/json - Nessuna autenticazione: la notifica non trasporta dati, fa soltanto chiamare a PunchOut Rocket il tuo endpoint dello stato degli ordini (sezione 7) per quell’ordine.
Notifica e risposta
POST {gateway_url}/order-status-changed
Content-Type: application/json
{"order_id": "100045"}
HTTP 202
{"status": "queued"}Inviala dopo aver salvato la modifica, senza far attendere l’utente (fire and forget, timeout breve). Gli errori possono essere ignorati: il controllo orario recupera gli aggiornamenti.
9. Controlli prima della messa online
- Configura il sito (sezione 1) e inserisci la stessa chiave API nel tuo negozio.
- Crea un end customer e imposta il suo “E-commerce User to Clone”.
- Fai clic su “Update from e-commerce” nel suo Category Mapping e associa le categorie; imposta un Default UNSPSC.
- Prova un PunchOut con il modulo di test cXML nel pannello amministrativo: create, poi edit con un carrello, quindi restituisci il carrello.
- Per gli ordini d’acquisto (piano Premium): invia un OrderRequest di test e verifica l’ordine nel negozio.
- Per gli aggiornamenti di stato (opzione OC & ASN): attiva “Send order status updates” sull’end customer, fai passare l’ordine di test attraverso i tuoi stati e verifica che il sistema del cliente riceva la conferma e gli avvisi di spedizione.
Ricorda:
- Gli utenti PunchOut non devono completare un checkout nel tuo negozio: il carrello torna al sistema di acquisto (sezione 4) e l’ordine arriva in seguito tramite la sezione 6.
- Gli ordini ricevuti tramite la sezione 6 sono già approvati dal sistema di acquisto del cliente: non richiedono un pagamento online.
Ti serve un cliente di test o una revisione dell’implementazione? Parla con i nostri sviluppatori, oppure affida lo sviluppo a noi con Go-Live Assist.
FAQ
Domande sull’integrazione
Quali campi devo impostare in PunchOut Rocket?
Con E-commerce Platform impostato su Custom: Site URL e API Key. I quattro percorsi degli endpoint (clonazione, categorie, creazione ordini, stato ordini) servono solo se non usi quelli predefiniti.
Serve l’endpoint delle categorie?
È consigliato. Permette di associare le categorie ai codici richiesti dai clienti, ad esempio UNSPSC; senza di esso ogni prodotto riceve il Default UNSPSC dell’end customer.
Il link SSO può essere riutilizzato?
No. Il token deve funzionare una sola volta, tramite HTTPS. Assegna una validità di alcuni minuti, non secondi: con i carrelli predefiniti il cliente apre il link solo dopo aver scelto di proseguire nel negozio.
Come arrivano gli ordini d’acquisto a un e-commerce personalizzato?
Tramite il tuo endpoint di creazione degli ordini: il gateway riceve il cXML OrderRequest del cliente e lo invia al negozio come JSON. È incluso nel piano Premium, compreso nella prova gratuita.
Il mio negozio può inviare conferme d’ordine e avvisi di spedizione?
Sì, con l’opzione OC & ASN del piano Premium (contattaci per attivarla). Implementa l’endpoint dello stato degli ordini: il gateway legge lo stato di ogni ordine e invia cXML ConfirmationRequest e ShipNoticeRequest al sistema del cliente.
Prova gratuita di 30 giorni · senza carta di credito
Il tuo cliente aspetta. È ora di partire.
Installa il plugin oggi ed esegui la prima sessione di test questo pomeriggio. Se la scadenza è vicina, diccelo: gestiremo la tua richiesta con priorità.