Cykl życia subskrypcji

W trakcie cyklu życia zakupy subskrypcji mogą przechodzić przez różne stany, w zależności od wielu czynników, takich jak automatyczne odnawianie, odrzucenie płatności czy działania podejmowane przez dewelopera.

Obsługa cyklu życia subskrypcji automatycznie odnawianych

Gdy stan subskrypcji użytkownika ulegnie zmianie, serwer backendowy otrzyma wiadomość SubscriptionNotification.

Rysunek 1. Stany cyklu życia i zdarzenia przejścia w przypadku zakupów subskrypcji z automatycznym odnawianiem.

Aby zaktualizować stan na backendzie, wywołaj interfejs API purchases.subscriptionsv2.get z tokenem zakupu zawartym w powiadomieniu. Ten punkt końcowy udostępnia najnowszy stan subskrypcji na podstawie tokena zakupu i jest uznawany za źródło danych dotyczących zarządzania subskrypcją.

Token zakupu jest ważny od momentu rejestracji subskrypcji do 60 dni po dacie wygaśnięcia. Po tym terminie token zakupu nie będzie już ważny do wywoływania interfejsu Google Play Developer API.

Nowe zakupy subskrypcji z automatycznym odnawianiem

Gdy użytkownik kupi subskrypcję, do klienta RTDN zostanie wysłana wiadomość SubscriptionNotification z typem SUBSCRIPTION_PURCHASED. Niezależnie od tego, czy otrzymasz to powiadomienie, czy zarejestrujesz nowy zakup w aplikacji za pomocą PurchasesUpdatedListener lub ręcznego pobierania zakupów za pomocą metody onResume() aplikacji, musisz przetworzyć nowy zakup w bezpiecznym backendzie. W tym celu należy wykonać następujące czynności:

  1. Prześlij zapytanie do punktu końcowego purchases.subscriptionsv2.get, aby uzyskać zasób subskrypcji, który zawiera najnowszy stan subskrypcji.
  2. Upewnij się, że wartość pola subscriptionState to SUBSCRIPTION_STATE_ACTIVE.
  3. Zweryfikuj zakup.
  4. Przyznaj użytkownikowi dostęp do treści. Konto użytkownika powiązane z zakupem można zidentyfikować za pomocą obiektu ExternalAccountIdentifiers z zasosobu subskrypcji, jeśli identyfikatory zostały ustawione w momencie zakupu za pomocą parametrów setObfuscatedAccountIdsetObfuscatedProfileId.

Biblioteka płatności Play zawiera też metodę potwierdzania subskrypcji (acknowledgePurchase()) oraz metodę sprawdzania stanu potwierdzenia (isAcknowledged()). Zalecamy jednak przetwarzanie zakupów na zapleczu, aby zwiększyć bezpieczeństwo.

Zasób subskrypcji dla nowych zakupów wygląda mniej więcej tak:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Odnawianie subskrypcji

W przypadku subskrypcji bez rat i z automatycznym odnawianiem powiadomienie SUBSCRIPTION_RENEWEDzostaje wysłane, gdy subskrypcja zostanie odnowiona. W przypadku subskrypcji ratalnych wysyłamy powiadomienie SUBSCRIPTION_RENEWED za każdym razem, gdy pobieramy opłatę za subskrypcję w dniu rozliczenia. Upewnij się, że użytkownik nadal ma uprawnienia do subskrypcji, a potem zaktualizuj stan subskrypcji za pomocą nowego parametru expiryTime podanego w zasobie subskrypcji zwróconym przez interfejs Google Play Developer API. Zasób subskrypcji wygląda podobnie do tego przykładu:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

Nie musisz potwierdzać odnowienia subskrypcji.

Okres prolongaty

Jeśli wystąpią problemy z płatnościami związane z odnowieniem subskrypcji, Google powiadomi użytkownika i przez jakiś czas będzie okresowo próbować odnowić subskrypcję przed jej wygaśnięciem. Ten okres, w którym można odzyskać dostęp do subskrypcji, składa się z okresu prolongaty, po którym następuje okres zawieszenia konta. W okresie prolongaty użytkownik powinien nadal mieć dostęp do uprawnień w ramach subskrypcji.

Metoda queryPurchasesAsync() nadal umożliwia zwrot zakupów w okresie karencji. Jeśli Twoja aplikacja korzysta tylko z funkcji queryPurchasesAsync, aby sprawdzić, czy użytkownik ma prawo do subskrypcji, powinna automatycznie obsługiwać okresy próbne, ponieważ te subskrypcje są wyświetlane jako aktywne w Bibliotece płatności Google Play.

