PRZETARGWygrali Państwo przetarg wymagający PunchOut?Pobierz Tender Kit

Dedykowane e-commerce · programiści

Specyfikacja integracji PunchOut dla sklepów dedykowanych

Co sklep dedykowany lub headless musi zaimplementować, aby współpracować z bramką PunchOut Rocket z tymi samymi funkcjami co nasze wtyczki: sesje PunchOut z automatycznym logowaniem, zwrot koszyka, mapowanie kategorii, a w planie Premium zamówienia zakupu, potwierdzenia zamówień i awiza wysyłki. Bramka obsługuje cXML i OCI po stronie klienta.

  • Te same funkcje co we wtyczkach
  • JSON przez HTTPS
  • cXML i OCI obsługiwane przez bramkę

Co implementuje sklep

Każda funkcja to niewielki endpoint JSON lub formularz przeglądarki w sklepie. Najpierw należy wdrożyć wymagane elementy; zamówienia zakupu i ich aktualizacje mogą pojawić się później.

Funkcje, implementacja w sklepie i wymagany plan
SekcjaFunkcjaCo implementuje sklepWymaganePlan
2–3Sesja PunchOut (create, edit, inspect) z automatycznym logowaniemEndpoint klonowania i logowanie SSOTakWszystkie licencje
4Przesyłanie koszyka z powrotem do systemu zakupowegoFormularz automatycznego wysyłania do PunchOut RocketTakWszystkie licencje
5Mapowanie kategorii, np. UNSPSCEndpoint kategoriiZalecaneWszystkie licencje
6Zamówienia zakupu (cXML OrderRequest)Endpoint tworzenia zamówieńOpcjonalniePlan Premium
7Potwierdzenia zamówień i awiza wysyłki (cXML ConfirmationRequest, ShipNoticeRequest)Endpoint stanu zamówieńOpcjonalnie, wymaga 6Plan Premium + opcja OC & ASN
8Natychmiastowe aktualizacje zamówieńPowiadomienie do PunchOut RocketOpcjonalnie, wymaga 7Plan Premium + opcja OC & ASN
–Predefiniowane koszykiNic: PunchOut Rocket pokazuje je klientowi i sam wysyła wybrany koszyk do systemu zakupowego–Plan Premium

Bezpłatny okres próbny obejmuje funkcje planu Premium. Potwierdzenia zamówień i awiza wysyłki są opcją planu Premium (OC & ASN): prosimy o kontakt w celu aktywacji.

1. Konfiguracja w PunchOut Rocket

Witryna sklepu

Pola witryny dla platformy dedykowanej
PoleWartość
E-commerce PlatformCustom
Site URLBazowy adres URL sklepu, np. https://your-store.example.com. Może zawierać ścieżkę (https://example.com/shop); końcowy / jest usuwany
API KeySekret o długości co najmniej 10 znaków. PunchOut Rocket wysyła go przy każdym wywołaniu sklepu: sklep musi znać tę samą wartość
Custom Clone EndpointŚcieżka endpointu klonowania. Puste: /api/punchout/clone
Custom Categories EndpointŚcieżka endpointu kategorii. Puste: /api/punchout/categories
Custom Create Order EndpointŚcieżka endpointu tworzenia zamówień. Puste: /api/punchout/create-order
Custom Order Status EndpointŚcieżka endpointu stanu zamówień. Puste: /api/punchout/order-status
Use Reverse Proxy, Reverse Proxy URLDomyślnie włączone. Reverse Proxy URL jest tylko do odczytu i powstaje z Site Name, np. https://your-store.punchoutrocket.com: klienci otwierają sklep przez ten adres, co omija problemy SameSite i CORS w systemach zakupowych. Schemat i host zwróconego sso_url są zastępowane schematem i hostem tego adresu; ścieżka i zapytanie pozostają

Ścieżki endpointów są dołączane do Site URL bez zmian, więc muszą zaczynać się od /. Przykład: Site URL https://your-store.example.com + /api/punchout/clone → https://your-store.example.com/api/punchout/clone.

