Cykl życia subskrypcji

Zakup subskrypcji może przejść przez kilka różnych stanów w całym cyklu życia, w zależności od wielu czynników, w tym sposobu automatycznego odnawiania, sytuacji odrzucenia płatności czy działań związanych z zarządzaniem przez dewelopera.

Obsługa cyklu życia subskrypcji odnawianych automatycznie

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

Rysunek 1. Stany cyklu życia i zdarzenia przejścia dotyczące automatycznie odnawianych subskrypcji subskrypcji.

Aby zaktualizować stan w backendzie, wywołaj interfejs API purchases.subscriptionsv2.get z tokenem zakupu zawartym w powiadomieniu. Ten punkt końcowy zawiera najnowszy stan subskrypcji określony dla tokena zakupu i jest uważany za źródło wiarygodnych danych na potrzeby zarządzania subskrypcjami.

Token zakupu jest ważny od rejestracji subskrypcji przez 60 dni po wygaśnięciu. Po tej dacie token zakupu straci ważność przy wywoływaniu interfejsu Google Play Developer API.

Nowe automatycznie odnawiane subskrypcje

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ęcznie pobierasz zakupy za pomocą metody onResume() w Twojej aplikacji, musisz przetworzyć nowy zakup 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. Sprawdź, czy pole subscriptionState ma wartość 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 zasobu subskrypcji, jeśli identyfikatory zostały ustawione podczas zakupu za pomocą parametrów setObfuscatedAccountId i setObfuscatedProfileId.

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

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 przypadku innych, automatycznie odnawianych subskrypcji, przy ich odnowieniu wysyłane jest powiadomienie SUBSCRIPTION_RENEWED. W przypadku subskrypcji ratalnych powiadomienie SUBSCRIPTION_RENEWED jest wysyłane przy każdym obciążeniu za subskrypcję w dniu rozliczenia. Sprawdź, czy użytkownik nadal ma prawo do subskrypcji, a potem zaktualizuj stan subskrypcji o nowy atrybut expiryTime udostępniony 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
      }
    }
  ]
}

Odnawianie subskrypcji nie musisz potwierdzać.

Okres prolongaty

W przypadku problemów z płatnością za odnowienie subskrypcji Google powiadamia użytkownika i okresowo próbuje ją odnowić, zanim wygaśnie. Ten okres, w którym można odzyskać dostęp do konta, może się składać z okresu prolongaty, po którym następuje okres zawieszenia konta. W okresie prolongaty użytkownik powinien mieć nadal dostęp do subskrypcji.

Metoda queryPurchasesAsync() nadal zwraca zakupy w okresie prolongaty. Jeśli Twoja aplikacja wymaga jedynie usługi queryPurchasesAsync do sprawdzania, czy użytkownik może korzystać z subskrypcji, powinna ona automatycznie obsługiwać okresy prolongaty, ponieważ te subskrypcje są wyświetlane jako aktywne w Bibliotece płatności w Play.

Synchronizacja stanu subskrypcji z backendem pozwala lepiej obserwować odrzucenia płatności i zapewniać szerszy kontekst, gdy starasz się ograniczyć mimowolne rezygnacje. Nasłuchuj wiadomości typu SUBSCRIPTION_IN_GRACE_PERIOD (SubscriptionNotification), które zostaną powiadomione o rozpoczęciu okresu prolongaty przez użytkownika. Gdy użytkownik jest w okresie prolongaty, zasób subskrypcji zawiera autoRenewEnabled = true. Google Play dynamicznie przedłuża wartość expiryTime do końca okresu prolongaty, ponieważ uprawnienie powinno być dostępne do momentu anulowania subskrypcji przez użytkownika lub upłynięcia maksymalnego czasu trwania okresu prolongaty. W tym okresie wartość w polu subscriptionState 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 znajdujących się w okresie prolongaty o odrzuceniu płatności i prosi o rozwiązanie problemów z formą płatności w Sklepie Play. Poza tym w okresie prolongaty należy zachęcić go do rozwiązania problemu z formą płatności, na wypadek gdyby awaria była dobrowolna. Prosty sposób to użycie interfejsu In-App Messaging API. Jeśli wywołasz ten interfejs API po otwarciu aplikacji, użytkownik zobaczy na tymczasowym pasku powiadomień komunikat Play z informacją o odrzuceniu płatności. Zawiera ona też precyzyjny link, który pozwala użytkownikowi poprawić formę płatności w Google Play.

