Zakupy subskrypcji mogą przechodzić przez różne stany w całym cyklu życia, w zależności od wielu czynników, w tym od automatycznego odnawiania, odrzucenia płatności i działań związanych z zarządzaniem podejmowanych przez dewelopera.
Zarządzanie cyklem życia automatycznie odnawianych subskrypcji
Gdy stan subskrypcji użytkownika się zmieni, serwer backendu otrzyma wiadomość SubscriptionNotification
.
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 informacji do zarządzania subskrypcjami.
Token zakupu jest ważny od momentu zarejestrowania subskrypcji do 60 dni po jej wygaśnięciu. Po tej dacie token zakupu nie będzie już ważny i nie będzie można go używać do wywoływania interfejsu Google Play Developer API.
Nowe zakupy automatycznie odnawianych subskrypcji
Gdy użytkownik kupi subskrypcję, do klienta RTDN zostanie wysłana wiadomość SubscriptionNotification
o typie SUBSCRIPTION_PURCHASED
. Niezależnie od tego, czy otrzymasz to powiadomienie, czy zarejestrujesz nowy zakup w aplikacji za pomocą PurchasesUpdatedListener
lub ręcznie pobierzesz zakupy w metodzie onResume()
aplikacji, musisz przetworzyć nowy zakup w bezpiecznym backendzie. W tym celu należy wykonać następujące czynności:
- Wyślij zapytanie do punktu końcowego
purchases.subscriptionsv2.get
, aby uzyskać zasób subskrypcji zawierający najnowszy stan subskrypcji. - Sprawdź, czy wartość pola
subscriptionState
toSUBSCRIPTION_STATE_ACTIVE
. - Zweryfikuj zakup.
- 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 w momencie zakupu za pomocą funkcjisetObfuscatedAccountId
isetObfuscatedProfileId
.
Biblioteka płatności w Google Play zawiera też metodę potwierdzania subskrypcji,
acknowledgePurchase()
i metodę sprawdzania stanu potwierdzenia,
isAcknowledged()
.
Zalecamy jednak, aby ze względów bezpieczeństwa przetwarzać zakupy na serwerze backendu.
Zasób subskrypcji w przypadku 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 subskrypcji bez rat, które odnawiają się automatycznie, SUBSCRIPTION_RENEWED
powiadomienie jest wysyłane w momencie odnowienia subskrypcji. W przypadku subskrypcji ratalnych SUBSCRIPTION_RENEWED
jest wysyłane za każdym razem, gdy subskrypcja jest obciążana w dniu rozliczenia. Sprawdź, czy użytkownik nadal ma prawo do subskrypcji, a następnie zaktualizuj stan subskrypcji za pomocą nowego parametru expiryTime
podanego w zasobie subskrypcji zwróconym przez 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ścią za odnowienie subskrypcji, powiadomimy użytkownika i będziemy okresowo podejmować próby odnowienia subskrypcji przez pewien czas przed jej wygaśnięciem. Ten okres, w którym można odzyskać dostęp do subskrypcji, może 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 zwraca zakupy, które są w okresie prolongaty. Jeśli Twoja aplikacja korzysta wyłącznie z queryPurchasesAsync
, aby sprawdzić, czy użytkownik ma prawo do subskrypcji, powinna automatycznie obsługiwać okresy prolongaty, ponieważ te subskrypcje są wyświetlane jako aktywne w Bibliotece płatności w Google Play.
Synchronizowanie stanu subskrypcji z backendem pozwala lepiej śledzić odrzucenia płatności i uzyskiwać więcej informacji kontekstowych, które pomagają ograniczać niechciane rezygnacje. Nasłuchuj wiadomości SubscriptionNotification
typu SUBSCRIPTION_IN_GRACE_PERIOD
, aby otrzymywać powiadomienia, gdy użytkownik wejdzie w okres prolongaty. Gdy użytkownik jest w okresie prolongaty, zasób subskrypcji zawiera wartość autoRenewEnabled = true
. Google Play dynamicznie wydłuża wartość expiryTime
, dopóki nie upłynie okres prolongaty, ponieważ uprawnienie powinno trwać do momentu anulowania subskrypcji przez użytkownika lub do momentu, gdy okres prolongaty osiągnie maksymalną długość. Wartość pola subscriptionState
w tym okresie to 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
}
}
],
}
Play informuje użytkowników w okresie prolongaty, że płatność została odrzucona, i prosi ich o rozwiązanie problemów z formą płatności w Google Play. Gdy użytkownik przejdzie na okres prolongaty, zachęć go do zmiany formy płatności na wypadek, gdyby nieumyślnie nie udało się pobrać płatności. Najprostszym sposobem jest użycie interfejsu In-App Messaging API. Jeśli wywołasz ten interfejs API, gdy użytkownik otworzy Twoją aplikację, wyświetli mu się tymczasowy komunikat w formie paska informacyjnego z informacją, że płatność została odrzucona. Wiadomość zawiera też precyzyjny link, który umożliwia użytkownikowi rozwiązanie problemu z formą płatności w Google Play.
Gdy użytkownik naprawi formę płatności, subskrypcja zostanie odnowiona w pierwotnej dacie odnowienia, a Ty możesz obsłużyć odnowienie zgodnie z opisem w sekcji Odnowienia.
Jeśli użytkownik nie rozwiąże problemu z formą płatności w okresie prolongaty, subskrypcja zostanie zawieszona, a użytkownik utraci dostęp do treści.
Dostęp i przywracanie w okresie prolongaty
Ilustracja 2 przedstawia oś czasu subskrypcji, która przechodzi w okres prolongaty, a następnie zostaje przywrócona, gdy użytkownik rozwiąże problem z formą płatności. Po zakończeniu okresu prolongaty użytkownik powinien utracić korzyści wynikające z subskrypcji, a jego konto powinno zostać zawieszone.

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 dni do 14 dni, użytkownicy, którzy korzystają z okresu prolongaty, uzyskają dłuższy dostęp do korzyści wynikających z subskrypcji.
- Jeśli skrócisz okres prolongaty, użytkownicy, którzy są w starym okresie prolongaty na tyle długo, że przekraczają nowy okres prolongaty, natychmiast utracą korzyści z subskrypcji. Jeśli na przykład skrócisz okres prolongaty z 14 dni do 7 dni, użytkownicy, którzy są w dniach 8–14 starego okresu prolongaty, natychmiast utracą korzyści z subskrypcji.
- Subskrypcja pozostaje aktywna, a powiadomienie RTDN o okresie prolongaty nie zostanie wysłane do czasu zakończenia cichego okresu prolongaty.
Okres prolongaty w trybie cichym
Możesz ustawić okres prolongaty na 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 bezpieczeństwo przetwarzania płatności. W tym 24-godzinnym okresie subskrypcja pozostaje w stanie ACTIVE
.
Najlepszym sposobem na śledzenie zmian stanu subskrypcji jest nasłuchiwanie powiadomień dla deweloperów w czasie rzeczywistym i reagowanie na nie. Aby uzyskać dokładniejszy stan subskrypcji, wywołaj metodę purchases.subscriptionsv2.get()
w momencie RTDN, a nie w momencie wygaśnięcia.
W zależności od stanu subskrypcji po 24-godzinnym okresie karencji otrzymasz jedno z tych powiadomień:
SUBSCRIPTION_ON_HOLD
(jeśli jest włączona)SUBSCRIPTION_CANCELED
(w przypadku anulowania)SUBSCRIPTION_EXPIRED
(jeśli wygasł)SUBSCRIPTION_RENEWED
(jeśli subskrypcja została odnowiona)
W dowolnym momencie po 24-godzinnym okresie prolongaty możesz też wywołać metodę subscriptionV2.get()
, aby uzyskać najnowszy stan subskrypcji.
Zawieszenie konta
Jeśli podczas odnawiania subskrypcji wystąpią problemy z płatnością, 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 należy w razie potrzeby nadal obsługiwać anulowania, przywracania lub ponowne zakupy subskrypcji, ponieważ użytkownik może wprowadzić te zmiany, gdy subskrypcja jest zawieszona.
RTDN powiadamiają Cię, gdy użytkownik wejdzie w okres zawieszenia konta, dzięki czemu możesz 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 tymczasowego paska powiadomień z informacją o odrzuceniu płatności. Wiadomość zawiera też precyzyjny link, który umożliwia użytkownikowi rozwiązanie problemu z formą płatności w Google Play.
Jeśli użytkownicy mogą uzyskać dostęp do treści objętych subskrypcją poza aplikacją, mogą odkryć, że utracili dostęp na różnych platformach. Możesz wysłać do użytkownika powiadomienie push lub e-maila, aby poinformować go, że jego subskrypcja nie jest już aktywna z powodu odrzucenia płatności.
Subskrypcja nie jest zwracana przez metodę
queryPurchasesAsync()
podczas wstrzymania konta, więc jeśli Twoja aplikacja korzysta z tej metody do wyświetlania
istniejących zakupów, domyślnie powinna obsługiwać wstrzymanie konta.
Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów otrzymasz SubscriptionNotification
wiadomość o typie SUBSCRIPTION_ON_HOLD
, gdy subskrypcja zostanie wstrzymana. Wywołaj metodę purchases.subscriptionsv2.get
z bezpiecznego serwera backendu, aby pobrać nowe informacje o subskrypcji. Podczas zawieszenia konta pole expiryTime
w zasobie subskrypcji jest ustawione na znacznik czasu z przeszłości, a pole subscriptionState
jest ustawione na 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ą naprawić formę płatności. Google Play informuje użytkowników, których konta są wstrzymane, o odrzuceniu płatności. Zachęcaj ich też do naprawienia formy płatności.
Gdy użytkownik naprawi formę płatności, subskrypcja wróci do stanu aktywnego i musisz przywrócić dostęp do subskrybowanych treści. W tym przypadku token zakupu jest taki sam jak przed rozpoczęciem blokady konta, ponieważ przywracany jest ten sam zakup, a Ty otrzymujesz RTDN o typie SUBSCRIPTION_RECOVERED
.
W przypadku subskrypcji z płatnościami ratalnymi odrzucenie płatności i jej odzyskanie może nastą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, aplikacja powinna automatycznie obsługiwać przywracanie subskrypcji po zawieszeniu konta.
Nasłuchuj wiadomości SubscriptionNotification
o typie SUBSCRIPTION_RECOVERED
, aby otrzymywać powiadomienia o przywróceniu subskrypcji i ponownym uzyskaniu dostępu przez użytkownika. Jeśli po otrzymaniu tego powiadomienia wyślesz zapytanie o subskrypcję, 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 RTDN o typie SUBSCRIPTION_CANCELED
. Instrukcje dotyczące obsługi anulowania znajdziesz w sekcji Anulowania. Gdy wysyłasz zapytanie o subskrypcję anulowaną w ten sposób, zwracane pole expiryTime
ma ustawioną 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 subskrypcji podczas zawieszenia konta otrzymasz też RTDN o typie SUBSCRIPTION_EXPIRED
, ponieważ użytkownik nie ma już płatnych uprawnień, a subskrypcja została anulowana.
Możesz postąpić w zwykły sposób.
Użytkownik może odzyskać dostęp, kupując ponownie ten sam abonament lub dowolny inny abonament oferowany przez Ciebie w aplikacji w okresie zawieszenia 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 tę nową instancję.
Dostęp do zawieszonego konta i jego przywracanie
Ilustracja 3 przedstawia oś czasu subskrypcji, która została zawieszona, a następnie przywrócona, gdy użytkownik rozwiązał problem z formą płatności.