Formularz Add E-commerce Site dla platformy dedykowanej: Site Name, Site URL, Use Reverse Proxy z Reverse Proxy URL tylko do odczytu, cztery dedykowane endpointy, API Key z Generate, DUNS i ANID
Ustawienia witryny sklepu dla platformy dedykowanej

Zamówienia zakupu (sekcja 6) i predefiniowane koszyki obejmuje plan Premium, także w bezpłatnym okresie próbnym: plan włącza je w witrynie, a strona klienta końcowego pokazuje sekcje Orders i Predefined Carts. Potwierdzenia i awiza wysyłki (sekcje 7–8) wymagają też opcji OC & ASN.

Klient końcowy

Każda firma kupująca jest klientem końcowym witryny. Oprócz danych protokołu (tożsamości cXML i shared secret lub użytkownik i hasło OCI) te pola dotyczą sklepu:

Pola klienta końcowego dotyczące sklepu
PoleZastosowanie
E-commerce User to CloneNazwa użytkownika (lub email) użytkownika sklepu. Wysyłana jako username do endpointu klonowania i jako customer_email przy tworzeniu zamówienia: użytkownicy PunchOut klienta są z niego klonowani, a zamówienia przypisywane do niego. Należy nadać mu ceny, rabaty i adresy przewidziane dla tego klienta
Default UNSPSCKod kategorii używany dla produktów, których kategorie nie mają przypisanego kodu (sekcja 5)
Default Lead TimeCzas dostawy w dniach wysyłany z każdym artykułem OCI (domyślnie 3)
EA Override, BX OverrideZastępują jednostkę miary EA lub BX wysłaną przez sklep (sekcja 4) kodem oczekiwanym przez klienta. Działają tylko wtedy, gdy sklep wysyła ten kod: pusta jednostka staje się EA bez nadpisania
Category MappingKategorie załadowane przez „Update from e-commerce”, każda przypisana do kodu (sekcja 5)
Shipping Method, Payment MethodWysyłane przy tworzeniu zamówienia (sekcja 6). Puste pola pozwalają sklepowi użyć wartości domyślnych
Send order status updates, Order status URL, Supplier shared secretWłączają sekcje 7–8 dla klienta: adres URL i sekret należą do jego systemu zakupowego
Strona Edit End Customer z sekcjami General, PunchOut Connection, Cart Defaults, Category Mapping i Orders
Ustawienia klienta końcowego

Pozostałe części stron witryny i klienta końcowego działają jak dla innych platform: zobacz dokumentację.

Wspólne reguły

Dotyczą każdego wywołania endpointów przez PunchOut Rocket (sekcje 2, 5, 6 i 7):

  • Metoda i format: zawsze POST z treścią JSON (Content-Type: application/json). Odpowiedź w JSON.
  • Uwierzytelnianie: treść zawsze zawiera api_key. Należy porównać go z kluczem skonfigurowanym w sklepie i odrzucić wywołanie kodem HTTP 401, jeśli nie pasuje.
  • Tylko HTTPS.
  • Błędy: odpowiedź powinna zawierać status HTTP spoza 2xx i {"status": "error", "message": "<reason>"} (error_code jest opcjonalny). Komunikat powinien być jednoznaczny, np. Product X-100 not found: trafia do dzienników i emaili o błędach do właściciela witryny.
  • Limity czasu: wywołania tworzenia i stanu zamówień kończą oczekiwanie po 30 sekundach. Należy szybko odpowiedzieć, a wolne zadania wykonać później.

2. Endpoint klonowania

Ścieżka domyślna: /api/punchout/clone. Wywoływany, gdy klient otwiera sklep z systemu zakupowego. Sklep tworzy (lub wykorzystuje ponownie) użytkownika sklonowanego z username, powiązanego z tą sesją PunchOut, i zwraca adres SSO logujący tego użytkownika (sekcja 3).

Treść żądania

