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).
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).
Gdy pole type w głównym obiekcie powiadomienia ma wartość transaction:status_changed, obiekt data będzie zawierał następujące informacje:
| Pole | Typ | Opis | Przykładowa wartość |
|---|---|---|---|
id | UUID | ID transakcji przesyłany po wygenerowaniu transakcji | 00554475-7ebb-4f16-b30b-0ce21da1a03b |
payer_transaction_id | char(8) | ID transakcji pokazywane płacącemu na ekranie bramki | 4878R2PN |
service_id | char(8) | Identyfikator usługi | e65c7519 |
status | TransactionStatusEnum | Aktualny status transakcji (np. transaction_paid, transaction_failure) | transaction_paid |
amount | object | Obiekt informacji o kwocie | |
amount.final_currency | ISO 4217 | Waluta, w której płacący dokonał płatności | PLN |
amount.final_value | string (%.2f) | Finalna kwota, którą płacący zapłacił (np. "0.30", "10.00", "12.37") | 8.47 |
amount.original_currency | ISO 4217 | Waluta, która była zadeklarowana przy inicjacji płatności | EUR |
amount.original_value | string (%.2f) | Zadeklarowana kwota przy inicjacji płatności (np. "0.30", "10.00", "12.37") | 2.00 |
amount.commission_system | string (%.2f) lub null | Kwota prowizji, która została pobrana przez SimPay (np. "0.30", "10.00", "12.37") | 0.13 |
amount.commission_partner | string (%.2f) lub null | Kwota prowizji, która została dla Partnera (np. "0.30", "10.00", "12.37") | 0.13 |
amount.commission_currency | ISO 4217 lub null | Waluta, w której została pobrana prowizja (PLN/EUR) | PLN |
control | string | Pole przesyłane tylko wtedy, gdy zostało przekazane podczas inicjacji płatności | SHOP_ORDER_1 |
payment | object | Pole z informacjami o metodzie płatności | |
payment.channel | string | Kanał płatności, którym zapłacił płacący (zobacz: Kanały bezpośrednie) | blik |
payment.type | string | Typ/grupa metody płatności | blik |
customer | object | Obiekt informacji o płacącym | |
customer.country_code | ISO 3166-1 Alpha-2 lub null | Kraj kupującego (np. "PL") | PL |
paid_at | ISO 8601 lub null | Data i czas zapłaty (może nie być przesyłane, kiedy transakcja nie jest opłacona) | 2025-05-26T15:10:24Z |
created_at | ISO 8601 | Data i czas utworzenia transakcji | 2025-05-26T15:09:59Z |
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.
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
- 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- Dodaj klucz IPN na końcu ciągu:
...|UwSkKiIwlxIeOMF8MIq9iDkQWBTtjoJQ - 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');- Porównaj bezpieczną funkcją porównującą (np.
hash_equalsw PHP) obliczoną sygnaturę z tą przesłaną w polusignaturepowiadomienia.