Podobnie jak w poprzednim przykładzie na rysunku 4 przedstawiono oś czasu subskrypcji, która najpierw wchodzi w okres prolongaty, a potem w okres zawieszenia konta, a następnie zostaje przywrócona w trakcie zawieszenia.

Pamiętaj o tych kwestiach:
- Zanim subskrypcja zostanie zawieszona, Google Play podejmuje dodatkowe próby obciążenia formy płatności przez maksymalnie 48 godzin. W tym okresie użytkownik zachowuje korzyści wynikające z subskrypcji. Po upływie tego okresu ponawiania subskrypcja zostaje zawieszona, a użytkownik traci dostęp do korzyści wynikających z subskrypcji.
- Subskrypcja zostaje zawieszona bezpośrednio po wznowieniu z wstrzymania, jeśli forma płatności jest nieprawidłowa.
- Gdy subskrypcja zostanie wznowiona po zawieszeniu konta, data odnowienia zostanie zresetowana.
Zakończenie okresu wypożyczenia
Gdy subskrypcja wygaśnie, użytkownik powinien utracić do niej dostęp. W takim przypadku wysyłana jest wiadomość SubscriptionNotification
o typie SUBSCRIPTION_EXPIRED
. Gdy otrzymasz to powiadomienie, wyślij zapytanie do interfejsu Google Play Developer API, aby pobrać najnowszy zasób subskrypcji.
Po potwierdzeniu, że subscriptionState
ma wartość 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 subskrypcja może zostać automatycznie anulowana, jeśli użytkownik nie odzyska dostępu do konta po jego zawieszeniu. Deweloperzy mogą też wywołać anulowanie za pomocą funkcji purchases.subscriptionsv2.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ć cofnięty.
Anulowanie subskrypcji bez rat, która odnawia się automatycznie, powoduje wysłanie powiadomienia SUBSCRIPTION_CANCELED
. Gdy otrzymasz to powiadomienie, zasób subskrypcji zwrócony przez interfejs Google Play Developer API będzie miał pole subscriptionState
ustawione na SUBSCRIPTION_STATE_CANCELED
, a pole expiryTime
będzie zawierać datę, kiedy użytkownik powinien utracić dostęp do subskrypcji. Jeśli ta data jest w przeszłości, użytkownik powinien natychmiast utracić uprawnienia. Może się tak zdarzyć na przykład, gdy użytkownik anuluje subskrypcję, gdy jego konto jest wstrzymane z powodu odrzucenia płatności.
Zasób subskrypcji 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 z płatnościami ratalnymi powiadomienie jest wysyłane po anulowaniu subskrypcji przez użytkownika, gdy pozostałe płatności są jeszcze należne w okresie zobowiązania.SUBSCRIPTION_CANCELLATION_SCHEDULED
Anulowanie jest w trakcie realizacji 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ł pole subscriptionState ustawione na SUBSCRIPTION_STATE_ACTIVE
, ponieważ subskrypcja ratalna jest nadal aktywna do końca okresu zobowiązania.
Jest jednak obecny pusty obiekt pendingCancellation.
Po zakończeniu okresu zobowiązania wysyłamy powiadomienie SUBSCRIPTION_CANCELED
, a następnie SUBSCRIPTION_EXPIRED
.
Zasób subskrypcji w przypadku zakupu subskrypcji ratalnej, która oczekuje na anulowanie, wygląda podobnie jak w tym przykładzie:
{
"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": {}
...
}
}
}
],
}
W polu canceledStateContext
w zasobie subskrypcji możesz sprawdzić, dlaczego subskrypcja została anulowana (np. czy została anulowana przez użytkownika, system czy Ciebie). Jeśli subskrypcja została anulowana przez użytkownika, możesz sprawdzić pole userInitiatedCancellation
, aby dowiedzieć się, dlaczego to zrobił. Może to pomóc w określaniu strategii komunikacji.
Gdy subskrypcja zostanie anulowana, ale jeszcze nie wygasła, nadal jest zwracana z queryPurchasesAsync()
.
W aplikacji możesz wyświetlić wiadomość informującą użytkownika o anulowaniu subskrypcji i podającą datę jej wygaśnięcia.
Unieważnienia
Subskrypcja może zostać cofnięta z różnych powodów, m.in. gdy backend cofnie subskrypcję za pomocą funkcji purchases.subscriptionsv2.revoke
lub gdy nastąpi obciążenie zwrotne. W takiej sytuacji 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 wycofanego 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
Istnieje wiele powodów, dla których możesz chcieć przedłużyć uprawnienia użytkownika. Możesz na przykład zaoferować użytkownikom bezpłatny dostęp w ramach specjalnej promocji, np. dać tydzień bezpłatnego dostępu za zakup filmu lub zapewnić klientom bezpłatny dostęp w ramach gestu dobrej woli. Możesz użyć metody purchases.subscriptions.defer
z interfejsu Play Developer API, aby przesunąć datę kolejnego rozliczenia w przypadku subskrypcji z automatycznym odnawianiem. W takim przypadku wysyłana jest wiadomość SubscriptionNotification
o typie SUBSCRIPTION_DEFERRED
. W tym okresie użytkownik jest subskrybentem Twoich treści i ma do nich pełny dostęp, ale nie jest obciążany opłatami. Data odnowienia subskrypcji zostanie zmieniona na nową.
W przypadku abonamentów przedpłaconych możesz użyć interfejsu defer billing API, aby odroczyć datę wygaśnięcia.
Zasób subskrypcji w przypadku 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
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.
Cykliczność subskrypcji | Co tydzień | Co miesiąc | 3 miesiące | 6 miesięcy | 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 |
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 przechodzi w stan zawieszenia konta, jak pokazano na rysunkach 5 i 6:


Użytkownik może też w dowolnym momencie ręcznie wznowić subskrypcję w okresie wstrzymania, jak pokazano na rysunku 6. Gdy użytkownik wznowi subskrypcję ręcznie, data płatności zmieni się na datę ręcznego wznowienia.
Gdy subskrypcja użytkownika jest wstrzymana, biblioteka rozliczeń Play nie zwraca subskrypcji za pomocą metody queryPurchasesAsync()
. Jeśli subskrypcja zostanie wznowiona, metoda queryPurchasesAsync()
zwróci ją ponownie.
Nasłuchuj powiadomień RTDN, aby wiedzieć, kiedy użytkownik wstrzymuje subskrypcję. Te powiadomienia umożliwiają też informowanie użytkowników w aplikacji o tym, że ich subskrypcja została wstrzymana i nie mają do niej dostępu. Musisz też umożliwić użytkownikowi ręczne wznowienie subskrypcji w dowolnym momencie za pomocą precyzyjnego linku do Google Play.
Wiadomość SubscriptionNotification
o typie SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
jest wysyłana, gdy użytkownik rozpoczyna wstrzymywanie subskrypcji. W tym czasie użytkownik powinien mieć dostęp do subskrypcji do następnej daty odnowienia, a zasób subskrypcji zawiera autoRenewEnabled = true
. Wartość pola subscriptionState
to SUBSCRIPTION_STATE_ACTIVE
.
Gdy wstrzymanie zacznie obowiązywać, wysyłana jest SubscriptionNotification
wiadomość typu SUBSCRIPTION_PAUSED
. W takim przypadku użytkownik powinien utracić dostęp do subskrypcji, a zasób subskrypcji zawierać wartość autoRenewEnabled = true
, a pole subscriptionState
powinno mieć wartość SUBSCRIPTION_STATE_PAUSED
. Możesz sprawdzić, kiedy subskrypcja zostanie ponownie odnowiona, sprawdzając obiekt PausedStateContext
.
Wiadomość SubscriptionNotification
o typie SUBSCRIPTION_RENEWED
jest wysyłana, jeśli subskrypcja zostanie wznowiona automatycznie po zakończeniu okresu wstrzymania lub jeśli użytkownik zdecyduje się wznowić ją ręcznie. Należy to zrobić zgodnie z opisem w sekcji Odnowienia.
Wiadomość SubscriptionNotification
o typie SUBSCRIPTION_ON_HOLD
jest wysyłana, jeśli podczas próby wznowienia subskrypcji po wstrzymaniu wystąpił błąd płatności.
Należy postępować zgodnie z instrukcjami podanymi w sekcji Blokada konta.
Subskrybuj ponownie
W przypadku automatycznie odnawianych abonamentów podstawowych w Sklepie Google Play może się wyświetlać przycisk Ponowna subskrypcja. Ten przycisk umożliwia użytkownikom ponowne uzyskanie dostępu do subskrypcji. Może się nie pojawiać z różnych powodów, np. gdy subskrypcja wygasła dawno temu.