Synchronizacja stanu subskrypcji z backendem pozwala lepiej monitorować odrzucone płatności i zapewnia więcej kontekstu, gdy próbujesz ograniczyć niezamierzone odejścia użytkowników. Aby otrzymywać powiadomienia, gdy użytkownik wejdzie w okres karencji, sprawdzaj, czy pojawiają się wiadomości SubscriptionNotification typu SUBSCRIPTION_IN_GRACE_PERIOD. Podczas okresu prolongaty zasobu subskrypcji zawierającego autoRenewEnabled = true. Google Play dynamicznie wydłuża wartość expiryTime do czasu wygaśnięcia okresu prolongaty, ponieważ uprawnienia powinny obowiązywać do czasu anulowania przez użytkownika lub do momentu, gdy okres prolongaty osiągnie maksymalną długość. Wartość pola subscriptionState w tym okresie wynosiSUBSCRIPTION_STATE_IN_GRACE_PERIOD. Zasób subskrypcji wygląda podobnie do tego:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Google Play informuje użytkowników, którzy znajdują się w okresie prolongaty, że płatność została odrzucona, i prosi o rozwiązanie problemów z formą płatności w Google Play. Gdy użytkownik wejdzie w okres prolongaty, zachęć go do rozwiązania problemu z formą płatności, jeśli nie był on spowodowany przez użytkownika. Najprostszym sposobem na to jest użycie interfejsu API do obsługi wiadomości w aplikacji. Jeśli wywołasz to API, gdy użytkownik otwiera aplikację, wyświetli się mu tymczasowy komunikat w pasku powiadomień Google Play informujący, że płatność została odrzucona. Wiadomość zawiera też precyzyjny link, który umożliwia użytkownikowi poprawienie formy płatności w Google Play.

Gdy użytkownik poprawi formę płatności, subskrypcja zostanie odnowiona z pierwotną datą odnowienia, a Ty możesz zarządzać odnowieniem zgodnie z opisem w sekcji Odnowienia.

Jeśli użytkownik nie rozwiąże problemów z formą płatności w okresie prolongaty, jego subskrypcja zostanie zawieszona, a on sam utraci uprawnienia.

Dostęp do okresu prolongaty i jego przywracanie

Rysunek 2 przedstawia harmonogram subskrypcji, która wchodzi w okres prolongaty, a potem zostaje przywrócona, gdy użytkownik naprawi formę płatności. Po upływie tego okresu użytkownik powinien utracić korzyści wynikające z subskrypcji i utracić dostęp do konta.

Rysunek 2. Czas trwania subskrypcji, która wchodzi w okres prolongaty i powraca do stanu terminowego regulowania płatności przed jego zakończeniem.

Pamiętaj o tych kwestiach:

  • W okresie prolongaty użytkownik powinien zachować dostęp do korzyści wynikających z subskrypcji.
  • Gdy subskrypcja zostanie przywrócona w okresie przejściowym, data odnowienia nie zostanie zresetowana.
  • Jeśli wydłużysz okres prolongaty (np. z 7 do 14 dni), użytkownicy, którzy są w tym okresie, uzyskają dłuższy dostęp do korzyści wynikających z subskrypcji.
  • Jeśli skrócisz okres prolongaty, użytkownicy, którzy są już na tyle daleko w starym okresie prolongaty, że przekraczają nowy okres prolongaty, natychmiast tracą korzyści wynikające z subskrypcji. Jeśli na przykład skrócisz okres karencji z 14 do 7 dni, użytkownicy, którzy są w dniach 8–14 starego okresu karencji, natychmiast tracą korzyści wynikające z subskrypcji.
  • Subskrypcja pozostaje aktywna i nie otrzymasz okresu przejściowego RTDN, dopóki nie zakończy się okres ciszy.

Okres prolongaty bez powiadomień

Możesz ustawić okres karencji wynoszący 0 dni, ale Google Play będzie czekać co najmniej 1 dzień, aby zapewnić wystarczająco dużo czasu na ponowne próby płatności. Ten okres prolongaty zapewnia siatkę bezpieczeństwa dla procesu przetwarzania płatności. W ciągu tych 24 godzin subskrypcja pozostaje w stanieACTIVE.

