GARAHai vinto una gara che richiede PunchOut?Scarica il Tender Kit

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

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.

Funzioni, implementazione nel negozio e piano richiesto
SezioneFunzionalitàCosa implementa il tuo e-commerceObbligatorioPiano
2–3Sessione PunchOut (create, edit, inspect) con accesso automaticoEndpoint di clonazione e accesso SSOSìTutte le licenze
4Trasferimento del carrello al sistema di acquistoModulo con invio automatico a PunchOut RocketSìTutte le licenze
5Mappatura delle categorie, ad esempio UNSPSCEndpoint delle categorieConsigliatoTutte le licenze
6Ordini d’acquisto (cXML OrderRequest)Endpoint di creazione degli ordiniFacoltativoPiano Premium
7Conferme d’ordine e avvisi di spedizione (cXML ConfirmationRequest, ShipNoticeRequest)Endpoint dello stato degli ordiniFacoltativo, richiede 6Piano Premium + opzione OC & ASN
8Aggiornamenti immediati degli ordiniNotifica a PunchOut RocketFacoltativo, richiede 7Piano Premium + opzione OC & ASN
–Carrelli predefinitiNulla: 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

Campi del sito per una piattaforma personalizzata
CampoValore
E-commerce PlatformCustom
Site URLURL 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 KeyUn segreto di almeno 10 caratteri. PunchOut Rocket lo invia a ogni chiamata al tuo negozio: il negozio deve conoscere lo stesso valore
Custom Clone EndpointPercorso dell’endpoint di clonazione. Se vuoto: /api/punchout/clone
Custom Categories EndpointPercorso dell’endpoint delle categorie. Se vuoto: /api/punchout/categories
Custom Create Order EndpointPercorso dell’endpoint di creazione degli ordini. Se vuoto: /api/punchout/create-order
Custom Order Status EndpointPercorso dell’endpoint dello stato degli ordini. Se vuoto: /api/punchout/order-status
Use Reverse Proxy, Reverse Proxy URLAttivo 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.

Modulo Add E-commerce Site per una piattaforma personalizzata: Site Name, Site URL, Use Reverse Proxy con Reverse Proxy URL di sola lettura, i quattro endpoint personalizzati, API Key con Generate, DUNS e ANID
Impostazioni del sito e-commerce per una piattaforma personalizzata

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:

Campi dell’end customer che riguardano il tuo negozio
CampoUsato per
E-commerce User to CloneNome 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 UNSPSCCodice categoria usato per i prodotti le cui categorie non hanno un codice associato (sezione 5)
Default Lead TimeTempo di consegna in giorni inviato con ogni articolo OCI (predefinito 3)
EA Override, BX OverrideSostituiscono 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 MappingLe tue categorie, caricate con “Update from e-commerce”, ciascuna associata a un codice (sezione 5)
Shipping Method, Payment MethodInviati 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 secretAbilitano le sezioni 7–8 per questo cliente: URL e segreto sono quelli del sistema di acquisto del cliente
Pagina Edit End Customer con le sezioni General, PunchOut Connection, Cart Defaults, Category Mapping e Orders
Impostazioni dell’end customer

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 POST con 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 esempio Product 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

Endpoint di clonazione: campi della richiesta
CampoTipoSignificato
usernamestring“E-commerce User to Clone” dell’end customer
api_keystringChiave API del sito
session_tokenstringID della sessione PunchOut (BuyerCookie cXML o UUID per OCI). Conservalo: viene restituito nel modulo del carrello (sezione 4)
end_customer_idintegerID dell’end customer in PunchOut Rocket. Conservalo: viene restituito nel modulo del carrello (sezione 4)
operationstringcreate, edit o inspect per cXML; sempre create per OCI
gateway_base_urlstringURL di base di PunchOut Rocket: il modulo del carrello (sezione 4) invia a {gateway_base_url}/start-sso-checkout
selected_itemobject, facoltativoSolo 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_itemsarray, facoltativoSolo cXML edit e inspect: il carrello da ripristinare. Assente se il sistema del cliente non ha inviato articoli
Ogni articolo di cart_items, come restituito dal sistema di acquisto
CampoTipoSignificato
skustringSKU (può essere vuoto)
product_idstringID prodotto nel tuo negozio (può essere vuoto)
quantitystringQuantità, ad esempio "2"
pricestringPrezzo unitario, punto come separatore decimale, ad esempio "15.95". Informativo: il carrello usa i tuoi prezzi attuali
descriptionstringDescrizione del prodotto
currencystringCodice 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.

Endpoint di clonazione: risposte di errore
HTTPQuandoCorpo
400Campi mancanti o non validi{"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"}
401api_key errata{"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"}
422SSO impossibile, ad esempio username non trovato{"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"}
500Errore interno{"status": "error", "error_code": "internal_error", "message": "..."}

3. Accesso SSO

Quando il cliente apre sso_url, il tuo negozio:

  1. consuma il token (monouso) ed effettua l’accesso con l’utente clonato;
  2. per edit e inspect: riempie il carrello esattamente con prodotti e quantità di cart_items, poi mostra il carrello (si applicano i prezzi attuali);
  3. per create: mostra il prodotto selected_item se è 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_url dalla richiesta di clonazione)
  • Metodo: POST, application/x-www-form-urlencoded (normale invio di un modulo del browser)
  • Nessuna api_key: la sessione è identificata da session_token e end_customer_id.
