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.
| Sekcja | Funkcja | Co implementuje sklep | Wymagane | Plan |
|---|---|---|---|---|
| 2–3 | Sesja PunchOut (create, edit, inspect) z automatycznym logowaniem | Endpoint klonowania i logowanie SSO | Tak | Wszystkie licencje |
| 4 | Przesyłanie koszyka z powrotem do systemu zakupowego | Formularz automatycznego wysyłania do PunchOut Rocket | Tak | Wszystkie licencje |
| 5 | Mapowanie kategorii, np. UNSPSC | Endpoint kategorii | Zalecane | Wszystkie licencje |
| 6 | Zamówienia zakupu (cXML OrderRequest) | Endpoint tworzenia zamówień | Opcjonalnie | Plan Premium |
| 7 | Potwierdzenia zamówień i awiza wysyłki (cXML ConfirmationRequest, ShipNoticeRequest) | Endpoint stanu zamówień | Opcjonalnie, wymaga 6 | Plan Premium + opcja OC & ASN |
| 8 | Natychmiastowe aktualizacje zamówień | Powiadomienie do PunchOut Rocket | Opcjonalnie, wymaga 7 | Plan Premium + opcja OC & ASN |
| – | Predefiniowane koszyki | Nic: 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
| Pole | Wartość |
|---|---|
| E-commerce Platform | Custom |
| Site URL | Bazowy adres URL sklepu, np. https://your-store.example.com. Może zawierać ścieżkę (https://example.com/shop); końcowy / jest usuwany |
| API Key | Sekret 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 URL | Domyś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.

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:
| Pole | Zastosowanie |
|---|---|
| E-commerce User to Clone | Nazwa 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 UNSPSC | Kod kategorii używany dla produktów, których kategorie nie mają przypisanego kodu (sekcja 5) |
| Default Lead Time | Czas dostawy w dniach wysyłany z każdym artykułem OCI (domyślnie 3) |
| EA Override, BX Override | Zastę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 Mapping | Kategorie załadowane przez „Update from e-commerce”, każda przypisana do kodu (sekcja 5) |
| Shipping Method, Payment Method | Wysył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 secret | Włączają sekcje 7–8 dla klienta: adres URL i sekret należą do jego systemu zakupowego |

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
POSTz 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_codejest 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
| Pole | Typ | Znaczenie |
|---|---|---|
username | string | „E-commerce User to Clone” klienta końcowego |
api_key | string | Klucz API witryny |
session_token | string | ID sesji PunchOut (cXML BuyerCookie lub UUID dla OCI). Należy zachować: wraca w formularzu koszyka (sekcja 4) |
end_customer_id | integer | ID klienta końcowego w PunchOut Rocket. Należy zachować: wraca w formularzu koszyka (sekcja 4) |
operation | string | create, edit lub inspect dla cXML; zawsze create dla OCI |
gateway_base_url | string | Bazowy URL PunchOut Rocket: formularz koszyka (sekcja 4) wysyła do {gateway_base_url}/start-sso-checkout |
selected_item | object, opcjonalnie | Tylko 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_items | array, opcjonalnie | Tylko cXML edit i inspect: koszyk do odtworzenia. Brak, gdy system klienta nie wysłał artykułów |
| Pole | Typ | Znaczenie |
|---|---|---|
sku | string | SKU (może być puste) |
product_id | string | ID produktu w sklepie (może być puste) |
quantity | string | Ilość, np. "2" |
price | string | Cena jednostkowa, kropka jako separator dziesiętny, np. "15.95". Informacyjnie: koszyk używa aktualnych cen sklepu |
description | string | Opis produktu |
currency | string | Kod 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ę.
| HTTP | Kiedy | Treść |
|---|---|---|
| 400 | Brakujące lub nieprawidłowe pola | {"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"} |
| 401 | Nieprawidłowy api_key | {"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"} |
| 422 | SSO niemożliwe, np. nie znaleziono username | {"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"} |
| 500 | Błąd wewnętrzny | {"status": "error", "error_code": "internal_error", "message": "..."} |
3. Logowanie SSO
Gdy klient otwiera sso_url, sklep:
- zużywa token (jednorazowy) i loguje sklonowanego użytkownika;
- dla
editiinspect: wypełnia koszyk dokładnie produktami i ilościami zcart_items, a następnie pokazuje koszyk (obowiązują aktualne ceny); - dla
create: pokazuje produktselected_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_urlz żądania klonowania) - Metoda:
POST,application/x-www-form-urlencoded(zwykłe wysłanie formularza przeglądarki) - Bez
api_key: sesję identyfikująsession_tokeniend_customer_id.
| Pole | Wymagane | Znaczenie |
|---|---|---|
session_token | Tak | Z żądania klonowania |
end_customer_id | Tak | Z żądania klonowania |
products[i][sku] | Tak | SKU. Staje się cXML SupplierPartID lub numerem materiału dostawcy OCI |
products[i][product_id] | Tak | ID produktu w sklepie. Staje się cXML SupplierPartAuxiliaryID: klient odsyła go w edit i zamówieniach zakupu |
products[i][description] | Tak | Nazwa lub opis produktu. Tagi HTML są usuwane |
products[i][quantity] | Tak | Ilość, kropka jako separator dziesiętny |
products[i][price] | Tak | Cena jednostkowa, kropka jako separator dziesiętny, bez separatora tysięcy |
products[i][currency] | Tak | Kod ISO 4217 |
products[i][unit_of_measure] | Nie | Kod jednostki UN/CEFACT. Domyślnie EA |
products[i][manufacturer_name] | Nie | Producent |
products[i][category_ids] | Nie | ID 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:
| HTTP | Kiedy |
|---|---|
| 400 | Brak lub nieprawidłowy session_token albo end_customer_id, lub brak pasującej sesji |
| 409 | Koszyk 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}
]
}| Pole | Znaczenie |
|---|---|
id | ID kategorii w sklepie, liczba całkowita różna od 0: te same ID co w category_ids (sekcja 4) |
name | Nazwa wyświetlana. Kategorie bez nazwy są pomijane |
parent_id | ID 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.