Najlepszym sposobem na śledzenie zmian stanu subskrypcji jest słuchanie i reagowanie na powiadomienia dla deweloperów w czasie rzeczywistym. Aby uzyskać dokładniejszy stan subskrypcji, wywołaj metodę purchases.subscriptionsv2.get() w czasie RTDN, a nie w czasie wygaśnięcia.

W zależności od stanu subskrypcji po 24‑godzinnym okresie bezgłośnego oczekiwania otrzymasz jedno z tych powiadomień:

  • SUBSCRIPTION_ON_HOLD (jeśli jest włączona)
  • SUBSCRIPTION_CANCELED (jeśli została anulowana)
  • SUBSCRIPTION_EXPIRED (jeśli wygasł)
  • SUBSCRIPTION_RENEWED (jeśli odnowienie się powiodło)

Możesz też wywołać metodę subscriptionV2.get() w dowolnym momencie po 24-godzinnym okresie prolongaty, aby uzyskać najnowszy stan subskrypcji.

Zawieszenie konta

Jeśli wystąpią problemy z płatnością przy odnawianiu subskrypcji, po zakończeniu okresu prolongaty rozpocznie się okres zawieszenia konta. Gdy subskrypcja zostanie zawieszona, należy zablokować dostęp do uprawnień w ramach subskrypcji.

Podczas zawieszenia konta nadal musisz obsługiwać anulowania, przywracania i ponownie kupowania subskrypcji, ponieważ użytkownik może wprowadzić te zmiany, gdy subskrypcja jest zawieszona.

RTDN powiadomią Cię, gdy użytkownik wejdzie w okres zawieszenia konta, aby jak najszybciej poinformować go o przyczynie zawieszenia dostępu do subskrypcji. Najprostszym sposobem jest użycie interfejsu API do wysyłania wiadomości w aplikacji. Wywołanie tego interfejsu API, gdy użytkownik otworzy aplikację, spowoduje wyświetlenie mu w tymczasowym pasku informacji komunikatu o odrzuceniu płatności. Wiadomość zawiera też precyzyjny link, który umożliwia użytkownikowi poprawienie formy płatności w Google Play.

Jeśli użytkownicy mogą uzyskać dostęp do treści subskrypcji poza Twoją aplikacją, mogą odkryć, że utracili dostęp na innych platformach. Możesz wysłać użytkownikowi powiadomienie push lub e-maila z informacją, że jego subskrypcja nie jest już aktywna z powodu odrzucenia płatności.

Podczas wstrzymania konta subskrypcja nie jest zwracana przez metodę queryPurchasesAsync(), więc jeśli Twoja aplikacja korzysta z tej metody do wyświetlania dotychczasowych zakupów, powinna domyślnie obsługiwać wstrzymanie konta.

Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów, gdy subskrypcja zostanie wstrzymana, otrzymasz wiadomość SubscriptionNotification z typem SUBSCRIPTION_ON_HOLD. Aby pobrać informacje o nowej subskrypcji, wywołaj metodę purchases.subscriptionsv2.get na bezpiecznym serwerze zaplecza. Podczas zawieszenia konta pole expiryTimezasobie subskrypcji ma ustawiony poprzedni znacznik czasu, a pole subscriptionState – wartość SUBSCRIPTION_STATE_ON_HOLD:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Aby przywrócić dostęp, użytkownicy muszą poprawić formę płatności. Google Play informuje użytkowników o zablokowaniu konta o odmowie płatności. Zachęć ich też do poprawienia formy płatności.

Gdy użytkownik naprawi formę płatności, subskrypcja wróci do aktywnego stanu, a Ty musisz przywrócić dostęp do treści. W tym przypadku token zakupu jest taki sam jak przed wstrzymaniem działania konta, ponieważ ten sam zakup jest przywracany. Otrzymasz RTDN z typem SUBSCRIPTION_RECOVERED.

W przypadku subskrypcji ratalnych odrzucenia i odzyski płatności mogą wystąpić w przypadku każdej próby płatności.

Po przywróceniu Biblioteka płatności w Google Play ponownie zwraca subskrypcję za pomocą metody queryPurchasesAsync(). Jeśli używasz tej metody, aby określić, czy użytkownik ma prawo do subskrypcji, Twoja aplikacja powinna automatycznie odzyskać subskrypcję z zablokowanego konta.

