Cykl życia subskrypcji

W trakcie cyklu życia subskrypcji mogą się zmieniać w różnych stanach w zależności od wielu czynników, takich jak automatyczne odnawianie, odrzucenie płatności czy działania związane z zarządzaniem przez dewelopera.

Obsługa cyklu życia automatycznie odnawianych subskrypcji

Gdy zmieni się stan subskrypcji użytkownika, serwer backendu otrzyma komunikat SubscriptionNotification

Rysunek 1. Stany cyklu życia i zdarzenia przejścia w przypadku automatycznie odnawianych subskrypcji.

Aby zaktualizować stan w backendzie, wywołaj interfejs API purchases.subscriptionsv2.get z tokenem zakupu dołączonym do powiadomienia. Ten punkt końcowy podaje najnowszy stan subskrypcji dla tokena zakupu i jest uważany za źródło wiarygodnych informacji do zarządzania subskrypcjami.

Token zakupu jest ważny od momentu rejestracji subskrypcji przez 60 dni od daty jej wygaśnięcia. Po tej dacie token zakupu nie będzie już mógł być używany do wywoływania interfejsu Google Play Developer API.

Nowe, automatycznie odnawiane subskrypcje

Gdy użytkownik kupi subskrypcję, do Twojego klienta RTDN zostanie wysłany komunikat SubscriptionNotification typu SUBSCRIPTION_PURCHASED. Niezależnie od tego, czy otrzymasz to powiadomienie, czy zarejestrujesz nowy zakup w aplikacji za pomocą PurchasesUpdatedListener lub ręcznie pobierając zakupy za pomocą metody onResume() w aplikacji, nowy zakup musisz przetworzyć w bezpiecznym backendzie. Jak to zrobić:

  1. Wyślij zapytanie do punktu końcowego purchases.subscriptionsv2.get, aby uzyskać zasób subskrypcji zawierający najnowszy stan subskrypcji.
  2. Upewnij się, że wartość pola subscriptionState jest ustawiona na SUBSCRIPTION_STATE_ACTIVE.
  3. Zweryfikuj zakup.
  4. Przyznać użytkownikowi dostęp do treści. Konto użytkownika powiązane z zakupem można zidentyfikować za pomocą obiektu ExternalAccountIdentifiers z zasobu subskrypcji, jeśli w momencie zakupu ustawiono identyfikatory za pomocą metod setObfuscatedAccountId i setObfuscatedProfileId.

Biblioteka płatności w Play zawiera też metodę potwierdzania subskrypcji (acknowledgePurchase()) oraz metodę sprawdzania stanu potwierdzenia isAcknowledged(). Aby zwiększyć bezpieczeństwo, zalecamy jednak obsługę przetwarzania zakupów w backendzie.

Zasób subskrypcji dla nowych zakupów 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_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Odnawianie subskrypcji

W momencie odnowienia automatycznie odnawianej subskrypcji wysyłane jest powiadomienie SUBSCRIPTION_RENEWED. Sprawdź, czy użytkownik nadal ma uprawnienia do subskrypcji, a następnie zaktualizuj stan subskrypcji o nowy expiryTime podany w zasobie subskrypcji zwróconym z interfejsu 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ć odnowień subskrypcji.

Okres prolongaty

W przypadku problemów z płatnościami z odnowieniem subskrypcji Google powiadamia użytkownika i okresowo próbuje ją odnowić na jakiś czas przed jej wygaśnięciem. Okres przywracania może obejmować okres prolongaty, po którym następuje okres zawieszenia konta. W okresie prolongaty użytkownik powinien nadal mieć dostęp do subskrypcji.

Metoda queryPurchasesAsync() nadal zwraca zakupy w okresie prolongaty. Jeśli Twoje aplikacje sprawdzają, czy użytkownik może korzystać z subskrypcji, wymaga wyłącznie queryPurchasesAsync, okresy prolongaty powinny być automatycznie realizowane, ponieważ te subskrypcje są wyświetlane w Bibliotece płatności w Play jako aktywne.