Endpoint klonowania: pola żądania
PoleTypZnaczenie
usernamestring„E-commerce User to Clone” klienta końcowego
api_keystringKlucz API witryny
session_tokenstringID sesji PunchOut (cXML BuyerCookie lub UUID dla OCI). Należy zachować: wraca w formularzu koszyka (sekcja 4)
end_customer_idintegerID klienta końcowego w PunchOut Rocket. Należy zachować: wraca w formularzu koszyka (sekcja 4)
operationstringcreate, edit lub inspect dla cXML; zawsze create dla OCI
gateway_base_urlstringBazowy URL PunchOut Rocket: formularz koszyka (sekcja 4) wysyła do {gateway_base_url}/start-sso-checkout
selected_itemobject, opcjonalnieTylko cXML: produkt wybrany przez klienta w katalogu systemu zakupowego. Zawiera supplier_part_id (SKU) i/lub supplier_part_auxiliary_id (ID produktu), tylko wartości wysłane przez klienta
cart_itemsarray, opcjonalnieTylko cXML edit i inspect: koszyk do odtworzenia. Brak, gdy system klienta nie wysłał artykułów
Każdy artykuł cart_items, tak jak odesłał go system zakupowy
PoleTypZnaczenie
skustringSKU (może być puste)
product_idstringID produktu w sklepie (może być puste)
quantitystringIlość, np. "2"
pricestringCena jednostkowa, kropka jako separator dziesiętny, np. "15.95". Informacyjnie: koszyk używa aktualnych cen sklepu
descriptionstringOpis produktu
currencystringKod ISO 4217

quantity i price są ciągami znaków: należy przekonwertować je przed użyciem.

Żądanie: utworzenie z wybranym artykułem

{
  "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"
  }
}

Żądanie: edit, z koszykiem do odtworzenia

{
  "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"}
  ]
}

Odpowiedź powodzenia

HTTP 2xx

HTTP 200
{
  "status": "success",
  "sso_url": "https://your-store.example.com/punchout/sso?token=eyJ..."
}

sso_url to jedyne odczytywane pole: jest wymagane i musi być bezwzględnym adresem http:// lub https://. PunchOut Rocket kieruje tam przeglądarkę klienta (przez system zakupowy dla cXML, bezpośrednio dla OCI).

Odpowiedzi błędów

Każdy status spoza 2xx lub odpowiedź bez prawidłowego sso_url powoduje błąd PunchOut: klient otrzymuje błąd w systemie zakupowym. Odpowiedź (status i treść) jest zapisywana w dzienniku sesji PunchOut, więc komunikat powinien wyjaśniać przyczynę.

Endpoint klonowania: odpowiedzi błędów
HTTPKiedyTreść
400Brakujące lub nieprawidłowe pola{"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"}
401Nieprawidłowy api_key{"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"}
422SSO niemożliwe, np. nie znaleziono username{"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"}
500Błąd wewnętrzny{"status": "error", "error_code": "internal_error", "message": "..."}

3. Logowanie SSO

Gdy klient otwiera sso_url, sklep:

  1. zużywa token (jednorazowy) i loguje sklonowanego użytkownika;
  2. dla edit i inspect: wypełnia koszyk dokładnie produktami i ilościami z cart_items, a następnie pokazuje koszyk (obowiązują aktualne ceny);
  3. dla create: pokazuje produkt selected_item, jeśli został wysłany i nadal istnieje, w przeciwnym razie stronę główną sklepu.

Token powinien być ważny kilka minut, nie sekund: gdy klient końcowy ma predefiniowane koszyki, najpierw widzi ich stronę, a sso_url otwiera dopiero po wybraniu przejścia do sklepu.

4. Przesyłanie koszyka (formularz automatycznego wysyłania)

Dla użytkownika PunchOut przycisk składania zamówienia nie może uruchamiać zwykłego procesu: wysyła koszyk do PunchOut Rocket. Sklep zwraca stronę HTML automatycznie wysyłającą ukryty formularz, najlepiej ze wskaźnikiem ładowania.

  • URL: {gateway_base_url}/start-sso-checkout (gateway_base_url z żądania klonowania)
  • Metoda: POST, application/x-www-form-urlencoded (zwykłe wysłanie formularza przeglądarki)
  • Bez api_key: sesję identyfikują session_token i end_customer_id.