Aby otrzymywać powiadomienia o przywróceniu subskrypcji i przywróceniu dostępu użytkownikowi, czekaj na wiadomość SubscriptionNotification z typem SUBSCRIPTION_RECOVERED. Jeśli po otrzymaniu tego powiadomienia prześlesz zapytanie o subskrypcję, pole expiryTime zostanie ustawione na sygnaturę czasową w przyszłości, a pole subscriptionState znów będzie miało wartość SUBSCRIPTION_STATE_ACTIVE:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Jeśli użytkownik nie rozwiąże problemów z formą płatności przed końcem okresu blokady konta, otrzymasz zamiast tego RTDN z typem SUBSCRIPTION_CANCELED. Instrukcje dotyczące postępowania w przypadku anulowania znajdziesz w sekcji Anulowanie. Gdy wysyłasz zapytanie o subskrypcję, która została w ten sposób anulowana, zwracane pole expiryTime zawiera datę i godzinę anulowania:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Bezpośrednio po otrzymaniu powiadomienia o anulowaniu podczas zawieszenia konta otrzymasz też RTDN z typem SUBSCRIPTION_EXPIRED, ponieważ użytkownik utracił uprawnienia do płatnej subskrypcji, a subskrypcja została anulowana. Tego rodzaju wygaśnięcia możesz dokonać w standardowy sposób.

Użytkownik może odzyskać dostęp, ponownie kupując ten sam abonament lub inny abonament oferowany w aplikacji w okresie blokady konta od pierwotnego zakupu. W takim przypadku wydawany jest nowy token zakupu, a nowa wartość jest zwracana w ramach zdarzenia SUBSCRIPTION_PURCHASED, które reprezentuje ten nowy przypadek.

Dostęp do zawieszonego konta i jego odzyskiwanie

Rysunek 3 przedstawia harmonogram subskrypcji, która zostaje zawieszona, a następnie przywrócona, gdy użytkownik poprawi formę płatności.

Rysunek 3. Czas trwania subskrypcji, która zostaje zawieszona, a następnie wznowiona przed zakończeniem.

Podobnie jak w poprzednim przykładzie, rysunek 4 przedstawia harmonogram subskrypcji, który najpierw wchodzi w okres prolongaty, a potem zostaje przywrócony w okresie zawieszenia.

Rysunek 4. Oś czasu subskrypcji, która wchodzi w okres prolongaty, a następnie zostaje zawieszona, a na końcu przywrócona przed zakończeniem zawieszenia.

Pamiętaj o tych kwestiach:

  • Zanim subskrypcja zostanie zawieszona, Google Play przez 48 godzin będzie podejmować dodatkowe próby obciążenia formy płatności. W tym czasie użytkownik zachowuje korzyści wynikające z subskrypcji. Po upływie tego okresu subskrypcja zostaje zawieszona, a użytkownik traci dostęp do korzyści wynikających z subskrypcji.
  • Gdy subskrypcja wznowi działanie po wstrzymaniu z nieudaną formą płatności, zostanie bezpośrednio zawieszona.
  • Gdy subskrypcja zostanie przywrócona po zawieszeniu konta, data odnowienia zostanie zresetowana.

Zakończenie okresu wypożyczenia

Po wygaśnięciu subskrypcji użytkownik powinien utracić do niej dostęp. W takim przypadku wysyłana jest wiadomość SubscriptionNotification o typie SUBSCRIPTION_EXPIRED. Po otrzymaniu tego powiadomienia prześlij zapytanie do interfejsu Google Play Developer API, aby pobrać najnowsze zasobne subskrypcji. Gdy potwierdzisz, że subscriptionState to SUBSCRIPTION_STATE_EXPIRED, usuń uprawnienia i zarejestruj stan zakupu jako nieprawidłowy w backendzie. Zasób subskrypcji wygląda podobnie do tego przykładu:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

Anulowania

Użytkownik może dobrowolnie anulować subskrypcję w centrum subskrypcji Google Play lub jego subskrypcja zostanie automatycznie anulowana, jeśli nie uda mu się odzyskać dostępu do konta po zablokowaniu. Deweloperzy mogą też wywołać anulowanie za pomocą purchases.subscriptions.cancel. Po anulowaniu subskrypcji użytkownik zachowuje dostęp do treści do końca bieżącego cyklu rozliczeniowego. Po zakończeniu cyklu rozliczeniowego dostęp powinien zostać cofnięty.