Synchronizacja stanu subskrypcji z backendem pozwala otrzymywać więcej informacji o odrzuconych płatnościach i zapewnia lepszy kontekst podczas próby zmniejszenia liczby mimowolnych rezygnacji. Nasłuchuj wiadomości SubscriptionNotification typu SUBSCRIPTION_IN_GRACE_PERIOD, aby otrzymać powiadomienie, gdy użytkownik rozpocznie okres prolongaty. Gdy użytkownik jest w okresie prolongaty, zasób subskrypcji zawiera autoRenewEnabled = true. Google Play dynamicznie rozszerza wartość expiryTime do upłynięcia okresu prolongaty, ponieważ upoważnienie powinno obowiązywać do momentu anulowania przez użytkownika lub do upłynięcia okresu prolongaty. Wartość w polu subscriptionState w tym okresie wynosi SUBSCRIPTION_STATE_IN_GRACE_PERIOD. Zasób subskrypcji wygląda podobnie do tego przykładu:

{
  "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 w okresie prolongaty o odrzuceniu ich płatności oraz prosi o rozwiązanie problemów z formą płatności w Sklepie Play. Gdy użytkownik rozpocznie okres prolongaty, również zachęć go do zmiany formy płatności, na wypadek gdyby błąd był niezamierzony. Najłatwiej zrobić to za pomocą interfejsu In-App Messaging API. Jeśli wywołasz ten interfejs API, gdy użytkownik otworzy aplikację, na tymczasowym pasku powiadomień wyświetli się komunikat Google Play z informacją o odrzuceniu płatności. Ten komunikat zawiera też precyzyjny link, który pozwala użytkownikowi poprawić formę płatności w Google Play.

Gdy tylko użytkownik poprawi formę płatności, subskrypcja zostanie odnowiona z pierwotną datą odnowienia. Odnawianie można przeprowadzić zgodnie z opisem w sekcji Odnawianie.

Jeśli w okresie prolongaty użytkownik nie poprawi formy płatności, subskrypcja zostanie zawieszona i utraci uprawnienia.

Dostęp do okresu prolongaty i odzyskiwanie dostępu

Rysunek 2 przedstawia harmonogram subskrypcji, która rozpoczyna się i odzyskuje, gdy użytkownik naprawi formę płatności. Po zakończeniu okresu prolongaty użytkownik powinien utracić dostęp do korzyści z subskrypcji i nawiązać konto do zawieszenia.

Rysunek 2. Oś czasu subskrypcji, na którą rozpoczyna się okres prolongaty i jest przywracany przed 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 prolongaty, data odnowienia nie zostanie zresetowana.
  • Jeśli wydłużysz okres prolongaty, np. z 7 do 14 dni, użytkownicy w okresie prolongaty uzyskają dłuższy dostęp do korzyści wynikających z subskrypcji.
  • Jeśli skrócisz okres prolongaty, użytkownikom, którzy upłynęli wystarczająco długo, aby okres prolongaty upłynął, i jego korzyści z subskrypcji zostaną natychmiast anulowane. Jeśli na przykład skrócisz okres prolongaty z 14 do 7 dni, użytkownikom w dniach 8–14 starego okresu prolongaty korzyści z subskrypcji zostaną natychmiast anulowane.
  • Subskrypcja pozostanie w stanie aktywnym i do czasu zakończenia cichego okresu nie będziesz otrzymywać czasu korespondencyjnego dotyczącego okresu prolongaty.

Okres prolongaty cichych

Możesz ustawić okres prolongaty na 0 dni, ale Google Play będzie czekać co najmniej 1 dzień, aby zapewnić wystarczającą ilość czasu na ponowne próby dokonania płatności. Ten cichy okres prolongaty zapewnia możliwość bezpieczeństwa podczas przetwarzania płatności. W ciągu tego 24-godzinnego okresu subskrypcja pozostanie w stanie ACTIVE.

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

W zależności od stanu subskrypcji po 24 godzinach okresu karencji otrzymasz jedno z tych powiadomień:

  • SUBSCRIPTION_ON_HOLD (jeśli ta opcja jest włączona)
  • SUBSCRIPTION_CANCELED (po anulowaniu)
  • SUBSCRIPTION_EXPIRED (jeśli stracił ważność)
  • SUBSCRIPTION_RENEWED (jeśli została odnowiona)

Po upływie 24-godzinnego okresu prolongaty możesz też wywołać metodę subscriptionV2.get(), aby sprawdzić najnowszy stan subskrypcji.

Zawieszenie konta

W przypadku problemów z odnowieniem subskrypcji po zakończeniu okresu prolongaty rozpoczyna się okres zawieszenia konta. Gdy subskrypcja zostanie zawieszona, zablokuj dostęp do niej.

W trakcie zawieszenia konta musisz kontynuować obsługę wszelkich anulowań, przywracania i ponownego zakupu subskrypcji, ponieważ wtedy użytkownik może wprowadzić te zmiany, gdy jest wstrzymana.

RTDN powiadamia użytkownika, gdy rozpocznie się okres zawieszenia konta. Dzięki temu możesz jak najszybciej poinformować użytkownika o przyczynach zawieszenia dostępu do subskrypcji. Aby zrobić to w prosty sposób, użyj interfejsu In-App Messaging API. Wywołanie tego interfejsu API, gdy użytkownik otworzy aplikację, spowoduje wyświetlenie na tymczasowym pasku powiadomień komunikatu, że płatność została odrzucona. Ten komunikat zawiera też precyzyjny link, który pozwala użytkownikowi poprawić formę płatności w Google Play.

Jeśli użytkownicy mają dostęp do treści objętych subskrypcją poza aplikacją, mogą się dowiedzieć, ż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.

Subskrypcja nie jest zwracana przez metodę queryPurchasesAsync() podczas zawieszenia konta, więc jeśli aplikacja wyświetla informacje o dotychczasowych zakupach za pomocą tej metody, zalecamy, aby domyślnie umożliwić zawieszenie konta.

Dzięki powiadomieniom dla deweloperów w czasie rzeczywistym, gdy subskrypcja zostanie zawieszona, otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_ON_HOLD. Wywołaj metodę purchases.subscriptionsv2.get z bezpiecznego serwera backendu, aby pobrać nowe informacje o subskrypcji. Podczas zawieszenia konta pole expiryTime zasobu subskrypcji jest ustawione na wcześniejszą sygnaturę czasową, a pole subscriptionState ma 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ą rozwiązać problemy z formą płatności. Google Play informuje użytkowników o zawieszeniu konta o odrzuceniu płatności i polecaj im też rozwiązanie problemu z formą płatności.

Gdy użytkownik naprawi formę płatności, subskrypcja wraca do stanu aktywności i trzeba wtedy przywrócić dostęp do subskrybowanych treści. W tym przypadku token zakupu jest taki sam jak przed zawieszeniem konta, ponieważ ten sam zakup jest przywracany i otrzymasz RTDN typu SUBSCRIPTION_RECOVERED.

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

Posłuchaj komunikatu SubscriptionNotification typu SUBSCRIPTION_RECOVERED, aby otrzymać powiadomienie, gdy subskrypcja zostanie przywrócona i użytkownik powinien odzyskać dostęp. Jeśli po otrzymaniu tego powiadomienia wyślesz zapytanie o subskrypcję, w polu expiryTime zostanie ustawiona sygnatura czasowa z przyszłości, a pole subscriptionStateSUBSCRIPTION_STATE_ACTIVE:

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

Jeśli użytkownik nie poprawi formy płatności przed końcem okresu zawieszenia konta, otrzymasz powiadomienie RTDN typu SUBSCRIPTION_CANCELED. Instrukcje, jak postępować w przypadku anulowania, znajdziesz w sekcji Anulowanie. Gdy wyślesz zapytanie o subskrypcję, która została anulowana w ten sposób, zwrócone pole expiryTime będzie ustawiane na wcześniejszą sygnaturę czasową:

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

Natychmiast po otrzymaniu powiadomienia o zamknięciu konta (w trakcie zawieszenia konta) otrzymasz też powiadomienie RTDN o typie SUBSCRIPTION_EXPIRED, ponieważ użytkownik nie ma już płatnego upoważnienia, a subskrypcja została anulowana. Możesz objąć datą wygaśnięcia w zwykły sposób.

Użytkownik może odzyskać dostęp, ponownie kupując tę samą subskrypcję lub dowolny inny pakiet oferowany przez Ciebie w aplikacji w okresie zawieszenia konta. W takim przypadku wydawany jest nowy token zakupu, a nowa wartość jest zwracana jako część zdarzenia SUBSCRIPTION_PURCHASED reprezentującego nową instancję.

Dostęp do zawieszenia konta i jego odzyskiwanie

Rysunek 3 przedstawia ramy czasowe subskrypcji, po których następuje zawieszenie konta, a następnie przywracamy po naprawieniu formy płatności przez użytkownika.

Rysunek 3. Oś czasu subskrypcji, po której następuje zawieszenie konta i przywracamy przed zakończeniem.

Podobnie jak w poprzednim przykładzie, Rysunek 4 przedstawia harmonogram subskrypcji, która rozpoczyna się okres prolongaty przed zawieszeniem konta, a następnie zostaje wznowiona w przypadku zawieszenia.

Rysunek 4. Oś czasu subskrypcji, w przypadku której rozpoczyna się okres prolongaty, potem konto zostaje zawieszone, a konto jest przywracane przed jego zakończeniem.

Pamiętaj o tych kwestiach:

  • Zanim subskrypcja zostanie zawieszona, Google Play przez 48 godzin podejmuje dodatkowe próby obciążenia formy płatności. W tym czasie użytkownik zachowa korzyści z subskrypcji. Po upływie tego okresu subskrypcja zostanie zawieszona, a użytkownik powinien utracić dostęp do korzyści wynikających z subskrypcji.
  • Subskrypcja zostanie zawieszona bezpośrednio po wznowieniu subskrypcji z powodu nieudanej formy płatności.
  • Po przywróceniu subskrypcji po zawieszeniu konta data odnowienia jest resetowana.

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 typu SUBSCRIPTION_EXPIRED. Gdy otrzymasz to powiadomienie, wyślij zapytanie do interfejsu Google Play Developer API, aby pobrać najnowszy zasób subskrypcji. Gdy potwierdzisz, że subscriptionState ma wartość SUBSCRIPTION_STATE_EXPIRED, usuń to uprawnienie i zarejestruj w backendzie stan zakupu jako nieprawidłowy. 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 w Google Play lub automatycznie anulować subskrypcję, jeśli nie odzyska on uprawnień po zawieszeniu konta. Deweloperzy mogą też wywołać anulowanie za pomocą purchases.subscriptions.cancel. Gdy subskrypcja zostanie anulowana, użytkownik zachowa dostęp do treści do końca bieżącego cyklu rozliczeniowego. Po zakończeniu cyklu rozliczeniowego dostęp powinien zostać unieważniony.

Anulowanie subskrypcji powoduje wyświetlenie powiadomienia SUBSCRIPTION_CANCELED. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony przez interfejs Google Play Developer API ma w polu subscriptionState wartość SUBSCRIPTION_STATE_CANCELED, a pole expiryTime zawiera datę, kiedy użytkownik powinien utracić dostęp do subskrypcji. Jeśli ta data przypada w przeszłości, użytkownik powinien natychmiast utracić upoważnienie. Może się tak zdarzyć, jeśli np. użytkownik anuluje subskrypcję z powodu zawieszenia konta z powodu odrzucenia płatności.

Zasób subskrypcji w przypadku anulowanego zakupu wygląda podobnie do tego przykładu:

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

Możesz przejrzeć pole canceledStateContext w zasobie subskrypcji, aby dowiedzieć się, dlaczego subskrypcja została anulowana (np. czy została anulowana przez użytkownika, system czy przez Ciebie). Jeśli subskrypcja została anulowana przez użytkownika, z pola userInitiatedCancellation dowiesz się, dlaczego użytkownik ją anulował. Dane te mogą pomóc w opracowywaniu strategii komunikacyjnych.

Jeśli subskrypcja została anulowana, ale jeszcze nie wygasła, jest nadal zwracana z queryPurchasesAsync(). Możesz wyświetlić w aplikacji komunikat informujący użytkownika o anulowaniu subskrypcji i datę jej wygaśnięcia.

Odwołania

Subskrypcję można anulować z różnych powodów, np. przez backend anuluje ją za pomocą metody purchases.subscriptions.revoke lub zwrot środków za zakup. W takiej sytuacji natychmiast cofnij uprawnienia. W takim przypadku wysyłana jest wiadomość SubscriptionNotification typu SUBSCRIPTION_REVOKED. Gdy otrzymasz to powiadomienie, w zasobie subskrypcji zwróconym przez interfejs Google Play Developer API pole subscriptionState jest ustawione na SUBSCRIPTION_STATE_EXPIRED.

Zasób subskrypcji w przypadku unieważnionego zakupu wygląda podobnie do tego:

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

Odroczone subskrypcje

Jest wiele powodów, dla których warto przedłużyć użytkownikowi uprawnienia. Możesz na przykład zaoferować użytkownikom bezpłatny dostęp w ramach specjalnej promocji, np. przez tydzień bezpłatnie kupić film lub zaoferować klientom bezpłatny dostęp w ramach akcji charytatywnej. Aby przesunąć datę następnej płatności za automatycznie odnawianą subskrypcję, możesz użyć metody purchases.subscriptions.defer z interfejsu Play Developer API. Gdy to zrobisz, zostanie wysłana wiadomość SubscriptionNotification typu SUBSCRIPTION_DEFERRED. W tym czasie użytkownik subskrybuje Twoje treści z pełnym dostępem, ale nie jest obciążany opłatą. Data odnowienia subskrypcji zostanie zmieniona na nową.

W przypadku abonamentów przedpłaconych możesz odroczyć termin ważności za pomocą interfejsu API odroczonych płatności.

Zasób subskrypcji dla subskrypcji odroczonej wygląda podobnie do tego przykładu:

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

Wstrzymane subskrypcje

Możesz zmniejszyć liczbę dobrowolnych rezygnacji, włączając użytkownikom możliwość wstrzymania subskrypcji. Gdy włączysz funkcję wstrzymywania, użytkownicy będą mogli wstrzymać subskrypcję na okres od tygodnia do 3 miesięcy w zależności od okresu cyklicznego.

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 wznowienie się powiedzie, subskrypcja stanie się ponownie aktywna. Jeśli wznowienie nie powiedzie się z powodu problemu z płatnością, użytkownik wprowadza stan zawieszenia konta, jak widać na ilustracji 5 i 6:

Rysunek 5. Użytkownik wstrzymuje, a następnie wznawia subskrypcję.
Rysunek 6. Użytkownik wstrzymuje subskrypcję, a następnie przechodzi do zawieszenia konta.

Użytkownik może też w każdej chwili ręcznie wznowić subskrypcję w trakcie okresu wstrzymania, jak pokazano na ilustracji 6. Gdy użytkownik wznowi program ręcznie, data rozliczenia zmieni się na datę wznowienia ręcznego.

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

Zapobiegaj przerwom w subskrypcji, aby otrzymywać informacje o tym, kiedy użytkownik wstrzyma subskrypcję. Dzięki tym powiadomieniom możesz też informować użytkowników w aplikacji, że wstrzymali subskrypcję i nie mają do niej dostępu. Pamiętaj też, że użytkownik może w każdej chwili ręcznie wznowić subskrypcję, używając precyzyjnego linku do Google Play.

Gdy użytkownik rozpocznie wstrzymanie subskrypcji, zostanie wysłany komunikat SubscriptionNotification typu SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED. W tej chwili użytkownik powinien zachować dostęp do subskrypcji do daty następnego odnowienia, a zasób subskrypcji zawiera autoRenewEnabled = true. Wartość w polu subscriptionState wynosi w tym momencie SUBSCRIPTION_STATE_ACTIVE.

Gdy nastąpi wstrzymanie, zostanie wysłana wiadomość SubscriptionNotification typu SUBSCRIPTION_PAUSED. W takim przypadku użytkownik powinien utracić dostęp do subskrypcji, a zasób subskrypcji zawiera autoRenewEnabled = true, a pole subscriptionState ma wartość SUBSCRIPTION_STATE_PAUSED. Aby sprawdzić, kiedy subskrypcja powinna zostać ponownie odnowiona, sprawdź obiekt PausedStateContext.

Komunikat SubscriptionNotification typu SUBSCRIPTION_RENEWED jest wysyłany, gdy subskrypcja zostanie wznowiona automatycznie po zakończeniu okresu wstrzymania lub gdy użytkownik zdecyduje się ją wznowić ręcznie. Trzeba to zrobić w sposób opisany w sekcji Odnawianie.

Jeśli podczas próby wznowienia subskrypcji po wstrzymaniu wystąpiła nieudana próba płatności, zostanie wysłany komunikat SubscriptionNotification typu SUBSCRIPTION_ON_HOLD. Należy to zrobić w sposób opisany w artykule Zawieszenie konta.

Subskrybuj ponownie

W przypadku automatycznie odnawianych abonamentów podstawowych Sklep Google Play może wyświetlać przycisk Odnów subskrypcję. Ten przycisk pozwala użytkownikom odzyskać dostęp do subskrypcji. Może się ona nie pojawiać z różnych powodów, np. gdy subskrypcja wygasła dawno temu.

Rysunek 7. Konto > Subskrypcje w aplikacji Sklep Google Play z widoczną anulowaną subskrypcją i przyciskiem Odnów subskrypcję.

Przycisk ten jest zawsze oznaczony etykietą Odnów subskrypcję, ale jego działanie zależy od stanu subskrypcji.

Mimo że subskrypcja została anulowana, ale jeszcze nie wygasła, użytkownik nadal jest subskrybentem i ma dostęp do związanych z nim korzyści. Jeśli użytkownik kliknie Odnów subskrypcję, anulowanie zostanie w praktyce cofnięte, a subskrypcja będzie się nadal odnawiać. W dokumentacji Google Play i interfejsach API to działanie jest nazywane przywracaniem.

Po wygaśnięciu automatycznie odnawianej subskrypcji możesz zezwolić użytkownikom na zakup tego samego abonamentu podstawowego. W dokumentacji i interfejsach API dla deweloperów w Google Play działanie to jest znane jako odnawianie subskrypcji. Tę opcję dla każdego abonamentu podstawowego możesz skonfigurować w Konsoli Play lub za pomocą interfejsu API.

Przywróć przed wygaśnięciem

Jeśli do określenia, czy użytkownik jest uprawniony do korzystania z subskrypcji, aplikacja wykorzystuje wyłącznie metodę queryPurchasesAsync(), powinna ona automatycznie radzić sobie z przywracaniem, ponieważ metoda queryPurchasesAsync() nadal zwraca anulowane zakupy przed datą ich wygaśnięcia. Przywrócona subskrypcja będzie nadal odnawiana, jak gdyby nie została anulowana.

Jeśli Twoja aplikacja synchronizuje stan subskrypcji z backendem, nasłuchuj komunikatu SubscriptionNotification typu SUBSCRIPTION_RESTARTED. Gdy otrzymasz tę wiadomość, aplikacja może zareagować na powiadomienie, poinformować, że subskrypcja została odnowiona i zatrzymać wyświetlanie w aplikacji komunikatów o przywracaniu. 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
      ...
    }
  ],
}