Pola przesyłania koszyka
PoleWymaganeZnaczenie
session_tokenTakZ żądania klonowania
end_customer_idTakZ żądania klonowania
products[i][sku]TakSKU. Staje się cXML SupplierPartID lub numerem materiału dostawcy OCI
products[i][product_id]TakID produktu w sklepie. Staje się cXML SupplierPartAuxiliaryID: klient odsyła go w edit i zamówieniach zakupu
products[i][description]TakNazwa lub opis produktu. Tagi HTML są usuwane
products[i][quantity]TakIlość, kropka jako separator dziesiętny
products[i][price]TakCena jednostkowa, kropka jako separator dziesiętny, bez separatora tysięcy
products[i][currency]TakKod ISO 4217
products[i][unit_of_measure]NieKod jednostki UN/CEFACT. Domyślnie EA
products[i][manufacturer_name]NieProducent
products[i][category_ids]NieID kategorii, do których produkt należy bezpośrednio (liście drzewa), rozdzielone przecinkami, jak zwrócone przez endpoint kategorii (sekcja 5). Służą do znalezienia UNSPSC produktu

i zaczyna się od 0 i nie ma luk: PunchOut Rocket kończy odczyt przy pierwszym brakującym indeksie. Należy pamiętać o kodowaniu znaków specjalnych HTML w wartościach.

Przykładowa strona zwracana przy składaniu zamówienia

<!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 wysyła koszyk do systemu zakupowego i kończy sesję. Sesja przyjmuje tylko jeden koszyk:

Przesyłanie koszyka: odpowiedzi błędów
HTTPKiedy
400Brak lub nieprawidłowy session_token albo end_customer_id, lub brak pasującej sesji
409Koszyk został już wysłany dla tej sesji

5. Endpoint kategorii

Ścieżka domyślna: /api/punchout/categories. Wywoływany, gdy właściciel witryny klika „Update from e-commerce” w Category Mapping klienta końcowego. Kategorie są następnie ręcznie mapowane na kody klienta, np. UNSPSC.

Żądanie

{"api_key": "site-api-key-abc"}

Powodzenie: HTTP 200, status success lub 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}
  ]
}
Kategorie: pola
PoleZnaczenie
idID kategorii w sklepie, liczba całkowita różna od 0: te same ID co w category_ids (sekcja 4)
nameNazwa wyświetlana. Kategorie bez nazwy są pomijane
parent_idID kategorii nadrzędnej, 0 dla kategorii najwyższego poziomu

Należy zwrócić całe drzewo w jednej odpowiedzi. Każda aktualizacja dopasowuje listę klienta końcowego do odpowiedzi: kategorie już niezwracane są usuwane wraz z przypisanym kodem, więc ID powinny pozostawać stałe.

Category Mapping z przyciskiem Update from e-commerce i drzewem kategorii z kodami UNSPSC
Category Mapping klienta końcowego

Jak produkt koszyka otrzymuje kod:

  1. kod przypisany do jednego z jego category_ids;
  2. w przeciwnym razie kod najbliższej kategorii nadrzędnej, która go ma;
  3. w przeciwnym razie Default UNSPSC klienta końcowego.

6. Endpoint tworzenia zamówień

Ścieżka domyślna: /api/punchout/create-order. Wywoływany, gdy system zakupowy klienta wysyła zamówienie zakupu (cXML OrderRequest). Sklep tworzy zamówienie i zwraca jego ID oraz ID pozycji zamówienia utworzonej dla każdego wiersza PO. PunchOut Rocket odpowiada systemowi zakupowemu wynikiem. Wymaga plan Premium.

Klient wysyła zamówienia zakupu na „Order request URL” w sekcji Orders klienta końcowego, gdzie ustawia się Shipping Method, Payment Method i aktualizacje stanu zamówień (sekcja 7):

Sekcja Orders klienta końcowego z Order request URL, Shipping Method, Payment Method i przełącznikiem Send order status updates z Order status URL i Supplier shared secret
Ustawienia Orders klienta końcowego

Treść żądania