Anulowanie subskrypcji automatycznie odnawianej, która nie jest płatna w ratach, powoduje wyświetlenie powiadomienia SUBSCRIPTION_CANCELED. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony przez interfejs Google Play Developer API ma pole subscriptionState ustawione na SUBSCRIPTION_STATE_CANCELED, a pole expiryTime zawiera datę, w której użytkownik utraci dostęp do subskrypcji. Jeśli data jest w przeszłości, użytkownik powinien natychmiast utracić uprawnienia. Może się tak zdarzyć, jeśli użytkownik anuluje subskrypcję, gdy konto jest wstrzymane z powodu odrzucenia płatności.

Zasób subskrypcji anulowanego zakupu wygląda mniej więcej tak:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

W przypadku subskrypcji ratalnych po anulowaniu przez użytkownika wysyłane jest powiadomienie SUBSCRIPTION_CANCELLATION_SCHEDULED, gdy płatności pozostają do zapłaty w okresie zobowiązania. Anulowanie jest w trakcie rozpatrywania i wchodzi w życie z końcem bieżącego okresu zobowiązania. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony przez interfejs Google Play Developer API będzie miał pole subscriptionState ustawione na SUBSCRIPTION_STATE_ACTIVE, ponieważ subskrypcja ratalna jest nadal aktywna do końca okresu zobowiązania. Występuje jednak pusty obiekt pendingCancellation. Na koniec okresu zobowiązania wysyłamy powiadomienie SUBSCRIPTION_CANCELED, a następnie SUBSCRIPTION_EXPIRED.

Zasób subskrypcji dla zakupu subskrypcji ratalnej, który oczekuje na anulowanie, wygląda mniej więcej tak:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

Aby dowiedzieć się, dlaczego subskrypcja została anulowana (np. czy anulował ją użytkownik, system czy Ty), sprawdź pole canceledStateContext w zasobie subskrypcji. Jeśli subskrypcja została anulowana przez użytkownika, możesz sprawdzić pole userInitiatedCancellation, aby dowiedzieć się, dlaczego użytkownik zrezygnował z subskrypcji. Może to pomóc w określaniu strategii komunikacji.

Gdy subskrypcja została anulowana, ale nie wygasła, jest nadal zwracana z queryPurchasesAsync(). Możesz wyświetlić w aplikacji wiadomość z informacją o anulowaniu subskrypcji i datą jej wygaśnięcia.

Unieważnienia

Subskrypcję można anulować z różnych powodów, m.in. gdy Ty anulujesz ją na swoim backendzie za pomocą purchases.subscriptionsv2.revoke lub gdy anulowana zostanie płatność za zakup. W takim przypadku natychmiast cofnij uprawnienia użytkownika. W takim przypadku wysyłana jest wiadomość SubscriptionNotification o typie SUBSCRIPTION_REVOKED. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony przez interfejs Google Play Developer API będzie miał pole subscriptionState ustawione na SUBSCRIPTION_STATE_EXPIRED.

Zasób subskrypcji w przypadku anulowanego zakupu wygląda mniej więcej tak:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

Odroczone subskrypcje

Istnieje wiele powodów, dla których warto przedłużyć uprawnienia użytkownika. Możesz na przykład zaoferować użytkownikom bezpłatny dostęp w ramach specjalnej promocji, np. 1 tydzień bezpłatnego dostępu po zakupie filmu lub bezpłatny dostęp dla klientów jako gest dobrej woli. Aby zmienić datę następnej płatności w przypadku subskrypcji z automatycznym odnawianiem, możesz użyć metody purchases.subscriptions.defer w interfejsie Play Developer API. W tym celu wyślij wiadomość SubscriptionNotification typu SUBSCRIPTION_DEFERRED. W tym okresie użytkownik ma subskrypcję Twoich treści z pełnym dostępem, ale nie są od niego pobierane opłaty. Data odnowienia subskrypcji zostanie zmieniona na nową.

W przypadku abonamentów przedpłaconych możesz użyć interfejsu API do opóźniania płatności, aby odroczyć czas wygaśnięcia.

Zasób subskrypcji opóźnionej wygląda podobnie do tego:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

Wstrzymane subskrypcje

Aby zmniejszyć liczbę dobrowolnych rezygnacji, możesz włączyć użytkownikom możliwość wstrzymania subskrypcji. Gdy włączysz tę funkcję, użytkownicy będą mogli wstrzymywać subskrypcję na okres od tygodnia do 3 miesięcy w zależności od cyklu rozliczeniowego.