Odnów subskrypcję po wygaśnięciu

Jeśli automatycznie odnawiany abonament podstawowy jest skonfigurowany w Konsoli Google Play lub interfejsie API i umożliwia odnawianie subskrypcji, użytkownicy mogą ponownie kupić wygasłą subskrypcję w Sklepie Google Play.

To są nowe zakupy. Google Play wydaje nowy token zakupu, a backend otrzymuje RTDN typu SUBSCRIPTION_PURCHASED. Stan zakupu w przypadku tego typu zakupu poza aplikacją nie obejmuje w tym przypadku elementu linkedPurchaseToken powiązanego z pierwotnym zakupem, ponieważ pierwotna subskrypcja całkowicie wygasła. Są to nowe zakupy, które Twój backend musi przetworzyć i zaakceptować tak jak każdy inny zakup.

Przechodzenie na wyższą lub niższą wersję usługi oraz ponowne subskrybowanie

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

Dodatkowo zasób subskrypcji zwrócony z interfejsu Google Play Developer API zawiera pole linkedPurchaseToken wskazujące stary zakup, w ramach którego użytkownik przeszedł na wyższą lub niższą wersję usługi albo ponownie wykupił subskrypcję. Możesz w nim użyć tokena zakupu, aby wyszukać starą subskrypcję i zidentyfikować istniejące konto użytkownika, co pozwoli powiązać nowy zakup z tym samym kontem.

