# Zdarzenie: transaction:status_changed

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:

| 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](/payment/statuses#statusGroup=Statusy+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` |


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).*


```json
{
  "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"
}
```

details
summary
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
<?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.