← Blog

SMS w WooCommerce: potwierdzenia zamówień przez API

Zespół Przypominamy.com · Aktualizacja: · 4 min czytania

SMS o zamówieniu powinien wynikać z rzeczywistego zdarzenia w sklepie. W tym poradniku projektujemy integrację WooCommerce z API Przypominamy.com i pokazujemy fragment żądania PHP. To materiał dla wykonawcy własnej wtyczki lub adaptera, a nie gotowa wtyczka do instalacji jednym kliknięciem.

Wybierz statusy zgodne z procesem sklepu

Status processing oznacza zamówienie oczekujące na realizację po płatności, a completed zakończenie realizacji. Sam completed nie jest uniwersalnym potwierdzeniem nadania paczki. Wiadomość „przesyłka nadana” powinna opierać się na zdarzeniu systemu magazynowego lub integracji kurierskiej.

Zacznij od jednego zdarzenia, np. przyjęcia zamówienia do realizacji. Ustal również, co oznacza ponowne wejście w ten sam status. Nie obiecuj klientowi terminu zwrotu lub dostawy, którego sklep nie kontroluje. Krótka informacja z numerem zamówienia bywa bardziej użyteczna niż kopiowanie całego e-maila.

Oddziel zmianę statusu od wysyłki HTTP

Własna wtyczka może reagować na zmianę statusu zamówienia, np. przez hook woocommerce_order_status_changed. Zamiast blokować obsługę zamówienia oczekiwaniem na zewnętrzne API, zapisz zlecenie w trwałej kolejce. Worker kolejki powinien otrzymać zamrożony numer, tekst i identyfikator zdarzenia.

Przechowuj wynik oraz ID SMS przy zleceniu. Zadbaj o unikalność zdarzenia i blokadę równoległego wykonania. Samo sprawdzenie „czy pole wyniku jest puste” nie wystarczy, jeśli dwa procesy uruchomią się jednocześnie. Kod umieść we własnej wtyczce, a klucz w konfiguracji serwera poza repozytorium.

Przykład żądania PHP do API SMS

Poniższy fragment pokazuje wyłącznie żądanie wykonywane przez worker kolejki. Zmienne muszą pochodzić z zapisanego zlecenia; nie jest to kompletna wtyczka ani implementacja blokady.

$response = wp_remote_post(
    'https://api.przypominamy.com/v1/messages',
    [
        'headers' => [
            'Authorization' => 'Bearer ' . PRZYPOMINAMY_API_KEY,
            'Content-Type' => 'application/json',
            'Idempotency-Key' => $operation_id,
        ],
        'body' => wp_json_encode([
            'to' => $phone,
            'text' => $text,
            'reference' => $event_reference,
        ]),
        'timeout' => 15,
        'redirection' => 0,
    ]
);

if (is_wp_error($response)) {
    // Zachowaj nierozstrzygnięte zlecenie do sprawdzenia.
    return;
}
$status = wp_remote_retrieve_response_code($response);
$body = json_decode(wp_remote_retrieve_body($response), true);
// Sprawdź kod HTTP i body, a następnie zapisz wynik zlecenia.

Pobierz numer z danych zamówienia i zweryfikuj prefiks kraju. Nie dopisuj automatycznie +48 do każdego zagranicznego numeru. Pominięcie from używa domyślnego nadawcy konta. Własna nazwa nadawcy wymaga wcześniejszej aktywacji.

Retry nie może tworzyć nowego zlecenia

Identyfikator operacji, np. powiązany z zamówieniem i zdarzeniem, zapisuj przed wysyłką. Przy timeoutcie nie wiadomo jeszcze, czy SMS został przyjęty. Sprawdź historię; jeśli ponawiasz, zachowaj identyczny identyfikator i payload. Po 24 godzinach nie zakładaj dalszego odtwarzania zakończonej odpowiedzi przez API.

Rozróżnij błąd sieci od odpowiedzi HTTP z błędem. Samo is_wp_error nie wykrywa odpowiedzi 401, 402 czy 429. Nie zapisuj wszystkich odpowiedzi jako sukcesu. Przyjęcie wiadomości i jej doręczenie przechowuj osobno; stan końcowy odczytaj przez API lub zweryfikowany webhook.

Sprawdź koszt i pełną ścieżkę testową

Konto testowe wysyła prawdziwe wiadomości na zweryfikowane numery. W sklepie testowym podstaw własny numer, utwórz zamówienie i sprawdź pojedyncze oraz ponowne zdarzenie. Przetestuj brak telefonu, odmowę API, awarię kolejki i błąd zapisu wyniku po przyjęciu SMS.

Koszt zależy od liczby części, a nie tylko liczby zamówień. Przykładowo 2000 zamówień × 2 wiadomości × 1 część to 4000 płatnych części. Pomnóż je przez stawkę konta z cennika i oddziel koszt wdrożenia. Polskie znaki zmieniają kodowanie, ale nie zawsze zwiększają liczbę części - zależy to od długości pełnej treści.

Najczęstsze pytania

Czy ten kod można wkleić jako kompletną wtyczkę?

Nie. To fragment żądania API. Produkcyjna integracja wymaga kolejki, walidacji, trwałego stanu i obsługi odpowiedzi.

Czy completed zawsze oznacza wysłanie paczki?

Nie. To zakończenie realizacji zamówienia. Informację o nadaniu oprzyj na rzeczywistym zdarzeniu wysyłkowym sklepu.

Dokumentacja narzędzia

Interfejs i dostępność funkcji sprawdzaj na swoim koncie narzędzia.