Zanim zaoferujesz użytkownikowi opcję przejścia na wyższą lub niższą wersję usługi albo ponowne wykupienie subskrypcji, musisz potwierdzić jej obecną subskrypcję. Wszelkie zmiany i ponowne subskrypcje są blokowane, jeśli obecna subskrypcja nadal oczekuje na potwierdzenie.

Jeśli użytkownik kupi przejście na wyższą lub niższą wersję usługi albo ponowną subskrypcję, będzie to nowy zakup, który musisz potwierdzić. Zalecamy 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.

Zapoznaj się ze sprawdzonymi metodami dotyczącymi zmiany cen, aby dowiedzieć się więcej o zmianie cen subskrypcji automatycznie odnawianych i powiadamianiu o nich użytkowników w razie potrzeby.

Gdy zmiany cen zostaną zaakceptowane w przypadku dotychczasowych subskrybentów, otrzymasz powiadomienie RTDN, jeśli użytkownik podejmie działania w celu potwierdzenia lub odrzucenia nowej ceny.

Obsługa potwierdzenia przez użytkownika zmiany ceny subskrypcji

Gdy użytkownik zaakceptuje podwyżkę ceny subskrypcji, otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Jeśli cena z możliwością rezygnacji spadnie lub podwyżka ceny subskrypcji się odnowi, otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_RENEWED. To powiadomienie traktuj jak każde inne odnowienie.

