# Zdarzenie: subscription:status_changed

Zdarzenie `subscription:status_changed` służy do monitorowania cyklu życia subskrypcji (płatności powtarzalnych)
powiązanych z kontem Twojego klienta. Pozwala ono Twojej aplikacji na automatyczne zarządzanie dostępem do usług
abonamentowych, bez konieczności ręcznego sprawdzania, czy klient opłacił kolejny okres rozliczeniowy.

## Kiedy wysyłany jest ten event?

Powiadomienie to jest wyzwalane wyłącznie, gdy korzystasz z metod płatności obsługujących subskrypcje (np. BLIK
Płatności Powtarzalne). Otrzymasz je między innymi, gdy:

* Subskrypcja zostanie pomyślnie aktywowana (zmiana na `subscription_active`), co jest sygnałem do uruchomienia
cyklicznej usługi dla klienta.
* Subskrypcja wygaśnie z powodu braku środków lub utraty ważności metody płatności klienta (zmiana na
`subscription_expired`).
* Klient lub sklep ręcznie anuluje plany abonamentowe (zmiana na `subscription_cancelled`).


## Struktura obiektu `data`

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

| Pole | Typ | Opis | Przykładowa wartość |
|  --- | --- | --- | --- |
| `id` | `UUID` | ID subskrypcji w systemie SimPay | `019972b1-e4df-70c4-8c9b-6a89f6ccc948` |
| `service_id` | `char(8)` | Identyfikator usługi | `e65c7519` |
| `status` | `SubscriptionStatusEnum` | Aktualny [status subskrypcji](/payment/statuses#statusGroup=Statusy+subskrypcji) | `subscription_active` |
| `mode` | `SubscriptionModeEnum` | Tryb subskrypcji (metoda płatności) | `BLIK` |
| `created_at` | `ISO 8601` | Data utworzenia subskrypcji | `2025-09-22T20:31:25+02:00` |
| `updated_at` | `ISO 8601` | Data ostatniej aktualizacji statusu subskrypcji | `2025-09-22T20:31:32+02:00` |
| `blik` | `object` | Obiekt ze szczegółami BLIK *(przesyłany tylko przy `mode` == `BLIK`)* |  |
| `blik.model` | `BlikSubscriptionModelEnum` | Model subskrypcji BLIK | `O` |
| `blik.currency` | `char(3)` | Waluta subskrypcji BLIK | `PLN` |
| `blik.alias` | `object` | Dane powiązanego aliasu BLIK |  |
| `blik.alias.id` | `UUID` | ID aliasu BLIK | `019972b1-e4c0-714f-a10b-f88a158bee50` |
| `blik.alias.type` | `string` | Typ aliasu BLIK | `PAYID` |
| `blik.alias.value` | `string` | Wartość aliasu BLIK | `AABBCCDD` |
| `blik.alias.label` | `string` | Etykieta wyświetlana w aplikacji mobilnej banku | `testy` |
| `blik.alias.status` | `BlikAliasStatusEnum` | [Status aliasu BLIK](/payment/statuses#statusGroup=Statusy+alias%C3%B3w+BLIK) | `alias_active` |
| `blik.alias.created_at` | `ISO 8601` | Data utworzenia aliasu | `2025-09-22T20:31:25+02:00` |
| `blik.alias.updated_at` | `ISO 8601` | Data ostatniej aktualizacji aliasu | `2025-09-22T20:31:32+02:00` |


Wskazówka
Logika dostępu do Twojej usługi abonamentowej powinna opierać się na polu `status`. Jeśli otrzymasz webhook ze statusem
`subscription_expired`, `subscription_cancelled` lub `subscription_fraudulent`, Twój system powinien automatycznie
wstrzymać świadczenie usługi na rzecz klienta.

## Przykładowy Payload JSON

Poniżej znajduje się kompletny zrzut (payload) powiadomienia wysyłanego dla zdarzenia `subscription:status_changed` (w
tym przypadku udana aktywacja).

*(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": "subscription:status_changed",
  "notification_id": "019972b2-0360-7177-a635-f26b05f632b8",
  "date": "2025-09-22T20:31:32+02:00",
  "data": {
    "id": "019972b1-e4df-70c4-8c9b-6a89f6ccc948",
    "service_id": "e65c7519",
    "status": "subscription_active",
    "mode": "BLIK",
    "created_at": "2025-09-22T20:31:25+02:00",
    "updated_at": "2025-09-22T20:31:32+02:00",
    "blik": {
      "model": "O",
      "currency": "PLN",
      "alias": {
        "id": "019972b1-e4c0-714f-a10b-f88a158bee50",
        "type": "PAYID",
        "value": "AABBCCDD",
        "label": "testy",
        "status": "alias_active",
        "created_at": "2025-09-22T20:31:25+02:00",
        "updated_at": "2025-09-22T20:31:32+02:00"
      }
    }
  },
  "signature": "0851c6bc63e92bff424a83ab9067c192d6e9a1b5d67ade9960f0cce67216d3f1"
}
```

details
summary
Zobacz wyliczenie sygnatury
1. Flatten wszystkich elementów po kolei + separacja `|`:


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


```
subscription:status_changed|019972b2-0360-7177-a635-f26b05f632b8|2025-09-22T20:31:32+02:00|019972b1-e4df-70c4-8c9b-6a89f6ccc948|e65c7519|subscription_active|BLIK|2025-09-22T20:31:25+02:00|2025-09-22T20:31:32+02:00|O|PLN|019972b1-e4c0-714f-a10b-f88a158bee50|PAYID|AABBCCDD|testy|alias_active|2025-09-22T20:31:25+02:00|2025-09-22T20:31:32+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', 'subscription:status_changed|019972b2-0360-7177-a635-f26b05f632b8|2025-09-22T20:31:32+02:00|019972b1-e4df-70c4-8c9b-6a89f6ccc948|e65c7519|subscription_active|BLIK|2025-09-22T20:31:25+02:00|2025-09-22T20:31:32+02:00|O|PLN|019972b1-e4c0-714f-a10b-f88a158bee50|PAYID|AABBCCDD|testy|alias_active|2025-09-22T20:31:25+02:00|2025-09-22T20:31:32+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. W tym przypadku wynikiem hashowania będzie
`0851c6bc63e92bff424a83ab9067c192d6e9a1b5d67ade9960f0cce67216d3f1`.