Powtarzająca się subskrypcja Co tydzień Co miesiąc 3-miesięczna 6-miesięczny rocznych
Dostępne długości przerw* 1 tydzień
2 tygodnie
3 tygodnie
4 tygodnie
1 miesiąc
2 miesiące
3 miesiące
1 miesiąc
2 miesiące
3 miesiące
1 miesiąc
2 miesiące
3 miesiące
Nie dotyczy
*Może ulec zmianie w każdej chwili.

Wstrzymanie subskrypcji jest możliwe dopiero po zakończeniu bieżącego okresu rozliczeniowego. Gdy subskrypcja jest wstrzymana, użytkownik nie ma do niej dostępu i nie płaci za odnowienie. Po zakończeniu okresu wstrzymania subskrypcja zostanie wznowiona, a Google spróbuje ją odnowić. Jeśli to się uda, wznowiona subskrypcja stanie się znowu aktywna. Jeśli wznowienie nie powiedzie się z powodu problemu z płatnością, użytkownik wejdzie w stan wstrzymania konta, jak pokazano na rysunkach 5 i 6:

Rysunek 5. Użytkownik wstrzymuje, a potem wznawia subskrypcję.
Rysunek 6. Użytkownik wstrzymuje subskrypcję, a następnie zawiesza konto.

Użytkownik może też w dowolnym momencie w okresie zawieszenia subskrypcji ręcznie wznowić subskrypcję (patrz rysunek 6). Gdy użytkownik wznowi subskrypcję ręcznie, data płatności zmieni się na datę wznowienia ręcznego.

Gdy subskrypcja użytkownika jest wstrzymana, Biblioteka rozliczeń Google Play nie zwraca subskrypcji za pomocą metody queryPurchasesAsync(). Jeśli subskrypcja zostanie wznowiona, metoda queryPurchasesAsync() zwróci ją ponownie.

Słuchaj RTDN, aby wiedzieć, kiedy użytkownik wstrzyma subskrypcję. Dzięki tym powiadomieniom możesz też poinformować użytkowników w aplikacji, że wstrzymali subskrypcję i nie mają do niej dostępu. Musisz też zapewnić użytkownikowi możliwość ręcznego wznowienia subskrypcji w dowolnym momencie za pomocą precyzyjnego linku do Google Play.

Gdy użytkownik wstrzyma subskrypcję, zostanie wysłana wiadomość SubscriptionNotification typu SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED. W tym czasie użytkownik powinien mieć dostęp do subskrypcji do następnej daty odnowienia, a zasób subskrypcji powinien zawierać autoRenewEnabled = true. W tym miejscu wartość pola subscriptionState wynosi SUBSCRIPTION_STATE_ACTIVE.

Gdy zawieszenie wejdzie w życie, zostanie wysłana wiadomość SubscriptionNotification o typie SUBSCRIPTION_PAUSED. W takim przypadku użytkownik powinien utracić dostęp do subskrypcji, a zasób subskrypcji powinien zawierać wartość autoRenewEnabled = true, a pole subscriptionState powinno mieć wartość SUBSCRIPTION_STATE_PAUSED. Aby sprawdzić, kiedy subskrypcja ma się znowu odnowić, sprawdź obiekt PausedStateContext.

Jeśli subskrypcja zostanie wznowiona automatycznie po zakończeniu okresu zawieszenia lub jeśli użytkownik zdecyduje się na ręczne wznowienie subskrypcji, zostanie wysłany komunikat SubscriptionNotification o typie SUBSCRIPTION_RENEWED. Należy postępować zgodnie z opisem w sekcji Odnawianie.

Jeśli podczas próby wznowienia subskrypcji po jej wstrzymaniu wystąpił błąd płatności, wysyłana jest wiadomość SubscriptionNotification o typie SUBSCRIPTION_ON_HOLD. W takich przypadkach należy postępować zgodnie z instrukcjami podanymi w sekcji Zablokowanie konta.

Subskrybuj ponownie

W przypadku abonamentów podstawowych odnawianych automatycznie w Sklepie Google Play może być wyświetlany przycisk Ponowna subskrypcja. Ten przycisk umożliwia użytkownikom odzyskanie dostępu do subskrypcji. Może to być spowodowane różnymi przyczynami, na przykład tym, że subskrypcja wygasła dawno temu.

Rysunek 7. Sekcja Konto > Subskrypcje w aplikacji Sklep Google Play, w której widać anulowaną subskrypcję z przyciskiem Subskrybuj ponownie
.