Sytuacje, w których wzrost ceny z możliwością wyrażenia zgody nie jest akceptowany

Jeśli użytkownik nie zaakceptuje podwyżki ceny za akceptację, zanim będzie musiał odnowić subskrypcję po wyższej cenie, subskrypcja zostanie automatycznie anulowana, a Ty otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_CANCELED. Obsługuj to zdarzenie w sposób opisany w sekcji Anulowanie.

Użytkownicy mogą za pomocą tego samego mechanizmu anulować subskrypcje po podwyżce ceny z możliwością rezygnacji.

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

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

Ze względu na krótki czas obowiązywania subskrypcji przedpłaconej ważne jest jak najszybsze potwierdzenie zakupu. Abonamenty przedpłacone z okresem co najmniej 1 tygodnia należy potwierdzić w ciągu 3 dni. Abonamenty przedpłacone o czasie trwania krótszym niż tydzień muszą zostać potwierdzone w połowie okresu obowiązywania abonamentu. Na przykład deweloperzy mają 1, 5 dnia na potwierdzenie zakupu trzydniowego abonamentu przedpłaconego.

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

Po każdym zakupie abonamentu przedpłaconego do klienta RTDN jest wysyłany SubscriptionNotificationwiadomość typu SUBSCRIPTION_PURCHASED, w tym przy każdym doładowaniu. Wywołaj metodę purchases.subscriptionsv2.get, aby sprawdzić najnowszy stan subskrypcji przedpłaconej.