Gdy tylko użytkownik zmodyfikuje formę płatności, subskrypcja zostanie odnowiona w pierwotnej dacie odnowienia. Możesz to zrobić w sposób opisany w sekcji Odnowienia.

Jeśli w okresie prolongaty użytkownik nie rozwiąże problemu z formą płatności, subskrypcja otrzyma zawieszenie konta i utracisz uprawnienia.

Dostęp w okresie prolongaty i regeneracja

Rysunek 2 przedstawia oś czasu subskrypcji, która rozpoczyna się w okresie prolongaty, a potem jest przywracana, gdy użytkownik poprawi formę płatności. Po zakończeniu okresu prolongaty użytkownik powinien utracić dostęp do korzyści wynikających z subskrypcji i otrzymać konto.

Rysunek 2. Oś czasu subskrypcji, która rozpoczyna się w okresie prolongaty i przywraca się przed jego zakończeniem.

Należy pamiętać o następujących kwestiach:

  • W okresie prolongaty użytkownik powinien zachować dostęp do korzyści wynikających z subskrypcji.
  • W przypadku przywrócenia subskrypcji w okresie prolongaty data odnowienia nie jest resetowana.
  • 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żytkownicy, którzy w poprzednim okresie prolongaty przekroczyły nowy okres prolongaty, natychmiast utracą dostęp do korzyści z subskrypcji. Jeśli na przykład skrócisz okres prolongaty z 14 do 7 dni, korzyści z subskrypcji zostaną natychmiast anulowane użytkownikom, którzy znajdują się w przedziale 8–14 dni poprzedniego okresu prolongaty.
  • Subskrypcja pozostanie w stanie aktywnym i do zakończenia cichego okresu prolongaty nie otrzymasz okresu prolongaty w trybie RTDN.

Cichy okres prolongaty

Możesz ustawić okres prolongaty wynoszący 0 dni, ale Google Play poczeka co najmniej 1 dzień, aby zapewnić wystarczającą ilość czasu na ponowne próby dokonania płatności. Ten okres prolongaty zapewnia bezpieczeństwo podczas przetwarzania płatności. W tym okresie 24 godziny subskrypcja pozostanie w stanie ACTIVE.

Najlepszym sposobem na śledzenie zmian stanu subskrypcji jest nasłuchiwanie powiadomień dla deweloperów w czasie rzeczywistym (RTDN) i reagowanie na nie. Aby uzyskać dokładniejszy stan subskrypcji, wywołaj metodę purchases.subscriptionsv2.get() w czasie RTDN zamiast po upływie czasu wygaśnięcia.

W zależności od stanu subskrypcji po 24-godzinnym okresie cichego okresu prolongaty możesz zobaczyć jedno z tych powiadomień:

  • SUBSCRIPTION_ON_HOLD (jeśli jest włączona)
  • SUBSCRIPTION_CANCELED (jeśli anulowano)
  • SUBSCRIPTION_EXPIRED (jeśli wygasł)
  • SUBSCRIPTION_RENEWED (po odnowieniu)

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

Zawieszenie konta

Jeśli przy odnowieniu subskrypcji wystąpią problemy z płatnością, po zakończeniu okresu prolongaty rozpocznie się okres zawieszenia konta. Gdy w przypadku subskrypcji pojawi się zawieszenie konta, musisz zablokować dostęp do uprawnienia w ramach subskrypcji.

W trakcie zawieszenia konta musisz nadal obsługiwać anulowanie, przywracanie i ponowny zakup subskrypcji, ponieważ w czasie wstrzymania subskrypcji użytkownik może wprowadzić te zmiany.

