# Testowanie integracji

Rozwijaj i testuj integrację w **środowisku sandbox** — zamówienia
produkcyjne to prawdziwe zamówienia, prawdziwi kurierzy i prawdziwe faktury.

## Sandbox

| | Produkcja | Sandbox |
|---|---|---|
| Bazowy URL | `https://www.apaczka.pl/api/v2/` | `https://panel-sandbox.apaczka.pl/api/v2/` |
| Dane dostępowe | Produkcyjne `app_id` / `app_secret` | Sandboksowe `app_id` / `app_secret` |

Kontrakt API jest w obu środowiskach ten sam; dane dostępowe są wydawane
per środowisko.

:::danger[Sprawdź, na które środowisko celujesz]

Nigdy nie zakładaj, że klucz jest przypisany do jednego środowiska — przed
testami zawsze weryfikuj **bazowy URL**, na który wskazuje Twoja
integracja. Zamówienie wysłane „przypadkiem" na produkcję to prawdziwe
zamówienie, prawdziwy kurier i prawdziwa faktura.

:::

## Ograniczenia sandboksa

Sandbox działa na starszym wdrożeniu i mniejszym zbiorze danych niż
produkcja. Znane różnice:

- **`tracking/` i `dispatch_code/` nie są dostępne** w sandboksie — te
  części integracji weryfikuj read-only na produkcji.
- **`points/` może przekraczać limit czasu** w sandboksie; na produkcji
  działa.
- **Katalog usług jest mniejszy** niż na produkcji, a id różnią się per
  konto — pobieraj
  [`service_structure` per środowisko](/pl/guides/best-practices#nie-hardkoduj-przewoźników-i-usług),
  nigdy nie kopiuj id usług między środowiskami.
- Niektóre pola odpowiedzi mogą wracać puste (np. `supplier` w odpowiedzi
  `order_send`).
- `pickup/` i `batch_pickup/` wymagają uprawnienia **pickup przez API**,
  włączanego per konto przez wsparcie Apaczki — dotyczy to również kont
  sandboksowych.

## Skierowanie SDK na sandbox

[SDK PHP](/pl/sdk) udostępnia bazowy URL sandboksa jako stałą:

```php
use AlsendoOne\SDK\AlsendoClient;

$client = new AlsendoClient(
    'sandbox_app_id',
    'sandbox_app_secret',
    null,                        // domyślny klient Guzzle
    AlsendoClient::SANDBOX_URL
);
```

Bazowy URL i dane dostępowe trzymaj w konfiguracji (zmienne środowiskowe),
aby ten sam kod działał w obu środowiskach.

## Bez SDK

Podpisuj i wysyłaj żądania dokładnie tak, jak opisuje
[podpisywanie żądań (HMAC)](/pl/legacy/hmac-signing) — zmienia się tylko
host na `panel-sandbox.apaczka.pl`. Pamiętaj, że route w łańcuchu do
podpisu pozostaje bez zmian (`order_send/` itd.); host nie jest częścią
podpisu.

## Co zweryfikować przed startem produkcyjnym

- Błędy są wykrywane z pola `status` w **ciele odpowiedzi**, nie ze statusu
  HTTP — zobacz [semantykę błędów](/pl/legacy/error-semantics).
- Lista usług jest pobierana z `service_structure`, a nie
  [hardkodowana](/pl/guides/best-practices#nie-hardkoduj-przewoźników-i-usług).
- Nieudane wywołania `order_send` nie są ślepo ponawiane
  ([zduplikowane zamówienia](/pl/guides/best-practices#ostrożnie-z-ponawianiem-żądań)).
- Podpisy webhooków są weryfikowane, jeśli używasz
  [push trackingu](/pl/guides/tracking#webhooki-push-tracking).