W przypadku zakupów doładowania zostanie wydany nowy token zakupu. W ramach nowego stanu zakupu subskrypcji otrzymasz token poprzedniego zakupu w polu linkedPurchaseToken. Token zakupu jest ważny od momentu rejestracji subskrypcji przez 60 dni od daty jej wygaśnięcia. Po tej dacie token zakupu nie będzie już mógł być używany do wywoływania interfejsu Google Play Developer API.

Zasób subskrypcji w przypadku zakupu abonamentu przedpłaconego 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": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

Godzina zakończenia upoważnienia jest widoczna w polu expiryTime. Zakupy z doładowaniem wydłużają okres obowiązywania uprawnienia, ponieważ okres ten jest akumulowany. Oznacza to, że jeśli użytkownik przedłuży ważność przed zakończeniem pierwotnego uprawnienia, nowy czas zostanie dodany do poprzedniej daty ważności.

Możesz wyświetlać w aplikacji komunikat informujący użytkownika, że jego subskrypcje przedpłacone można przedłużyć przy użyciu doładowania. Aby dowiedzieć się, kiedy użytkownik będzie mógł doładować konto, sprawdź pole allowExtendAfterTime w zasobie subskrypcji.

Abonamenty przedpłacone nie odnawiają się automatycznie, więc nie można ich anulować. Jeśli użytkownik chce anulować abonament przedpłacony, może poczekać, aż nadejdzie data jego wygaśnięcia.