RTDN powiadamiają o nadchodzącym okresie zawieszenia konta, dzięki czemu możesz jak najszybciej poinformować go o przyczynach zawieszenia dostępu do subskrypcji. Prosty sposób to użycie interfejsu In-App Messaging API. Wywołanie tego interfejsu API przy uruchomieniu aplikacji spowoduje wyświetlenie na tymczasowym pasku powiadomień wiadomość z informacją o odrzuceniu płatności. 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ą odkryć, że utracili dostęp na innych platformach. Możesz wysłać użytkownikowi powiadomienie push lub e-maila z informacją, że 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 Twoja aplikacja używa tej metody do wyświetlania dotychczasowych zakupów, domyślnie włącz zawieszenie konta.

Dzięki powiadomieniom dla deweloperów w czasie rzeczywistym otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_ON_HOLD, gdy subskrypcja zostanie zawieszona. Wywołaj metodę purchases.subscriptionsv2.get z bezpiecznego serwera backendu, aby pobrać informacje o nowej subskrypcji. Gdy konto jest zablokowane na koncie, pole expiryTime zasobu subskrypcji jest ustawione na przeszłą 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żytkownik musi rozwiązać problem z formą płatności. Google Play informuje użytkowników zawieszonych na koncie o odrzuceniu płatności, dlatego warto ich zachęcić do rozwiązania problemu z formą płatności.

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

W przypadku subskrypcji ratalnych każda płatność indywidualna może zostać odrzucona lub odzyskana.

Po przywróceniu Biblioteka płatności w Play zwraca subskrypcję ponownie za pomocą metody queryPurchasesAsync(). Jeśli użyjesz tej metody do określenia, czy użytkownik jest uprawniony do subskrypcji, Twoja aplikacja powinna automatycznie zająć się przywróceniem subskrypcji po zawieszeniu konta.

Wykryj wiadomość SubscriptionNotification o typie SUBSCRIPTION_RECOVERED, która zostanie powiadomiona, gdy subskrypcja zostanie przywrócona i użytkownik powinien odzyskać dostęp. Jeśli wyślesz zapytanie o subskrypcję po otrzymaniu tego powiadomienia, pole expiryTime zostanie ustawione na sygnaturę czasową w przyszłości, a pole subscriptionState zostanie ponownie ustawione na 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 problemu z formą płatności przed końcem okresu zawieszenia konta, otrzymasz wiadomość RTDN typu SUBSCRIPTION_CANCELED. Instrukcje dotyczące postępowania w przypadku anulowania znajdziesz w sekcji Anulowanie. Gdy wysyłasz zapytanie o subskrypcję, która została anulowana w ten sposób, zwrócone pole expiryTime zawiera sygnaturę czasową z przeszłości:

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

Natychmiast po otrzymaniu powiadomienia o anulowaniu konta w ramach zawieszenia konta otrzymasz też RTDN typu SUBSCRIPTION_EXPIRED, ponieważ użytkownik nie ma już płatnych uprawnień, a subskrypcja wygasła. Możesz obchodzić się z taką datą w zwykły sposób.

Użytkownik może odzyskać dostęp, ponownie kupując ten sam abonament lub dowolny inny abonament oferowany przez Ciebie w aplikacji w okresie zawieszenia konta. W takim przypadku udostępniany jest nowy token zakupu, a nowa wartość jest zwracana w ramach zdarzenia SUBSCRIPTION_PURCHASED, które reprezentuje tę nową instancję.

Dostęp do zawieszenia konta i jego odzyskiwanie

Rysunek 3 przedstawia oś czasu subskrypcji, po której konto zostaje zawieszone, a potem przywracane przez zmianę formy płatności przez użytkownika.

Rysunek 3. Oś czasu subskrypcji, w przypadku której konto zostanie zawieszone i zostanie przywrócone przed zakończeniem.

Podobnie jak w poprzednim przykładzie, na ilustracji 4 przedstawia oś czasu subskrypcji, która najpierw rozpoczyna się w okresie prolongaty przed włączeniem zawieszenia konta, a potem wróci do poprzedniego stanu.

Rysunek 4. Oś czasu subskrypcji, która rozpoczyna się w okresie prolongaty, potem przechodzi w stan zawieszenia konta i jest przywracany przed zakończeniem zawieszenia konta.

