Przejdź do treści
Ostatnia aktualizacja

Zdarzenie transaction:status_changed to najważniejszy element integracji płatności online. Informuje ono Twój system o każdej zmianie stanu (cyklu życia) konkretnej transakcji zainicjowanej przez klienta.

To właśnie na podstawie tego eventu Twój sklep powinien podejmować decyzje biznesowe – np. wydać klientowi zakupiony towar (gdy status zmieni się na opłacony) lub przywrócić produkty na stan magazynowy (gdy płatność wygaśnie lub zostanie odrzucona).

Kiedy wysyłany jest ten event?

Powiadomienie to jest wyzwalane asynchronicznie za każdym razem, gdy transakcja płatnicza przechodzi na nowy etap w systemie SimPay. Otrzymasz je między innymi, gdy:

  • Bank lub operator ostatecznie potwierdzi otrzymanie środków (zmiana na status transaction_paid).
  • Próba płatności zostanie odrzucona przez bank klienta z powodu braku środków (zmiana na transaction_failure).
  • Klient nie opłaci zamówienia w wyznaczonym czasie i bramka płatnicza zostanie zamknięta (zmiana na transaction_expired).

Struktura obiektu data

Gdy pole type w głównym obiekcie powiadomienia ma wartość transaction:status_changed, obiekt data będzie zawierał następujące informacje:

PoleTypOpisPrzykładowa wartość
idUUIDID transakcji przesyłany po wygenerowaniu transakcji00554475-7ebb-4f16-b30b-0ce21da1a03b
payer_transaction_idchar(8)ID transakcji pokazywane płacącemu na ekranie bramki4878R2PN
service_idchar(8)Identyfikator usługie65c7519
statusTransactionStatusEnumAktualny status transakcji (np. transaction_paid, transaction_failure)transaction_paid
amountobjectObiekt informacji o kwocie
amount.final_currencyISO 4217Waluta, w której płacący dokonał płatnościPLN
amount.final_valuestring (%.2f)Finalna kwota, którą płacący zapłacił (np. "0.30", "10.00", "12.37")8.47
amount.original_currencyISO 4217Waluta, która była zadeklarowana przy inicjacji płatnościEUR
amount.original_valuestring (%.2f)Zadeklarowana kwota przy inicjacji płatności (np. "0.30", "10.00", "12.37")2.00
amount.commission_systemstring (%.2f) lub nullKwota prowizji, która została pobrana przez SimPay (np. "0.30", "10.00", "12.37")0.13
amount.commission_partnerstring (%.2f) lub nullKwota prowizji, która została dla Partnera (np. "0.30", "10.00", "12.37")0.13
amount.commission_currencyISO 4217 lub nullWaluta, w której została pobrana prowizja (PLN/EUR)PLN
controlstringPole przesyłane tylko wtedy, gdy zostało przekazane podczas inicjacji płatnościSHOP_ORDER_1
paymentobjectPole z informacjami o metodzie płatności
payment.channelstringKanał płatności, którym zapłacił płacący (zobacz: Kanały bezpośrednie)blik
payment.typestringTyp/grupa metody płatnościblik
customerobjectObiekt informacji o płacącym
customer.country_codeISO 3166-1 Alpha-2 lub nullKraj kupującego (np. "PL")PL
paid_atISO 8601 lub nullData i czas zapłaty (może nie być przesyłane, kiedy transakcja nie jest opłacona)2025-05-26T15:10:24Z
created_atISO 8601Data i czas utworzenia transakcji2025-05-26T15:09:59Z
Wskazówka

Do sprawdzania opłacenia zamówienia zawsze weryfikuj pole status. Oczekiwana wartość dla zakończonego sukcesem procesu to transaction_paid. Należy również bezwzględnie sprawdzić, czy amount.original_value oraz amount.original_currency zgadzają się z kwotą zapisaną w Twojej bazie danych dla danego zamówienia.


Przykładowy Payload JSON

Poniżej znajduje się kompletny zrzut (payload) powiadomienia wysyłanego dla zdarzenia transaction:status_changed (w tym przypadku transakcja odrzucona – transaction_failure).

(Przykładowa sygnatura została wygenerowana przy użyciu klucza IPN: UwSkKiIwlxIeOMF8MIq9iDkQWBTtjoJQ. Możesz użyć tego klucza i poniższych danych do przetestowania swojego algorytmu walidacji).

{
  "type": "transaction:status_changed",
  "notification_id": "0196fec6-7a61-7219-9458-bcc45237c252",
  "date": "2025-05-23T22:12:22+02:00",
  "data": {
    "id": "dbc87423-b121-4ad4-977f-b63c3d3831e8",
    "payer_transaction_id": "Q68KLAKN",
    "service_id": "e65c7519",
    "status": "transaction_failure",
    "amount": {
      "final_currency": "PLN",
      "final_value": "8.00",
      "original_currency": "PLN",
      "original_value": "8.00",
      "commission_system": "0.06",
      "commission_partner": "7.94",
      "commission_currency": "PLN"
    },
    "control": "3e63e31d-f08d-4942-a223-3bad2dce8096",
    "payment": {
      "channel": "blik",
      "type": "blik"
    },
    "customer": {
      "country_code": null
    },
    "created_at": "2024-08-10T15:41:50+02:00"
  },
  "signature": "095a7be5d77c4bab667dbd0f35d9b1cb0c9cec50d8af42842cc37a95b233925e"
}
Zobacz wyliczenie sygnatury
  1. Flatten wszystkich elementów po kolei + separacja |:

Nasz ciąg będzie wyglądać tak:

transaction:status_changed|0196fec6-7a61-7219-9458-bcc45237c252|2025-05-23T22:12:22+02:00|dbc87423-b121-4ad4-977f-b63c3d3831e8|Q68KLAKN|e65c7519|transaction_failure|PLN|8.00|PLN|8.00|0.06|7.94|PLN|3e63e31d-f08d-4942-a223-3bad2dce8096|blik|blik||2024-08-10T15:41:50+02:00
  1. Dodaj klucz IPN na końcu ciągu: ...|UwSkKiIwlxIeOMF8MIq9iDkQWBTtjoJQ
  2. Oblicz SHA256 z powyższego ciągu i zakoduj go w hex:
<?php

$signature = hash('sha256', 'transaction:status_changed|0196fec6-7a61-7219-9458-bcc45237c252|2025-05-23T22:12:22+02:00|dbc87423-b121-4ad4-977f-b63c3d3831e8|Q68KLAKN|e65c7519|transaction_failure|PLN|8.00|PLN|8.00|0.06|7.94|PLN|3e63e31d-f08d-4942-a223-3bad2dce8096|blik|blik||2024-08-10T15:41:50+02:00|UwSkKiIwlxIeOMF8MIq9iDkQWBTtjoJQ');
  1. Porównaj bezpieczną funkcją porównującą (np. hash_equals w PHP) obliczoną sygnaturę z tą przesłaną w polu signature powiadomienia.