Przycisk ma zawsze etykietę Ponowna subskrypcja, ale jego działanie zależy od stanu subskrypcji.
Gdy subskrypcja jest anulowana, ale jeszcze nie wygasła, użytkownik nadal ma subskrypcję i korzysta z jej zalet. Jeśli użytkownik kliknie Ponownie zasubskrybuj, anulowanie zostanie cofnięte, a subskrypcja będzie nadal odnawiana. W dokumentacji dla deweloperów i interfejsach API Google Play to działanie jest określane jako przywracanie.
Po wygaśnięciu automatycznie odnawianej subskrypcji możesz zezwolić użytkownikom na zakup tego samego abonamentu podstawowego. W dokumentacji i interfejsach API Google Play dla deweloperów to działanie jest określane jako ponowna subskrypcja. 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 aplikacja opiera się wyłącznie na metodzie
queryPurchasesAsync()
do określania, czy użytkownik ma prawo do subskrypcji, powinna automatycznie obsługiwać przywracanie, ponieważ metoda queryPurchasesAsync()
nadal zwraca anulowane zakupy przed datą ich wygaśnięcia. Przywrócona subskrypcja będzie odnawiana tak, jakby nie została anulowana.
Jeśli aplikacja synchronizuje stan subskrypcji z backendem, powinna nasłuchiwać wiadomości SubscriptionNotification
typu SUBSCRIPTION_RESTARTED
. Po otrzymaniu tego powiadomienia RTDN aplikacja może na nie odpowiedzieć, zapisać informację, że subskrypcja jest teraz ustawiona na odnawianie, i przestać wyświetlać w niej komunikaty o przywróceniu. Zasób subskrypcji wygląda podobnie jak w tym przykładzie:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date
...
}
],
}
Ponowne subskrybowanie po wygaśnięciu
Jeśli automatycznie odnawiany abonament podstawowy jest skonfigurowany w Konsoli Play lub interfejsie API Google Play tak, aby zezwalać na ponowną subskrypcję, użytkownicy mogą ponownie kupić wygasłą subskrypcję w Sklepie Google Play.
Są to nowe zakupy. Google Play wydaje zupełnie nowy token zakupu, a Twój backend otrzymuje RTDN o typie SUBSCRIPTION_PURCHASED
. W przypadku tego typu zakupu poza aplikacją stan zakupu nie zawiera atrybutu 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 potwierdzić jak każdy inny zakup.
Przechodzenie na wyższą lub niższą wersję usługi i ponowne subskrybowanie
Gdy użytkownik przejdzie na wyższą lub niższą wersję subskrypcji albo zarejestruje się po anulowaniu subskrypcji w aplikacji przed jej wygaśnięciem, stara subskrypcja zostanie unieważniona i utworzona zostanie nowa subskrypcja z nowym tokenem zakupu.
Dodatkowo zasób subskrypcji zwracany przez interfejs Google Play Developer API zawiera pole linkedPurchaseToken
, które wskazuje starą subskrypcję, z której użytkownik dokonał przejścia na wyższą lub niższą wersję albo ponownie ją zasubskrybował. Możesz użyć tokena zakupu w tym polu, aby wyszukać starą subskrypcję i zidentyfikować istniejące konto użytkownika, dzięki czemu będziesz mieć możliwość powiązania nowego zakupu z tym samym kontem.
Zanim zaoferujesz użytkownikowi w aplikacji opcje przejścia na wyższą lub niższą wersję subskrypcji albo ponowienia subskrypcji, musisz potwierdzić istniejącą subskrypcję. Każda zmiana abonamentu lub ponowna subskrypcja jest blokowana, jeśli obecna subskrypcja nadal oczekuje na potwierdzenie.
Jeśli użytkownik kupi wyższą lub niższą wersję albo ponownie zasubskrybuje usługę, będzie to nowy zakup, który musisz potwierdzić. Zalecany sposób to użycie 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 zmienianiu cen automatycznie odnawianych subskrypcji i powiadamianiu o tym użytkowników znajdziesz w przewodniku po sprawdzonych metodach dotyczących zmian cen.
Gdy dodasz zmianę ceny lub zaktualizujesz jej stan, otrzymasz SUBSCRIPTION_PRICE_CHANGE_UPDATED
RTDN. Aby uzyskać zasób subskrypcji, który będzie zawierać szczegóły zmiany ceny każdego elementu w subskrypcji, możesz wysłać zapytanie do punktu końcowego purchases.subscriptionsv2.get.
Gdy zmiany cen są stosowane do obecnych subskrybentów w ramach wyrażenia zgody, otrzymasz RTDN, jeśli użytkownik podejmie działanie w celu potwierdzenia lub odrzucenia nowej ceny.
Obsługa potwierdzenia przez użytkownika zmiany ceny wymagającej akceptacji
Gdy użytkownik zaakceptuje podwyżkę ceny subskrypcji, otrzymasz wiadomość SubscriptionNotification z typem SUBSCRIPTION_PRICE_CHANGE_UPDATED
.
Obsługa odnowień po zastosowaniu zmiany ceny
W przypadku obniżki ceny lub odnowienia subskrypcji po podwyżce otrzymasz wiadomość SubscriptionNotification
o typie SUBSCRIPTION_RENEWED
. Traktuj to powiadomienie jak każde inne odnowienie.
Obsługa przypadków, w których użytkownik nie akceptuje wzrostu ceny wymagającego zgody
Jeśli użytkownik nie zaakceptuje podniesienia ceny przed koniecznością odnowienia subskrypcji po wyższej cenie, zostanie automatycznie usunięty z subskrypcji, a Ty otrzymasz wiadomość SubscriptionNotification typu SUBSCRIPTION_CANCELED
. Postępuj zgodnie z instrukcjami podanymi w sekcji Anulowania.
Użytkownicy mogą też anulować subskrypcję w przypadku podwyżki ceny wymagającej wyrażenia zgody, postępując w ten sam sposób.
Zgoda na podwyższenie ceny (dotyczy tylko regionu KR)
Ze względu na nowe przepisy w Korei Południowej użytkownicy subskrypcji w tym regionie muszą wyrazić zgodę na podwyżki cen, które nastąpią po zakończeniu bezpłatnego okresu próbnego lub okresu obowiązywania ceny dla nowych użytkowników.
Aby pomóc Ci w przestrzeganiu tych przepisów, Google Play będzie informować użytkowników w Korei Południowej o wymaganiach dotyczących zgody, a także przechowywać odpowiedzi użytkowników na prośby o zgodę. Subskrypcje użytkowników, którzy nie wyrażą zgody przed wejściem w życie wyższej ceny, zostaną automatycznie anulowane. Oprócz powiadomień wysyłanych z Google Play możesz też wysyłać do użytkowników własne powiadomienia o zwiększeniu ceny i umieszczać w nich link do konkretnej strony zarządzania.
Gdy rozpocznie się okres uzyskiwania zgody lub użytkownik wyrazi zgodę, otrzymasz wiadomość SubscriptionNotification z typem SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED
.
Różnica między podwyższeniem ceny a zmianą ceny
price step-up
oznacza wzrost ceny subskrypcji spowodowany przejściem z jednej fazy oferty do drugiej. na przykład przejście z bezpłatnego okresu próbnego na cenę standardową.
price change
odnosi się jednak do aktualizacji cen zainicjowanych przez Ciebie (dewelopera) w przypadku ceny abonamentu podstawowego. Na przykład wzrost ceny wymagający zgody użytkownika lub wzrost ceny z możliwością rezygnacji.
Obsługa cyklu życia abonamentów przedpłaconych
Podobnie jak w przypadku automatycznie odnawianych subskrypcji musisz potwierdzać 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 wszystkie doładowania, ponieważ użytkownik musi za każdym razem przejść przez proces zakupu.
Ze względu na potencjalnie krótki czas trwania planów przedpłaconych ważne jest, aby jak najszybciej potwierdzić zakup. W przypadku planów przedpłaconych trwających co najmniej tydzień potwierdzenie musi nastąpić w ciągu 3 dni. W przypadku planów przedpłaconych o czasie trwania krótszym niż tydzień potwierdzenie musi nastąpić w połowie czasu trwania planu. Na przykład deweloperzy mają 1, 5 dnia na potwierdzenie zakupu 3-dniowego abonamentu przedpłaconego.
Komunikat SubscriptionNotification
o typie SUBSCRIPTION_PURCHASED
jest wysyłany do klienta RTDN za każdym razem, gdy zostanie kupiona subskrypcja abonamentu przedpłaconego, w tym przy każdym doładowaniu. Aby sprawdzić najnowszy stan subskrypcji abonamentu przedpłaconego, wywołaj metodę purchases.subscriptionsv2.get
.
W przypadku doładowania subskrypcji wydawany jest nowy token zakupu, a poprzedni token zakupu otrzymujesz w polu linkedPurchaseToken
w ramach nowego stanu zakupu subskrypcji. Token zakupu jest ważny od momentu rejestracji subskrypcji do 60 dni po jej wygaśnięciu. Po tej dacie token zakupu nie będzie już ważny i nie będzie można go używać 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
}
}
]
}
Datę zakończenia uprawnień możesz sprawdzić w polu expiryTime
. Zakupy doładowań wydłużają czas uprawnień przez jego kumulowanie. Oznacza to, że jeśli użytkownik doładuje konto przed wygaśnięciem pierwotnego uprawnienia, nowy czas zostanie dodany do poprzedniej daty wygaśnięcia.
Możesz wyświetlić w aplikacji komunikat informujący użytkownika, że jego subskrypcje przedpłacone można przedłużyć, doładowując konto. 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ż wygaśnie.
Pola SubscriptionPurchaseV2 w przypadku abonamentów przedpłaconych
Dodaliśmy nowe pola, aby obsługiwać abonamenty przedpłacone, które są przedłużane przez użytkownika, a nie odnawiane automatycznie. Wszystkie pola mają zastosowanie do abonamentów przedpłaconych tak samo jak do subskrypcji odnawianych automatycznie, z wyjątkiem tych:
- [Nowe pole] lineItems[0].prepaid_plan.allowExtendAfterTime: określa, kiedy użytkownik będzie mógł kupić kolejne doładowanie, aby przedłużyć abonament przedpłacony, ponieważ użytkownik może mieć tylko jedno niewykorzystane doładowanie naraz.
- [Nowe pole] SubscriptionState: określa stan obiektu subskrypcji.
W przypadku abonamentów przedpłaconych ta wartość to zawsze
ACTIVE
,PENDING
lubCANCELED
. - lineItems[0].expiryTime: to pole jest zawsze obecne w przypadku planów przedpłaconych.
- paused_state_context: to pole nigdy nie występuje, ponieważ subskrypcji przedpłaconych nie można wstrzymać.
- lineItems[0].auto_renewing_plan: nie występuje w przypadku abonamentów przedpłaconych.
- canceled_state_context: nie występuje w przypadku planów przedpłaconych, ponieważ to pole dotyczy tylko użytkowników, którzy aktywnie anulują subskrypcję.
- lineItems[0].productId: to pole zastępuje
subscriptionId
z poprzednich wersji.