Należy pamiętać o następujących kwestiach:

  • Zanim subskrypcja zostanie zawieszona, Google Play próbuje obciążyć formę płatności jeszcze przez 48 godzin. W tym czasie użytkownik zachowuje 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 przechodzi w stan wstrzymania bezpośrednio po wznowieniu subskrypcji po użyciu formy płatności, której nie udało się zrealizować.
  • 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 to SUBSCRIPTION_STATE_EXPIRED, usuń 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 po zawieszeniu konta jej nie odzyska. Deweloperzy mogą też rozpocząć anulowanie za pomocą narzędzia 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ć anulowany.

Anulowanie automatycznie odnawianej subskrypcji, która nie jest rata, powoduje wyświetlenie powiadomienia SUBSCRIPTION_CANCELED. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony z interfejsu Google Play Developer API będzie miał wartość w polu subscriptionState ustawionym na 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ć uprawnienia. Może się tak zdarzyć np. wtedy, gdy użytkownik anuluje subskrypcję podczas zawieszenia konta z powodu odrzucenia płatności.

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

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

W przypadku subskrypcji ratalnych po anulowaniu przez użytkownika zainicjowanego przez użytkownika, gdy pozostanie płatność w okresie zobowiązania, zostanie wysłane powiadomienie SUBSCRIPTION_CANCELLATION_SCHEDULED. Anulowanie oczekuje na realizację i wejdzie 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ł w polu subscriptionState ustawioną wartość SUBSCRIPTION_STATE_ACTIVE, ponieważ subskrypcja ratalna będzie nadal aktywna do końca okresu zobowiązania. Istnieje jednak pusty obiekt pending cancel. Wysyłane jest powiadomienie SUBSCRIPTION_CANCELED, a pod koniec okresu zobowiązania następuje SUBSCRIPTION_EXPIRED.

Zasób subskrypcji zakupu subskrypcji ratalnej, który oczekuje na anulowanie, wygląda podobnie do tego przykładu:

{
  "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 została anulowana przez użytkownika, system czy przez Ciebie), zajrzyj do pola canceledStateContext w zasobie subskrypcji. Jeśli użytkownik anulował subskrypcję, w polu userInitiatedCancellation możesz sprawdzić, dlaczego ją anulował. Pomaga to w opracowywaniu strategii komunikacyjnych.

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

Odwołania

Subskrypcję można anulować z różnych powodów, takich jak unieważnienie subskrypcji przez backend przy użyciu purchases.subscriptions.revoke lub obciążenie zwrotne za zakup. W takiej sytuacji natychmiast cofnij uprawnienie użytkownika. W takim przypadku wysyłana jest wiadomość typu SUBSCRIPTION_REVOKED (SubscriptionNotification). Gdy otrzymasz to powiadomienie, pole subscriptionState dla zasobu subskrypcji zwróconego z interfejsu Google Play Developer API ma wartość SUBSCRIPTION_STATE_EXPIRED.

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

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

Odroczone subskrypcje

Przedłużenie uprawnienia może być przydatne z różnych powodów. Możesz na przykład zaoferować użytkownikom bezpłatny dostęp w ramach promocji Aby przesunąć następny termin płatności odnawianej automatycznie subskrypcji, 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 okresie odroczenia użytkownik subskrybuje Twoje treści z pełnym dostępem, ale nie jest za nie obciążany. Data odnowienia subskrypcji zostanie zmieniona na nową.

W przypadku abonamentów przedpłaconych możesz odroczyć czas ich wygaśnięcia za pomocą interfejsu API odroczenia płatności.

Zasób subskrypcji odroczonej subskrypcji 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 mogą wstrzymać subskrypcję na okres od tygodnia do 3 miesięcy (w zależności od okresu cyklicznego).

Cykliczność subskrypcji Co tydzień Co miesiąc 3 miesiące 6 miesięcy Co rok
Dostępne długości wstrzymania* 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 dowolnym momencie.

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 nie uda się wznowić wznowienia z powodu problemu z płatnością, użytkownik przechodzi w stan zawieszenia konta, jak pokazano na rysunkach 5 i 6:

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

Użytkownik może też ręcznie wznowić subskrypcję w dowolnym momencie okresu wstrzymania, jak pokazano na ilustracji 6. Gdy użytkownik wznowi działanie 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(). Po wznowieniu subskrypcji metoda queryPurchasesAsync() zwraca ją ponownie.

Nasłuchuj adresów RTDN, aby otrzymywać powiadomienia o wstrzymaniu subskrypcji przez użytkownika. Pozwalają one też powiadomić użytkowników w aplikacji, że wstrzymali subskrypcję i nie mają do niej dostępu. Musisz też udostępnić precyzyjny link do Google Play, aby użytkownik mógł ręcznie wznowić subskrypcję w dowolnym momencie.

Gdy użytkownik rozpocznie wstrzymanie subskrypcji, zostanie wysłana wiadomość 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. W tym momencie wartość w polu subscriptionState wynosi SUBSCRIPTION_STATE_ACTIVE.

Po rozpoczęciu wstrzymania wysyłany jest komunikat SubscriptionNotification typu SUBSCRIPTION_PAUSED. W takim przypadku użytkownik powinien utracić dostęp do subskrypcji, a zasób subskrypcji zawiera element autoRenewEnabled = true, a pole subscriptionState jest ustawione na SUBSCRIPTION_STATE_PAUSED. Aby dowiedzieć się, kiedy subskrypcja ma zostać ponownie odnowiona, sprawdź obiekt PausedStateContext.

Jeśli po zakończeniu okresu wstrzymania lub użytkownik zdecyduje się ręcznie wznowić subskrypcję, zostanie wysłany komunikat SubscriptionNotification typu SUBSCRIPTION_RENEWED. Należy to zrobić w sposób opisany w sekcji Odnawianie.

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

Subskrybuj ponownie

W przypadku automatycznie odnawianych abonamentów podstawowych w Sklepie Google Play może być wyświetlany przycisk Odnów subskrypcję. Ten przycisk umożliwia użytkownikom przywrócenie dostępu do subskrypcji. Może się on nie pojawiać z różnych powodów, np. gdy subskrypcja wygasła dawno temu.

Rysunek 7. Sekcja Konto > Subskrypcje w aplikacji Sklep Google Play, w której widoczna jest anulowana subskrypcja z przyciskiem Odnów subskrypcję.

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

Chociaż subskrypcja została anulowana, ale jeszcze nie wygasła, użytkownik nadal ma subskrypcję i korzysta z jej korzyści. Jeśli użytkownik kliknie Odnów subskrypcję, anulowanie zostanie cofnięte, a subskrypcja będzie nadal odnawiana. W dokumentacji dla programistów i interfejsach API Google Play jest to tzw. restore.

Po wygaśnięciu automatycznie odnawianej subskrypcji możesz zezwolić użytkownikom na zakup tego samego abonamentu podstawowego. W dokumentacji dla programistów i interfejsach API Google Play nosi to nazwę ponownego subskrybowania. Możesz skonfigurować tę opcję w przypadku każdego abonamentu podstawowego w Konsoli Play lub za pomocą interfejsu API.

Przywróć przed wygaśnięciem

Jeśli Twoja aplikacja do określania, czy użytkownik może korzystać z subskrypcji wyłącznie za pomocą metody queryPurchasesAsync(), powinna automatycznie obsługiwać przywracanie, ponieważ metoda queryPurchasesAsync() nadal zwraca anulowane zakupy przed upływem ich daty ważności. Przywrócona subskrypcja będzie nadal odnawiana, tak jakby nie została anulowana.

Jeśli Twoja aplikacja synchronizuje stan subskrypcji z backendem, musisz nasłuchiwać komunikatu SubscriptionNotification typu SUBSCRIPTION_RESTARTED. Gdy otrzymasz ten numer RTDN, aplikacja może odpowiedzieć na powiadomienie, zarejestrować nową subskrypcję i przestać wyświetlać w aplikacji wiadomości dotyczące 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
      ...
    }
  ],
}

Odnów subskrypcję po wygaśnięciu

Jeśli automatycznie odnawiany abonament podstawowy zostanie skonfigurowany za pomocą Konsoli Google Play lub interfejsu API w sposób umożliwiający odnowienie subskrypcji, użytkownicy będą mogli 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 tego typu zakupu poza aplikacją nie zawiera elementu linkedPurchaseToken powiązanego w tym przypadku z pierwotnym zakupem, ponieważ pierwotna subskrypcja całkowicie wygasła. Są to nowe zakupy, które Twój backend musi przetworzyć i potwierdzić tak jak każdy inny.