Tworzenie zamówień: pola żądania
PoleTypZnaczenie
api_keystringKlucz API witryny
gateway_urlstringBazowy URL PunchOut Rocket dla powiadomienia o stanie (sekcja 8)
customer_emailstring„E-commerce User to Clone” klienta końcowego (ta sama wartość co username w żądaniu klonowania, więc nie musi być emailem): zamówienie należy przypisać temu użytkownikowi
order_idstringNumer PO klienta. Należy zapisać go w zamówieniu: to referencja znana klientowi
order_datestringData PO wysłana przez klienta (ISO 8601)
currencystringISO 4217
totalstringSuma PO, kropka jako separator dziesiętny
shipping_methodstringShipping Method klienta końcowego. Może być puste: należy użyć wartości domyślnej
payment_methodstringPayment Method klienta końcowego, np. przelew. Może być puste: należy użyć wartości domyślnej
billing_address, shipping_addressobjectname, street (kilka linii rozdzielonych \n, np. linia „Attn:” przed ulicą), city, state, postal_code, country_code (ISO 3166-1 alpha-2), email. Pola nieobecne w PO są pustymi ciągami znaków
itemsarrayWiersze PO, zobacz poniżej
Tworzenie zamówień: każdy artykuł
PoleTypZnaczenie
line_numberstringNumer wiersza PO: należy zwrócić go w odpowiedzi
skustringSKU (cXML SupplierPartID)
product_idstringID produktu (cXML SupplierPartAuxiliaryID). Może być puste: wtedy produkt należy znaleźć przez sku
quantityintegerZamówiona ilość
unit_pricestringCena jednostkowa w PO (zatwierdzona przez klienta), kropka jako separator dziesiętny
currencystringISO 4217
descriptionstringOpis wiersza

Żądanie

{
  "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"}
  ]
}

Odpowiedź powodzenia

HTTP 2xx

HTTP 200
{
  "status": "success",
  "order_id": "100045",
  "items": [
    {"line_number": "1", "order_item_id": "5501"},
    {"line_number": "2", "order_item_id": "5502"}
  ]
}
Tworzenie zamówień: pola odpowiedzi
PoleWymaganeZnaczenie
statusTakDokładnie success
order_idTakID zamówienia w sklepie: PunchOut Rocket przekazuje je do endpointu stanu zamówień (sekcja 7). Nie może się zmieniać przez cały czas istnienia zamówienia
itemsZalecaneDla każdego utworzonego wiersza PO — ID jego pozycji zamówienia (te same ID, które zwraca endpoint stanu). Jeśli dwa wiersze stają się tą samą pozycją (ten sam produkt), należy podać obie wartości line_number z tym samym order_item_id

items pozwala PunchOut Rocket potwierdzać PO i zgłaszać wysyłki wiersz po wierszu. Bez niego nie można zgłaszać częściowych potwierdzeń ani wysyłek: zamówienie jest potwierdzane w całości, a zgłaszana jest tylko pierwsza wysyłka jako pełna dostawa.

Błędy

Każdy status spoza 2xx lub status inny niż success oznacza, że zamówienie nie zostało utworzone: system zakupowy otrzymuje błąd, a właściciel witryny email z komunikatem. Typowe przypadki: nie znaleziono customer_email, nie znaleziono produktu, nie można utworzyć zamówienia.

Jeśli produktu nie znaleziono, można utworzyć zamówienie bez niego i pominąć jego line_number w items: ten wiersz zostanie odrzucony w potwierdzeniu zamówienia.

PunchOut Rocket nie wykrywa dwukrotnie wysłanego PO: jeśli sklep ma już zamówienie dla tego order_id i użytkownika, należy zwrócić je zamiast tworzyć drugie.

7. Endpoint stanu zamówień

Ścieżka domyślna: /api/punchout/order-status. Wywoływany tylko dla klientów końcowych z włączonym „Send order status updates”, dla zamówień utworzonych przez sekcję 6: co godzinę przez 60 dni od zamówienia i od razu po powiadomieniu (sekcja 8). Wymaga opcji OC & ASN. Na podstawie odpowiedzi PunchOut Rocket wysyła do systemu zakupowego klienta:

  • potwierdzenie zamówienia (cXML ConfirmationRequest), jednorazowo, gdy zamówienie jest przyjęte lub anulowane;
  • awizo wysyłki (cXML ShipNoticeRequest) dla każdej nowej wysyłki potwierdzonego zamówienia.