Campi del trasferimento del carrello
CampoObbligatorioSignificato
session_tokenSìDalla richiesta di clonazione
end_customer_idSì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]NoCodice unità UN/CEFACT. Predefinito EA
products[i][manufacturer_name]NoProduttore
products[i][category_ids]NoID 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:

Trasferimento del carrello: risposte di errore
HTTPQuando
400session_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}
  ]
}
Categorie: campi
CampoSignificato
idID categoria nel negozio, intero diverso da 0: gli stessi ID inviati in category_ids (sezione 4)
nameNome visualizzato. Le categorie senza nome vengono ignorate
parent_idID 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.

Category Mapping con il pulsante Update from e-commerce e un albero di categorie con codici UNSPSC
Category Mapping di un end customer

Come viene assegnato il codice a un prodotto del carrello:

  1. il codice associato a una delle sue category_ids;
  2. altrimenti il codice della categoria padre più vicina che ne ha uno;
  3. 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):

Sezione Orders di un end customer con Order request URL, Shipping Method, Payment Method e interruttore Send order status updates con Order status URL e Supplier shared secret
Impostazioni Orders dell’end customer

Corpo della richiesta

Creazione ordini: campi della richiesta
CampoTipoSignificato
api_keystringChiave API del sito
gateway_urlstringURL di base di PunchOut Rocket, per la notifica dello stato (sezione 8)
customer_emailstring“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_idstringNumero PO del cliente. Salvalo nell’ordine: è il riferimento che il cliente conosce
order_datestringData del PO come inviata dal cliente (ISO 8601)
currencystringISO 4217
totalstringTotale del PO, punto come separatore decimale
shipping_methodstringShipping Method dell’end customer. Può essere vuoto: usa il valore predefinito
payment_methodstringPayment Method dell’end customer, ad esempio bonifico bancario. Può essere vuoto: usa il valore predefinito
billing_address, shipping_addressobjectname, 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
itemsarrayRighe del PO, vedi sotto
Creazione ordini: ogni articolo
CampoTipoSignificato
line_numberstringNumero di riga del PO: restituiscilo nella risposta
skustringSKU (cXML SupplierPartID)
product_idstringID prodotto (SupplierPartAuxiliaryID cXML). Può essere vuoto: in tal caso cerca il prodotto tramite sku
quantityintegerQuantità ordinata
unit_pricestringPrezzo unitario nel PO (il prezzo approvato dal cliente), punto come separatore decimale
currencystringISO 4217
descriptionstringDescrizione 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"}
  ]
}
Creazione ordini: campi della risposta
CampoObbligatorioSignificato
statusSìEsattamente success
order_idSì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
itemsConsigliatoPer 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}]
    }
  ]
}
Stato ordini: campi della risposta
CampoObbligatorioSignificato
statusSìEsattamente success
order_statusSìLo stato del tuo ordine associato a uno dei valori seguenti
itemsSìID delle voci ancora presenti nell’ordine. Una voce rimossa dall’ordine non compare qui
quantitiesConsigliatoQuantità 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à
shipmentsConsigliatoUna 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
Valori di order_status
ValoreSignificatoInviato al cliente
pendingRicevuto, non ancora accettatoNulla
processingAccettatoConferma
shippedSpedito, parzialmente o interamenteConferma se non ancora inviata, poi avvisi di spedizione
deliveredConsegnatoCome shipped
cancelledAnnullatoRifiuto 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 cancelled per rifiutare l’ordine.

Le modifiche successive agli articoli non vengono confermate di nuovo: modifica l’ordine prima di accettarlo.

Ogni spedizione
CampoObbligatorioSignificato
idSìID spedizione, univoco nell’ordine e mai riutilizzato: ogni ID viene notificato una sola volta
shipped_atConsigliatoData di spedizione, ISO 8601 con scostamento del fuso orario
carrierNoNome del corriere
trackingNoNumero di tracciamento. Il corriere viene comunicato solo insieme a questo numero
itemsSì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.

Stato ordini: risposte di errore
HTTPQuandoEffetto
404 con {"status": "error", ...}L’ordine non esiste, ad esempio è stato eliminatoRegistrato, ricontrollato al ciclo successivo
Altri stati non 2xxQualsiasi altro erroreRegistrato, 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_url dalla 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

  1. Configura il sito (sezione 1) e inserisci la stessa chiave API nel tuo negozio.
  2. Crea un end customer e imposta il suo “E-commerce User to Clone”.
  3. Fai clic su “Update from e-commerce” nel suo Category Mapping e associa le categorie; imposta un Default UNSPSC.
  4. Prova un PunchOut con il modulo di test cXML nel pannello amministrativo: create, poi edit con un carrello, quindi restituisci il carrello.
  5. Per gli ordini d’acquisto (piano Premium): invia un OrderRequest di test e verifica l’ordine nel negozio.
  6. 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à.