Przechodzenie na wyższą lub niższą wersję usługi i odnawianie subskrypcji

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

Dodatkowo zasób subskrypcji zwracany przez interfejs Google Play Developer API zawiera pole linkedPurchaseToken wskazujące poprzedni zakup, z którego użytkownik przeszedł na wyższą, niższą lub nową subskrypcję. Za pomocą tokena zakupu w tym polu możesz wyszukać starą subskrypcję i zidentyfikować istniejące konto użytkownika, aby móc powiązać z nim nowy zakup.

Zanim zaoferujesz użytkownikowi przejście na wyższą lub niższą wersję usługi albo odnowienie subskrypcji, musisz potwierdzić obecną subskrypcję. Każda zmiana abonamentu lub odnowienie subskrypcji zostanie zablokowana, jeśli dotychczasowa subskrypcja nadal oczekuje na potwierdzenie.

Jeśli użytkownikowi uda się przejść na wyższą lub niższą wersję usługi albo ponownie wykupić subskrypcję, jest to nowy zakup, za 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 zmianach cen automatycznie odnawianych subskrypcji i powiadamianiu użytkowników w razie potrzeby.

Gdy zmiany cen zostaną zastosowane w przypadku obecnych subskrybentów z opcją wyrażania zgody, otrzymasz komunikat RTDN, jeśli użytkownik podejmie działanie, aby potwierdzić lub odrzucić nową cenę.

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

Gdy użytkownik zaakceptuje wzrost ceny subskrypcji, otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Gdy cena z możliwością rezygnacji zostanie obniżona lub gdy cena subskrypcji wzrośnie, otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_RENEWED. Traktuj to powiadomienie tak samo jak każde inne odnowienie.

Rozstrzygnij przypadki, w których podwyżka ceny wymagającej zgody użytkownika nie jest akceptowane

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

W ten sam sposób użytkownicy mogą anulować subskrypcje z możliwością rezygnacji.

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

Tak jak w przypadku automatycznie odnawianych subskrypcji, abonamenty przedpłacone 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 wszystkie doładowania, ponieważ użytkownik musi za każdym razem przejść przez proces zakupu.

Abonament przedpłacony może mieć krótki czas trwania, dlatego ważne jest, aby jak najszybciej potwierdzić zakup. Abonamenty przedpłacone o czasie trwania wynoszącym co najmniej tydzień należy potwierdzić w ciągu 3 dni. Abonamenty przedpłacone o czasie trwania krótszym niż tydzień muszą zostać potwierdzone do połowy okresu trwania abonamentu. 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 subskrypcji.

Po każdym zakupie abonamentu przedpłaconego, w tym przy każdym doładowaniu, do klienta RTDN wysyłana jest wiadomość SubscriptionNotification z typem SUBSCRIPTION_PURCHASED. Wywołaj metodę purchases.subscriptionsv2.get, aby sprawdzić najnowszy stan subskrypcji abonamentu przedpłaconego.

Dla zakupów doładowań wydany jest nowy token zakupu, a 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 po wygaśnięciu subskrypcji. Po tej dacie token zakupu straci ważność przy wywoływaniu interfejsu Google Play Developer API.

Zasób subskrypcji związany z zakupem 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
      }
    }
  ]
}

W polu expiryTime możesz sprawdzić, kiedy uprawnienie się kończy. Zakupy doładowania wydłużają czas obowiązywania uprawnienia, zwiększając go. Oznacza to, że jeśli użytkownik doładuje konto przed upłynięciem pierwotnego okresu ważności, nowy czas zostanie dodany do poprzedniej daty ważności.

W aplikacji możesz wyświetlać komunikat informujący użytkownika, że jego przedpłacone subskrypcje można przedłużyć poprzez 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 odnawiają się automatycznie, więc nie można ich anulować. Jeśli użytkownik chce anulować abonament przedpłacony, może pozwolić mu osiągnąć datę wygaśnięcia.