PunchOut Rocket pamięta, co wysłał: należy zawsze odpowiadać aktualnym stanem zamówienia, a PunchOut Rocket ustali, co jest nowe.

Żądanie: order_id to identyfikator zwrócony przez endpoint tworzenia zamówień

{"api_key": "site-api-key-abc", "order_id": "100045"}

Odpowiedź powodzenia

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}]
    }
  ]
}
Stan zamówień: pola odpowiedzi
PoleWymaganeZnaczenie
statusTakDokładnie success
order_statusTakStan zamówienia zmapowany na jedną z poniższych wartości
itemsTakID pozycji nadal obecnych w zamówieniu. Usunięta pozycja nie występuje tutaj
quantitiesZalecaneAktualna ilość każdej pozycji. Bez niej pozycja nadal obecna jest traktowana jako zawierająca pełne ilości jej wierszy PO: nie można zgłosić zmniejszonej ilości
shipmentsZalecaneJeden wpis na wysłaną przesyłkę. Puste ([]), gdy sklep nie śledzi wysyłek: wtedy wysyłane są tylko potwierdzenia, bez awiz
Wartości order_status
WartośćZnaczenieWysyłane do klienta
pendingOdebrane, jeszcze nieprzyjęteNic
processingPrzyjętePotwierdzenie
shippedWysłane częściowo lub w całościPotwierdzenie, jeśli jeszcze nie wysłano, a następnie awiza wysyłki
deliveredDostarczoneTak samo jak shipped
cancelledAnulowaneOdrzucenie całego zamówienia, także po potwierdzeniu. Ostateczne: zamówienie nie jest już sprawdzane

Potwierdzenie jest wysyłane raz, gdy zamówienie po raz pierwszy ma stan processing, shipped lub delivered:

  • akceptuje całe zamówienie, gdy każdy wiersz PO jest w nim obecny w całości;
  • w przeciwnym razie akceptuje każdy wiersz w ilości obecnej w zamówieniu i odrzuca resztę (usunięte artykuły, zmniejszone ilości). Ilość podniesiona ponad PO jest potwierdzana w ilości z PO;
  • jeśli nie pozostał żaden wiersz, nic nie jest wysyłane: należy użyć cancelled, aby odrzucić zamówienie.

Późniejsze zmiany artykułów nie są ponownie potwierdzane: zamówienie należy edytować przed przyjęciem.

Każda wysyłka
PoleWymaganeZnaczenie
idTakID wysyłki, unikalne w zamówieniu i nigdy nieużywane ponownie: każde ID jest zgłaszane raz
shipped_atZalecaneData wysyłki, ISO 8601 z przesunięciem strefy czasowej
carrierNieNazwa przewoźnika
trackingNieNumer śledzenia. Przewoźnik jest zgłaszany tylko razem z nim
itemsTakPozycje zamówienia w tej wysyłce i wysłana ilość (order_item_id z tworzenia zamówienia). Wysyłka bez artykułów z PO nie jest zgłaszana

Wysyłkę należy zgłaszać dopiero po nadaniu. Zmiany po jej zgłoszeniu nie są wysyłane ponownie. Jeśli system zakupowy odrzuci potwierdzenie lub awizo, PunchOut Rocket wysyła je ponownie przy kolejnej kontroli i nie wysyła dalszych komunikatów do chwili akceptacji.

Stan zamówień: odpowiedzi błędów
HTTPKiedySkutek
404 z {"status": "error", ...}Zamówienie nie istnieje, np. zostało usunięteZapis w dzienniku, ponowna kontrola w kolejnym cyklu
Inne statusy spoza 2xxKażdy inny błądZapis w dzienniku, ponowna kontrola w kolejnym cyklu

8. Powiadomienie o stanie zamówień (opcjonalne)