Chociaż przycisk ma zawsze etykietę Zasubskrybuj ponownie, jego działanie zależy od stanu subskrypcji.

Gdy subskrypcja została anulowana, ale jeszcze nie wygasła, użytkownik nadal jest subskrybentem i korzysta z przywilejów. Jeśli użytkownik kliknie Resubscribe (Znów zasubskrybuj), anulowanie zostanie cofnięte, a subskrypcja będzie nadal odnawiana. W dokumentacji i interfejsach API dla deweloperów w Google Play to działanie nazywa się przywracaniem.

Po wygaśnięciu subskrypcji automatycznie odnawianej możesz zezwolić użytkownikom na zakup tego samego abonamentu podstawowego. W dokumentacji i interfejsach API dla deweloperów w Google Play to działanie nazywa się resubscribe (czyli „ponowne subskrybowanie”). Możesz skonfigurować tę opcję dla każdego abonamentu podstawowego w Konsoli Play lub za pomocą interfejsu API.

Przywracanie przed wygaśnięciem

Jeśli Twoja aplikacja korzysta tylko z metody queryPurchasesAsync() do określania, czy użytkownik ma prawo do subskrypcji, powinna automatycznie obsługiwać przywracanie, ponieważ metoda queryPurchasesAsync() nadal zwraca anulowane zakupy przed ich datą wygaśnięcia. Odnowiona subskrypcja będzie się odnawiać tak, jakby nie została anulowana.

Jeśli Twoja aplikacja synchronizuje stan subskrypcji z backendem, powinna nasłuchiwać wiadomości SubscriptionNotification typu SUBSCRIPTION_RESTARTED. Po otrzymaniu RTDN aplikacja może odpowiedzieć na powiadomienie, zapisać informację, że subskrypcja ma zostać odnowiona, i zatrzymać wyświetlanie w aplikacji komunikatów dotyczących przywracania. Zasób subskrypcji wygląda podobnie do tego przykładu:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Ponowne subskrybowanie po wygaśnięciu

Jeśli abonament podstawowy z automatycznym odnawianiem został skonfigurowany za pomocą Konsoli Google Play lub interfejsu API, aby umożliwić ponowną subskrypcję, użytkownicy mogą ponownie kupić wygasłą subskrypcję w Sklepie Google Play.

To nowe zakupy. Google Play wydaje zupełnie nowy token zakupu, a Twój backend otrzymuje RTDN z typem SUBSCRIPTION_PURCHASED. Stan zakupu w przypadku tego typu zakupu poza aplikacją nie zawiera atrybutu linkedPurchaseTokenpowiązanego z pierwotnym zakupem, ponieważ pierwotna subskrypcja wygasła całkowicie. Są to nowe zakupy, które system musi przetworzyć i potwierdzić jak każdy inny zakup.

Przechodzenie na wyższą lub niższą wersję i ponowne subskrybowanie

Gdy użytkownik przejdzie na wyższą lub niższą wersję subskrypcji lub zarejestruje się w aplikacji po anulowaniu subskrypcji przed jej wygaśnięciem, stara subskrypcja zostanie unieważniona, a nowa subskrypcja zostanie utworzona z nowym tokenem zakupu.

Dodatkowo zasób subscription zwrócony przez interfejs Google Play Developer API zawiera pole linkedPurchaseToken, które wskazuje na stary zakup, w ramach którego użytkownik ulepszył, pogorszył lub ponownie wykupił subskrypcję. Możesz użyć tokena zakupu w tym polu, aby wyszukać starą subskrypcję i zidentyfikować istniejące konto użytkownika, dzięki czemu możesz powiązać nowy zakup z tym samym kontem.

Zanim w aplikacji zaoferujesz użytkownikowi opcję przejścia na wyższą lub niższą wersję subskrypcji albo ponownego subskrybowania, musisz potwierdzić jego obecną subskrypcję. Każda zmiana abonamentu lub ponowna subskrypcja jest zablokowana, jeśli istniejąca subskrypcja wciąż oczekuje na potwierdzenie.

Jeśli użytkownik kupił wyższą lub niższą wersję subskrypcji lub ponownie wykupił subskrypcję, jest to nowy zakup, który musisz zaakceptować. Zalecane jest użycie interfejsu Google Play Developer API. Zasób subskrypcji wygląda podobnie do tego przykładu:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