Jak produkt koszyka otrzymuje kod:
- kod przypisany do jednego z jego
category_ids; - w przeciwnym razie kod najbliższej kategorii nadrzędnej, która go ma;
- 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):

Treść żądania
| Pole | Typ | Znaczenie |
|---|---|---|
api_key | string | Klucz API witryny |
gateway_url | string | Bazowy URL PunchOut Rocket dla powiadomienia o stanie (sekcja 8) |
customer_email | string | „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_id | string | Numer PO klienta. Należy zapisać go w zamówieniu: to referencja znana klientowi |
order_date | string | Data PO wysłana przez klienta (ISO 8601) |
currency | string | ISO 4217 |
total | string | Suma PO, kropka jako separator dziesiętny |
shipping_method | string | Shipping Method klienta końcowego. Może być puste: należy użyć wartości domyślnej |
payment_method | string | Payment Method klienta końcowego, np. przelew. Może być puste: należy użyć wartości domyślnej |
billing_address, shipping_address | object | name, 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 |
items | array | Wiersze PO, zobacz poniżej |
| Pole | Typ | Znaczenie |
|---|---|---|
line_number | string | Numer wiersza PO: należy zwrócić go w odpowiedzi |
sku | string | SKU (cXML SupplierPartID) |
product_id | string | ID produktu (cXML SupplierPartAuxiliaryID). Może być puste: wtedy produkt należy znaleźć przez sku |
quantity | integer | Zamówiona ilość |
unit_price | string | Cena jednostkowa w PO (zatwierdzona przez klienta), kropka jako separator dziesiętny |
currency | string | ISO 4217 |
description | string | Opis 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"}
]
}| Pole | Wymagane | Znaczenie |
|---|---|---|
status | Tak | Dokładnie success |
order_id | Tak | ID 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 |
items | Zalecane | Dla 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}]
}
]
}| Pole | Wymagane | Znaczenie |
|---|---|---|
status | Tak | Dokładnie success |
order_status | Tak | Stan zamówienia zmapowany na jedną z poniższych wartości |
items | Tak | ID pozycji nadal obecnych w zamówieniu. Usunięta pozycja nie występuje tutaj |
quantities | Zalecane | Aktualna 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 |
shipments | Zalecane | Jeden wpis na wysłaną przesyłkę. Puste ([]), gdy sklep nie śledzi wysyłek: wtedy wysyłane są tylko potwierdzenia, bez awiz |
| Wartość | Znaczenie | Wysyłane do klienta |
|---|---|---|
pending | Odebrane, jeszcze nieprzyjęte | Nic |
processing | Przyjęte | Potwierdzenie |
shipped | Wysłane częściowo lub w całości | Potwierdzenie, jeśli jeszcze nie wysłano, a następnie awiza wysyłki |
delivered | Dostarczone | Tak samo jak shipped |
cancelled | Anulowane | Odrzucenie 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.
| Pole | Wymagane | Znaczenie |
|---|---|---|
id | Tak | ID wysyłki, unikalne w zamówieniu i nigdy nieużywane ponownie: każde ID jest zgłaszane raz |
shipped_at | Zalecane | Data wysyłki, ISO 8601 z przesunięciem strefy czasowej |
carrier | Nie | Nazwa przewoźnika |
tracking | Nie | Numer śledzenia. Przewoźnik jest zgłaszany tylko razem z nim |
items | Tak | Pozycje 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.
| HTTP | Kiedy | Skutek |
|---|---|---|
404 z {"status": "error", ...} | Zamówienie nie istnieje, np. zostało usunięte | Zapis w dzienniku, ponowna kontrola w kolejnym cyklu |
| Inne statusy spoza 2xx | Każdy inny błąd | Zapis 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_urlz żą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
- Należy skonfigurować witrynę (sekcja 1) i wpisać ten sam klucz API w sklepie.
- Utworzyć klienta końcowego i ustawić jego „E-commerce User to Clone”.
- Kliknąć „Update from e-commerce” w jego Category Mapping i zmapować kategorie; ustawić Default UNSPSC.
- Przetestować PunchOut formularzem testowym cXML w panelu administracyjnym: create, potem edit z koszykiem, a następnie zwrócić koszyk.
- Dla zamówień zakupu (plan Premium): wysłać testowy OrderRequest i sprawdzić zamówienie w sklepie.
- 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.