Bez niego PunchOut Rocket odczytuje stan zamówienia co godzinę. Aby wysyłać potwierdzenia i awiza w kilka sekund, należy powiadamiać PunchOut Rocket o każdej zmianie zamówienia utworzonego przez sekcję 6 (stan, artykuły, nowa wysyłka):

  • URL: {gateway_url}/order-status-changed (gateway_url z żądania tworzenia zamówienia)
  • Metoda: POST, Content-Type: application/json
  • Bez uwierzytelniania: powiadomienie nie zawiera danych, tylko powoduje wywołanie endpointu stanu (sekcja 7) przez PunchOut Rocket dla tego zamówienia.

Powiadomienie i odpowiedź

POST {gateway_url}/order-status-changed
Content-Type: application/json

{"order_id": "100045"}

HTTP 202
{"status": "queued"}

Należy wysłać je po zapisaniu zmiany, bez czekania użytkownika (fire and forget, krótki limit czasu). Błędy można ignorować: kontrola godzinowa nadrobi zmiany.

9. Lista kontrolna przed uruchomieniem

  1. Należy skonfigurować witrynę (sekcja 1) i wpisać ten sam klucz API w sklepie.
  2. Utworzyć klienta końcowego i ustawić jego „E-commerce User to Clone”.
  3. Kliknąć „Update from e-commerce” w jego Category Mapping i zmapować kategorie; ustawić Default UNSPSC.
  4. Przetestować PunchOut formularzem testowym cXML w panelu administracyjnym: create, potem edit z koszykiem, a następnie zwrócić koszyk.
  5. Dla zamówień zakupu (plan Premium): wysłać testowy OrderRequest i sprawdzić zamówienie w sklepie.
  6. Dla aktualizacji stanu (opcja OC & ASN): włączyć „Send order status updates” u klienta końcowego, przeprowadzić zamówienie testowe przez używane stany i sprawdzić, czy system klienta odbiera potwierdzenie i awiza wysyłki.

Warto pamiętać:

  • Użytkownicy PunchOut nie mogą kończyć procesu składania zamówienia w sklepie: koszyk wraca do systemu zakupowego (sekcja 4), a zamówienie dociera później przez sekcję 6.
  • Zamówienia odebrane przez sekcję 6 są już zatwierdzone przez system zakupowy klienta: nie wymagają płatności online.

Potrzebny klient testowy lub przegląd implementacji? Porozmawiaj z naszymi programistami lub zleć nam wdrożenie w ramach Go-Live Assist.

FAQ

Pytania o integrację

Jakie pola ustawić w PunchOut Rocket?

Przy E-commerce Platform ustawionym na Custom: Site URL i API Key. Cztery ścieżki endpointów (klonowanie, kategorie, tworzenie i stan zamówień) są potrzebne tylko, jeśli nie używa się domyślnych.

Czy endpoint kategorii jest wymagany?

Jest zalecany. Pozwala mapować kategorie na kody wymagane przez klientów, np. UNSPSC; bez niego każdy produkt otrzymuje Default UNSPSC klienta końcowego.

Czy link SSO można wykorzystać ponownie?

Nie. Token musi działać jednorazowo przez HTTPS. Powinien być ważny kilka minut, nie sekund: z predefiniowanymi koszykami klient otwiera link dopiero po wybraniu przejścia do sklepu.

Jak zamówienia zakupu trafiają do sklepu dedykowanego?

Przez endpoint tworzenia zamówień: bramka odbiera cXML OrderRequest klienta i wysyła go do sklepu jako JSON. Funkcja jest w planie Premium, także w bezpłatnym okresie próbnym.

Czy mój sklep może wysyłać potwierdzenia zamówień i awiza wysyłki?

Tak, z opcją OC & ASN w planie Premium (prosimy o kontakt w celu aktywacji). Należy wdrożyć endpoint stanu zamówień: bramka odczytuje stan każdego zamówienia i wysyła cXML ConfirmationRequest oraz ShipNoticeRequest do systemu klienta.

30-dniowy bezpłatny okres próbny · bez karty kredytowej

Państwa klient czeka. Czas uruchomić połączenie.

Wtyczkę można zainstalować dziś i uruchomić pierwszą sesję testową jeszcze po południu. Jeśli termin jest bliski, prosimy o informację — potraktujemy zgłoszenie priorytetowo.