zmiany cen.

Więcej informacji o zmianach cen subskrypcji z automatycznym odnawianiem i o powiadamianiu użytkowników w odpowiednich przypadkach znajdziesz w przewodniku po sprawdzonych metodach dotyczących zmiany cen.

Gdy zmiany cen zostaną zastosowane do obecnych subskrybentów jako opcja dołączenia, otrzymasz RTDN, jeśli użytkownik potwierdzi lub odrzuci nową cenę.

Obsługa potwierdzenia przez użytkownika zmiany ceny wymagającej akceptacji

Gdy użytkownik zaakceptuje podniesienie ceny subskrypcji, otrzymasz wiadomość SubscriptionNotification z typem SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. W przypadku obniżki ceny z możliwością rezygnacji lub gdy cena subskrypcji zostanie ponownie podniesiona, otrzymasz wiadomość SubscriptionNotification z typem SUBSCRIPTION_RENEWED. Potraktuj to powiadomienie jak każde inne odnowienie.

Obsługa przypadków, w których wzrost ceny wymagający zgody użytkownika nie został zaakceptowany

Jeśli użytkownik nie zaakceptuje podwyżki ceny w przypadku możliwości akceptacji przed odnowieniem subskrypcji w wyższej cenie, zostanie automatycznie z niej wyrejestrowany, a Ty otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_CANCELED. Zgłoś to zdarzenie zgodnie z opisem w sekcji Anulowanie.

Użytkownicy mogą też anulować subskrypcję, aby zrezygnować z podwyżki ceny. Wystarczy, że zastosują ten sam mechanizm.

Obsługa cyklu życia abonamentów przedpłaconych

Podobnie jak w przypadku subskrypcji z automatycznym odnawianiem, musisz potwierdzić abonamenty przedpłacone po każdym nowym zakupie. W przypadku abonamentów przedpłaconych musisz w pełni przetworzyć zarówno początkowy zakup, jak i doładowania, ponieważ użytkownik musi za każdym razem przejść przez proces zakupu.

Ze względu na krótki czas trwania planu przedpłaconego ważne jest, aby jak najszybciej potwierdzić zakup. Subskrypcje przedpłacone o długości co najmniej 1 tygodnia muszą zostać potwierdzone w ciągu 3 dni. Plany przedpłacone o czasie trwania krótszym niż tydzień muszą zostać potwierdzone w ciągu połowy tego czasu. Na przykład deweloperzy mają 1, 5 dnia na potwierdzenie zakupu 3-dniowego abonamentu przedpłaconego.

Rysunek 8. Stany cyklu życia i zdarzenia przejścia dotyczące zakupów w ramach subskrypcji.

Gdy klient kupi subskrypcję abonamentu przedpłaconego, w tym przy każdym doładowaniu, do klienta RTDN wysyłane jest SubscriptionNotification wiadomość typu SUBSCRIPTION_PURCHASED. Aby sprawdzić najnowszy stan subskrypcji abonamentu przedpłaconego, wywołaj metodę purchases.subscriptionsv2.get.

W przypadku doładowań wydawany jest nowy token zakupu, a w polu linkedPurchaseToken w ramach nowego stanu zakupu subskrypcji otrzymasz token poprzedniego zakupu. Token zakupu jest ważny od momentu rejestracji subskrypcji do 60 dni po jej wygaśnięciu. Po tym terminie token zakupu nie będzie już ważny do wywoływania interfejsu Google Play Developer API.

Zasób subskrypcji w przypadku zakupu abonamentu przedpłaconego wygląda podobnie do tego:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

W polu expiryTime możesz sprawdzić, kiedy wygasa uprawnienie. Dokupując dodatkowy czas, zwiększasz czas uprawnienia, kumulując go. Oznacza to, że jeśli użytkownik dokupi subskrypcję przed wygaśnięciem pierwotnego okresu, nowy czas zostanie dodany do poprzedniego terminu ważności.

Możesz wyświetlić w aplikacji wiadomość informującą użytkownika, że abonamenty przedpłacone można przedłużyć przez doładowanie. Aby dowiedzieć się, kiedy użytkownik będzie mógł doładować konto, sprawdź pole allowExtendAfterTime w zasobie subskrypcji.

Abonamenty przedpłacone nie są automatycznie odnawiane, więc nie można ich anulować. Jeśli użytkownik chce anulować abonament przedpłacony, może dopuścić do upływu jego daty ważności.