Informacje o subskrypcjach

Z tego dokumentu dowiesz się, jak obsługiwać zdarzenia cyklu życia subskrypcji, takie jak odnowienia i wygaśnięcia. Opisuje też dodatkowe funkcje subskrypcji, takie jak oferowanie promocji i umożliwianie użytkownikom zarządzania własnymi subskrypcjami.

Jeśli nie masz skonfigurowanych produktów subskrypcyjnych w aplikacji, zapoznaj się z artykułem Tworzenie i konfigurowanie produktów.

Przegląd subskrypcji

Subskrypcja to transakcja cykliczna, która przyznaje użytkownikom określone uprawnienia. Uprawnienia to zbiór korzyści, do których użytkownicy mają dostęp przez określony czas. Na przykład subskrypcja może uprawniać użytkownika do dostępu premium.

Za pomocą abonamentów podstawowychofert możesz tworzyć wiele konfiguracji tego samego produktu subskrypcyjnego. Możesz na przykład utworzyć ofertę wprowadzającą dla użytkowników, którzy nigdy nie subskrybowali Twojej aplikacji. Podobnie możesz utworzyć ofertę przejścia na wyższą wersję dla użytkowników, którzy już subskrybują Twoją aplikację.

Szczegółowe informacje o produktach subskrypcyjnych, planach podstawowych i ofertach znajdziesz w dokumentacji w Centrum pomocy Konsoli Play.

Biblioteka płatności w Play obsługuje te typy subskrypcji:

  • Subskrypcja pojedynczego produktu – w tym typie 1 produkt odpowiada 1 uprawnieniu. Na przykład subskrypcja usługi strumieniowania muzyki.

  • Subskrypcja z dodatkami – w tym przypadku jeden zakup może obejmować kilka różnych uprawnień w ramach jednego zakupu. Na przykład subskrypcja usługi strumieniowania muzyki i subskrypcja wideo. Informacje dotyczące subskrypcji z dodatkami znajdziesz w sekcji Subskrypcje z dodatkami.

Integracja z abonamentami przedpłaconymi

Abonamenty przedpłacone nie odnawiają się automatycznie po wygaśnięciu. Aby przedłużyć subskrypcję bez przerw, użytkownik musi doładować abonament przedpłacony w ramach tej samej subskrypcji.

W przypadku doładowań uruchom proces płatności tak samo jak w przypadku pierwotnego zakupu. Nie musisz informować, że zakup jest doładowaniem.

Doładowania subskrypcji przedpłaconych zawsze korzystają z trybu zastępowania CHARGE_FULL_PRICE, więc nie musisz go ustawiać. Użytkownik zostanie od razu obciążony opłatą za pełny okres rozliczeniowy, a jego uprawnienia zostaną przedłużone o czas określony w doładowaniu.

Po doładowaniu te pola w obiekcie wynikuPurchase zostaną zaktualizowane, aby odzwierciedlać najnowszy zakup doładowania:

  • Identyfikator zamówienia
  • Czas zakupu
  • Podpis
  • Token zakupu
  • Potwierdzone

Te pola Purchase zawsze zawierają te same dane, które znajdują się w pierwotnym zakupie:

  • Nazwa pakietu
  • Stan zakupu
  • Produkty
  • Automatyczne odnawianie

Potwierdzenie zakupu przedpłaconego wspierania kanału

Podobnie jak w przypadku automatycznie odnawianych subskrypcji, po zakupie musisz potwierdzić abonamenty przedpłacone. Zarówno początkowy zakup, jak i wszelkie doładowania muszą zostać potwierdzone. Więcej informacji znajdziesz w artykule Przetwarzanie zakupów.

Ze względu na potencjalnie krótki czas trwania subskrypcji przedpłaconej ważne jest, aby jak najszybciej potwierdzić zakup.

W przypadku abonamentów przedpłaconych trwających co najmniej tydzień musisz potwierdzić ich aktywację w ciągu 3 dni.

W przypadku abonamentów przedpłaconych o czasie trwania krótszym niż tydzień potwierdzenie musi nastąpić w połowie czasu trwania abonamentu. Na przykład deweloperzy mają 1, 5 dnia na potwierdzenie 3-dniowego abonamentu przedpłaconego.

Integracja subskrypcji ratalnych

Subskrypcja ratalna to rodzaj subskrypcji, w której użytkownicy płacą za subskrypcję w kilku ratach w określonym czasie, zamiast płacić całą opłatę za subskrypcję z góry.

Dodatkowe uwagi dotyczące subskrypcji ratalnych:

  • Dostępność w poszczególnych krajach: subskrypcje ratalne są dostępne tylko w Brazylii, Francji, Hiszpanii i Włoszech (najnowsze informacje o dostępności znajdziesz w Konsoli).
  • Ustalanie ceny: podczas ustalania ceny subskrypcji z ratami w Konsoli cena reprezentuje miesięczną kwotę płatności. W połączeniu z ustawionym okresem zobowiązania generuje to łączną kwotę subskrypcji na ekranie zakupu.
  • Okres zobowiązania: łączny czas trwania początkowego zobowiązania dotyczącego subskrypcji, w którym wymagane są miesięczne płatności. Jeśli na przykład abonament podstawowy ma 15-miesięczny okres zobowiązania, użytkownik będzie dokonywać 15 miesięcznych płatności w tym okresie.
  • Odnowienia: w kontekście subskrypcji ratalnych „odnowienie” oznacza zakończenie okresu zobowiązania, początkowego lub kolejnego. Po początkowej rejestracji pierwsze odnowienie następuje po zakończeniu całego początkowego okresu zobowiązania. Kolejne odnowienia następują po zakończeniu każdego kolejnego okresu zobowiązania. Typy odnowienia subskrypcji ratalnych to „automatyczne odnawianie co miesiąc” lub „automatyczne odnowienie na ten sam okres”. W przypadku opcji „odnawia się automatycznie co miesiąc” nie ma kolejnego zobowiązania, a abonament działa jak subskrypcja miesięczna, w której każda miesięczna opłata za subskrypcję stanowi odnowienie.
  • Okres rozliczeniowy: w przypadku subskrypcji ratalnych odnosi się do powtarzającego się przedziału czasu, w którym dokonywane są poszczególne płatności, zgodnie z abonamentem podstawowym.
  • Zmiana abonamentu a zmiana ceny: w przypadku zmian cen i anulowania zobowiązanie jest wiążące. Oznacza to, że jeśli użytkownik będzie chciał anulować subskrypcję lub deweloper będzie chciał zmienić cenę, zmiana ta wejdzie w życie z końcem okresu zobowiązania. W przypadku zmiany abonamentu zobowiązanie nie jest wiążące. Oznacza to, że zmiana planu nie musi czekać do końca okresu zobowiązania. Wchodzi w życie natychmiast lub w dniu następnej płatności w zależności od ustawionego trybu zastępowania.
  • Zmiana abonamentu w ramach tej samej subskrypcji: zmiana abonamentu podstawowego z płatnościami ratalnymi na abonament podstawowy bez płatności ratalnych w ramach tego samego produktu subskrypcji jest niedozwolona.
  • Powiadomienia w czasie rzeczywistym dla deweloperów (RTDN): SUBSCRIPTION_CANCELLATION_SCHEDULED RTDN jest wysyłane natychmiast po anulowaniu przez użytkownika subskrypcji, gdy płatności za okres zobowiązania są nadal aktywne. Anulowanie jest w trakcie realizacji i wejdzie w życie dopiero po zakończeniu okresu zobowiązania. Jeśli użytkownik nie przywróci subskrypcji, po zakończeniu okresu zobowiązania zostaną wysłane SUBSCRIPTION_CANCELEDSUBSCRIPTION_EXPIRED RTDN.

  • Wypłaty / realizacja przychodów: wypłaty dla deweloperów będą następować po dokonaniu comiesięcznych płatności przez użytkowników, z zastrzeżeniem tych samych warunków co w przypadku wszystkich innych subskrypcji. Deweloperzy nie otrzymują płatności z góry, gdy użytkownik wykupuje subskrypcję z płatnościami ratalnymi.

  • Brakujące płatności: jeśli użytkownik nie dokona żadnej płatności za subskrypcję ratalną, ani Google, ani Deweloper nie będą podejmować prób pobrania od użytkownika żadnych brakujących lub zaległych płatności. Google może jednak okresowo ponawiać próbę płatności w okresie karencji lub w okresie zawieszenia konta zgodnie ze swoimi standardowymi praktykami dotyczącymi ponawiania prób płatności. Google nie ponosi odpowiedzialności wobec Dewelopera za pozostałe nieopłacone raty.

  • Dostępność Biblioteki płatności w Google Play: pole installmentDetails jest dostępne tylko w przypadku Biblioteki płatności w Google Play w wersji 7 lub nowszej. W przypadku PBL 5 i nowszych subskrypcja ratalna jest zwracana za pomocą queryProductDetails(), ale nie zawiera szczegółowych informacji o ratach, takich jak liczba zobowiązań płatniczych w ramach planu.

Używanie precyzyjnych linków, aby umożliwić użytkownikom zarządzanie subskrypcją

Aplikacja powinna zawierać link na ekranie ustawień lub preferencji, który umożliwia użytkownikom zarządzanie subskrypcjami. Możesz go wkomponować w naturalny wygląd i styl aplikacji.

Możesz dodać precyzyjny link z aplikacji do centrum subskrypcji w Google Play w przypadku nieaktywnych subskrypcji, które możesz określić za pomocą pola subscriptionStatezasobie subskrypcji. W związku z tym istnieje kilka sposobów na utworzenie linku bezpośredniego do centrum subskrypcji w Sklepie Play.

Użyj tego adresu URL, aby kierować użytkowników na stronę, na której wyświetlane są wszystkie ich subskrypcje, jak pokazano na ilustracjach 1 i 2:

https://play.google.com/store/account/subscriptions
Na ekranie subskrypcji w Sklepie Play wyświetlany jest stan wszystkich subskrypcji użytkownika rozliczanych w Google Play.
Rysunek 1. Na ekranie subskrypcji w Sklepie Play wyświetlany jest stan wszystkich subskrypcji użytkownika rozliczanych w Google Play.


Kliknij subskrypcję, aby wyświetlić dodatkowe informacje.
Rysunek 2. Kliknij subskrypcję, aby wyświetlić dodatkowe szczegóły.

Ten precyzyjny link może pomóc użytkownikowi przywrócić anulowaną subskrypcję w centrum subskrypcji w Sklepie Play.

Aby utworzyć bezpośredni link do strony zarządzania nieaktywną subskrypcją, podaj nazwę pakietu i productId powiązane z zakupioną subskrypcją. Aby programowo określić productId w przypadku istniejącej subskrypcji, wyślij zapytanie do backendu aplikacji lub wywołaj funkcję BillingClient.queryPurchasesAsync(), aby uzyskać listę subskrypcji powiązanych z określonym użytkownikiem. Każda subskrypcja zawiera odpowiedni symbol productId w informacjach o stanie subskrypcji. Każdy obiekt SubscriptionPurchaseLineItem powiązany z zakupem subskrypcji zawiera wartość productId powiązaną z subskrypcją, którą użytkownik kupił w tym elemencie zamówienia.

Użyj poniższego adresu URL, aby kierować użytkowników na konkretny ekran zarządzania subskrypcjami. Zastąp ciągi „your-sub-product-id” i „your-app-package” odpowiednio productId i nazwą pakietu aplikacji:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

Użytkownik może wtedy zarządzać formami płatności i korzystać z funkcji, takich jak anulowanie, ponowna subskrypcja i wstrzymanie.

Zezwalaj użytkownikom na przechodzenie na wyższą lub niższą wersję subskrypcji oraz na jej zmianę

Możesz udostępnić obecnym subskrybentom różne opcje zmiany abonamentu, aby lepiej dopasować go do ich potrzeb:

  • Jeśli sprzedajesz kilka poziomów subskrypcji, np. „podstawowy” i „premium”, możesz umożliwić użytkownikom przełączanie się między nimi przez zakup innego abonamentu podstawowego lub innej oferty.
  • Możesz zezwolić użytkownikom na zmianę bieżącego okresu rozliczeniowego, np. przejście z abonamentu miesięcznego na roczny.
  • Możesz też zezwolić użytkownikom na przełączanie się między abonamentami odnawianymi automatycznie i przedpłaconymi.

Możesz zachęcić użytkowników do wprowadzenia tych zmian, oferując im subskrypcje, które zapewniają zniżkę kwalifikującym się użytkownikom. Możesz na przykład utworzyć ofertę zapewniającą 50% zniżki na pierwszy rok przy przejściu z abonamentu miesięcznego na roczny i ograniczyć ją do użytkowników, którzy mają abonament miesięczny i nie skorzystali jeszcze z tej oferty. Więcej informacji o kryteriach kwalifikacji do oferty znajdziesz w Centrum pomocy.

Ilustracja 3 przedstawia przykładową aplikację z 3 różnymi abonamentami:

Ta aplikacja ma 3 poziomy subskrypcji.
Rysunek 3. Ta aplikacja ma 3 poziomy subskrypcji.

Aplikacja może wyświetlać ekran podobny do tego na ilustracji 3, na którym użytkownicy będą mogli zmienić subskrypcję. W każdym przypadku użytkownicy powinni wiedzieć, jaki jest ich obecny abonament i jakie mają możliwości jego zmiany.

Gdy użytkownicy zdecydują się przejść na wyższą lub niższą wersję abonamentu albo zmienić abonament, możesz określić tryb zastępowania, który określa, jak zastosować proporcjonalną wartość bieżącego opłaconego okresu rozliczeniowego i kiedy nastąpi zmiana uprawnień.

Tryby zastępowania

W tabeli poniżej znajdziesz dostępne tryby zastępowania i przykłady ich użycia oraz liczbę płatności uznanych za dokonane.

pierwsza płatność w ramach nowego planu może zostać zarejestrowana jako zapłacona w zależności od trybu wymiany.

Tryb zastępowania

Opis

Przykład użycia

Zobowiązania do zapłaty zarejestrowane jako zapłacone (w przypadku zastąpienia subskrypcji ratalnej)

WITH_TIME_PRORATION

Subskrypcja zostanie natychmiast zmieniona na wyższą lub niższą wersję. Pozostały czas zostanie dostosowany na podstawie różnicy w cenie i dodany do nowej subskrypcji przez przesunięcie daty następnej płatności. Jest to zachowanie domyślne.

przejść na droższy poziom bez natychmiastowej dodatkowej płatności;

0

CHARGE_PRORATED_PRICE

Subskrypcja zostanie od razu uaktualniona, a cykl rozliczeniowy pozostanie bez zmian. Różnica w cenie za pozostały okres zostanie następnie obciążona użytkownika.

Uwaga: ta opcja jest dostępna tylko w przypadku przejścia na wyższą wersję subskrypcji, w której cena za jednostkę czasu wzrasta.

przejść na droższy poziom bez zmiany daty rozliczenia;

1

CHARGE_FULL_PRICE

Subskrypcja zostanie od razu uaktualniona do wyższej lub niższej wersji, a użytkownik zostanie od razu obciążony pełną ceną za nowe uprawnienia. Pozostała wartość z poprzedniej subskrypcji jest przenoszona na to samo uprawnienie lub proporcjonalnie rozdzielana w przypadku przejścia na inne uprawnienie.

Uwaga: jeśli nowa subskrypcja ma bezpłatny okres próbny lub ofertę wprowadzającą, w momencie przejścia na wyższą lub niższą wersję użytkownik zostanie obciążony kwotą 0 PLN lub ceną oferty wprowadzającej (w zależności od tego, co ma zastosowanie).

Przejście z krótszego na dłuższy okres rozliczeniowy.

1 (Uwaga: 0, jeśli nowa subskrypcja ma bezpłatny okres próbny).

WITHOUT_PRORATION

Subskrypcja zostanie od razu zmieniona na wyższą lub niższą wersję, a nowa cena zostanie naliczona w momencie odnowienia subskrypcji. Cykl rozliczeniowy pozostaje bez zmian.

Przejdź na wyższy poziom subskrypcji, zachowując pozostały okres bezpłatny.

0

DEFERRED

Subskrypcja zostanie zmieniona na wyższą lub niższą tylko w momencie jej odnowienia, ale nowy zakup zostanie zrealizowany od razu i będzie zawierać te 2 elementy:

  • Istniejący produkt z wyłączonym automatycznym odnawianiem i datą wygaśnięcia ustawioną na koniec bieżącego cyklu rozliczeniowego.
  • Nowe uprawnienie, które zaczyna obowiązywać po wygaśnięciu dotychczasowego produktu. Możesz zezwolić użytkownikom na wprowadzanie dodatkowych zmian. Użytkownicy mogą na przykład wrócić do pierwotnego abonamentu lub zainicjować nową zmianę abonamentu z odroczoną płatnością.

Uwaga: w przypadku subskrypcji ratalnych zmiana abonamentu następuje na początku następnego okresu płatności.

przejść na tańszy poziom wspierania;

1

Więcej informacji o różnych zastosowaniach ofert ulepszenia i odzyskiwania klientów znajdziesz w przewodniku po ofertach i promocjach.

Ustawianie trybu wymiany w przypadku zakupu

W zależności od preferencji i logiki biznesowej możesz używać różnych trybów zastępowania w przypadku różnych typów przejść na subskrypcję. W tej sekcji dowiesz się, jak ustawić tryb zastępowania w przypadku zmiany subskrypcji, oraz poznasz obowiązujące ograniczenia.

Ponowne subskrybowanie lub przełączanie się między abonamentami w ramach tej samej subskrypcji

W Konsoli Google Play możesz określić domyślny tryb zastępowania. To ustawienie pozwala wybrać, kiedy obecni subskrybenci mają być obciążani płatnością, jeśli kupią inny abonament podstawowy lub inną ofertę w ramach tej samej subskrypcji albo ponownie zasubskrybują usługę po anulowaniu subskrypcji. Dostępne opcje to Obciąż od razu, co odpowiada CHARGE_FULL_PRICE, oraz Obciąż w dniu kolejnej płatności, co odpowiada WITHOUT_PRORATION. Są to jedyne odpowiednie tryby zastępowania w przypadku zmiany abonamentu podstawowego w ramach tej samej subskrypcji.

Jeśli na przykład wdrażasz ofertę ponownego zakupu tego samego abonamentu po anulowaniu subskrypcji przez użytkownika, ale przed jej zakończeniem, możesz przetworzyć nowy zakup jako zwykły zakup bez podawania żadnych wartości w parametrze SubscriptionUpdateParams. System używa domyślnego trybu zastępowania skonfigurowanego w subskrypcji i automatycznie obsługuje przejście z poprzedniego zakupu na nowy.

Przełączanie pakietów w ramach subskrypcji lub zastępowanie domyślnego trybu wymiany

Jeśli użytkownik zmienia usługi subskrypcyjne – kupuje inną subskrypcję – lub jeśli z jakiegokolwiek powodu chcesz zastąpić domyślny tryb wymiany, określ stawkę proporcjonalną w czasie działania w ramach parametrów procesu zakupu.

Aby prawidłowo podać SubscriptionUpdateParams w ramach konfiguracji procesu zakupu w czasie działania, pamiętaj o tych ograniczeniach:

  • Podczas przechodzenia na wyższy lub niższy pakiet albo inicjowania zmiany subskrypcji na abonament przedpłacony z abonamentu przedpłaconego, odnawianego automatycznie lub ratalnego jedynym dozwolonym trybem zastępowania jest CHARGE_FULL_PRICE. Jeśli określisz inny tryb wymiany, zakup się nie powiedzie, a użytkownikowi wyświetli się błąd.
  • Podczas przełączania planów w ramach tej samej subskrypcji na plan odnawiany automatycznie z planu przedpłaconego lub planu odnawianego automatycznie obowiązują tryby proporcjonalnego rozliczenia CHARGE_FULL_PRICEWITHOUT_PRORATION. Jeśli określisz inny tryb proporcjonalnego rozliczania, zakup się nie powiedzie, a użytkownikowi zostanie wyświetlony błąd.
  • Przełączanie abonamentów w ramach tego samego produktu subskrypcyjnego z abonamentu podstawowego z płatnościami ratalnymi na abonament podstawowy bez płatności ratalnych jest niedozwolone.

Przykłady i zachowania związane z zastępowaniem

Aby zrozumieć, jak działają poszczególne tryby proporcjonalnego rozliczania, przyjrzyjmy się takiemu scenariuszowi:

Samwise ma subskrypcję treści online z aplikacji Country Gardener. Ma miesięczną subskrypcję treści w wersji Tier 1, która zawiera tylko tekst. Subskrypcja kosztuje go 2 zł miesięcznie i odnawia się pierwszego dnia miesiąca.

15 kwietnia Samwise zdecydował się przejść na roczną wersję subskrypcji poziomu 2, która obejmuje aktualizacje wideo i kosztuje 36 USD rocznie.

Podczas uaktualniania subskrypcji deweloper wybiera tryb proporcjonalnego rozliczenia. Poniżej znajdziesz opis wpływu poszczególnych trybów proporcjonalnego rozliczania na subskrypcję Samwise:

WITH_TIME_PRORATION

Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Zapłacił za cały miesiąc (1–30 kwietnia), ale zmienił subskrypcję w połowie okresu subskrypcji, więc połowa miesięcznej subskrypcji (1 zł) została zastosowana do nowej subskrypcji. Ponieważ jednak nowy abonament kosztuje 36 USD rocznie, saldo środków w wysokości 1 USD wystarczy tylko na 10 dni (16–25 kwietnia). 26 kwietnia zostanie więc pobrana opłata w wysokości 36 USD za nowy abonament, a następnie 26 kwietnia każdego kolejnego roku.

Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu. Nowy zakup będzie można pobrać w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.

CHARGE_PRORATED_PRICE

Ten tryb może być używany, ponieważ cena subskrypcji poziomu 2 za jednostkę czasu (36 USD rocznie = 3 USD miesięcznie) jest wyższa niż cena subskrypcji poziomu 1 za jednostkę czasu (2 USD miesięcznie). Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Ponieważ zapłacił za cały miesiąc, ale wykorzystał tylko połowę, do nowej subskrypcji zostanie zastosowana połowa miesięcznej subskrypcji (1 PLN). Nowa subskrypcja kosztuje 36 PLN rocznie, więc pozostałe 15 dni kosztuje 1,50 PLN. W związku z tym użytkownik zostanie obciążony różnicą w wysokości 0,50 PLN za nową subskrypcję. 1 maja Samwise zostanie obciążony kwotą 36 zł za nowy poziom subskrypcji, a następnie 1 maja każdego kolejnego roku.

Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu, gdy można pobrać nowy zakup w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.

WITHOUT_PRORATION

Subskrypcja Samwise'a na poziomie 1 zostaje natychmiast uaktualniona do poziomu 2 bez dodatkowych opłat. 1 maja pobieramy od niego 36 USD za nowy poziom subskrypcji, a następnie 1 maja każdego kolejnego roku pobieramy kolejne 36 USD.

Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu, gdy można pobrać nowy zakup w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.

DEFERRED

Subskrypcja poziomu 1 Samwise’a będzie aktywna do 30 kwietnia. 1 maja zacznie obowiązywać subskrypcja poziomu 2, a Samwise zostanie obciążony kwotą 36 PLN za nowy poziom subskrypcji.

Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu, gdy można pobrać nowy zakup w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów. W tym momencie przetwórz zakup w taki sam sposób jak każdy inny nowy zakup. W szczególności potwierdź nowy zakup. Pamiętaj, że startTime nowej subskrypcji jest wypełniana w momencie wejścia w życie zastąpienia, czyli po wygaśnięciu starej subskrypcji. W tym momencie otrzymasz SUBSCRIPTION_RENEWED RTDN dla nowego abonamentu. Więcej informacji o tym, jak działa funkcja ReplacementMode.DEFERRED, znajdziesz w artykule Obsługa odroczonej wymiany.

CHARGE_FULL_PRICE

Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Jego subskrypcja poziomu 2 rozpoczyna się dzisiaj i zostanie obciążony opłatą w wysokości 36 zł. Zapłacił za cały miesiąc, ale wykorzystał tylko połowę, więc połowa miesięcznej subskrypcji (1 PLN) zostanie zastosowana do jego nowej subskrypcji. Ponieważ nowa subskrypcja kosztuje 36 zł rocznie, do okresu subskrypcji zostanie dodana 1/36 roku (ok. 10 dni). Dlatego następna opłata za subskrypcję Samwise'a zostanie pobrana za rok i 10 dni od dzisiaj i wyniesie 36 zł. Potem co roku będzie obciążany kwotą 36 zł.

Wybierając tryb proporcjonalnego rozliczania, zapoznaj się z naszymi rekomendacjami dotyczącymi zastępowania.

Wywoływanie zmian subskrypcji w aplikacji

Aplikacja może zaoferować użytkownikom przejście na wyższą lub niższą wersję subskrypcji, wykonując te same czynności co w przypadku uruchamiania procesu zakupu. Jeśli jednak chcesz przejść na wyższą lub niższą wersję, musisz podać szczegóły bieżącej subskrypcji, przyszłej subskrypcji (po przejściu na wyższą lub niższą wersję) oraz tryb zastępowania, który ma być używany, jak pokazano w tym przykładzie:

Kotlin

val offerToken = productDetails
        .getSubscriptionOfferDetails(selectedOfferIndex)
        .getOfferToken()

val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList(
       listOf(
           BillingFlowParams.ProductDetailsParams.newBuilder()
               .setProductDetails(productDetails)
               .setOfferToken(offerToken)
               .build()
       )
       ).setSubscriptionUpdateParams(
           BillingFlowParams.SubscriptionUpdateParams.newBuilder()
               .setOldPurchaseToken("old_purchase_token")
               .setSubscriptionReplacementMode(
                 BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE
               )
               .build()
       ).build()

billingClient.launchBillingFlow(
    activity,
    billingParams
   )
// ...

Java

String offerToken = productDetails
    .getSubscriptionOfferDetails(selectedOfferIndex)
    .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldPurchaseToken("old_purchase_token")
            .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
// ...

Rekomendacje dotyczące wymiany

W tabeli poniżej znajdziesz różne scenariusze proporcjonalnego rozliczania wraz z naszymi zaleceniami dotyczącymi każdego z nich:

Scenariusz Zalecany tryb wymiany Wynik
Przejście na droższy poziom CHARGE_PRORATED_PRICE Użytkownik od razu uzyskuje dostęp, a okres rozliczeniowy pozostaje bez zmian.
Przejście na tańszy poziom DEFERRED Użytkownik zapłacił już za droższy poziom, więc zachowa dostęp do korzyści związanych z tym poziomem aż do następnego terminu płatności.
Przejście na wyższą wersję podczas bezpłatnego okresu próbnego z zachowaniem okresu próbnego WITHOUT_PRORATION Użytkownik przechodzi na wyższy poziom na pozostałą część okresu próbnego bez dodatkowych opłat.
Przejście na wyższą wersję podczas bezpłatnego okresu próbnego – zakończenie dostępu do bezpłatnego okresu próbnego CHARGE_PRORATED_PRICE Użytkownik od razu uzyskuje dostęp do nowego poziomu, a pozostała wartość bezpłatnego okresu próbnego zostaje przeniesiona. Przeniesiona wartość jest obliczana na podstawie ceny abonamentu podstawowego.

Obsługa zakupów związanych ze zmianą subskrypcji

Zmiana abonamentu jest nowym zakupem we wszystkich aspektach i celach. Po pomyślnym zakończeniu procesu rozliczeniowego powinna być przetwarzana i potwierdzana jako taka. Oprócz prawidłowego przetworzenia nowego zakupu musisz wycofać zakup, który jest zastępowany.

Działanie w aplikacji jest takie samo jak w przypadku każdego nowego zakupu. Aplikacja otrzyma wynik nowego zakupu w PurchasesUpdatedListener, a nowy zakup będzie dostępny w queryPurchasesAsync.

Interfejs Google Play Developer API zwraca wartość linkedPurchaseTokenzasobie subskrypcji, gdy zakup zastępuje istniejący. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken, aby mieć pewność, że stary token nie będzie używany do uzyskiwania dostępu do Twoich usług. Więcej informacji o obsłudze zakupu wyższej lub niższej wersji znajdziesz w artykule Zmiana wersji i ponowna rejestracja.

Gdy otrzymasz nowy token zakupu, przeprowadź ten sam proces weryfikacji co w przypadku weryfikacji nowego tokena zakupu. Pamiętaj, aby potwierdzać te zakupy za pomocą funkcji BillingClient.acknowledgePurchase() z biblioteki Płatności w Google Play lub Purchases.subscriptions:acknowledge z interfejsu Google Play Developer API.

Obsługa odroczonej wymiany

Tryb odroczonej wymiany umożliwia użytkownikowi wykorzystanie pozostałych uprawnień w starym abonamencie przed rozpoczęciem korzystania z nowego.

Gdy użyjesz wartości ReplacementMode.DEFERRED w przypadku nowego zakupu, interfejs queryPurchasesAsync() zwróci nowy token zakupu po zakończeniu procesu zakupu. Token ten pozostanie powiązany ze starym produktem do czasu odroczonej wymiany, która nastąpi w kolejnym dniu odnowienia. Po tym czasie zostanie zwrócony nowy produkt.

W przeszłości można było osiągnąć takie wrażenia użytkownika za pomocą wycofanej funkcji ProrationMode.DEFERRED, ale w Bibliotece płatności w Play 6 funkcja ProrationMode.DEFERRED została wycofana. W tabeli poniżej znajdziesz informacje o różnicach w działaniu:

Godzina

ProrationMode.DEFERRED (wycofano)

ReplacementMode.DEFERRED

Bezpośrednio po zakończeniu procesu zakupu (aplikacja)

PurchasesUpdatedListener jest wywoływana po zakupie ze statusem informującym o tym, czy zmiana na wyższy lub niższy plan się powiodła.

Uprawnienia do starego abonamentu będą obowiązywać do następnej daty odnowienia. Aby mieć pewność, że aplikacja przyznaje odpowiednie uprawnienia, funkcja queryPurchasesAsync() zwraca obiekt Purchase z oryginalnym tokenem zakupu i oryginalnymi uprawnieniami do momentu zastąpienia.

Nowy token zakupu nie jest widoczny, więc nie można go teraz przetworzyć.

Funkcja PurchasesUpdatedListener jest wywoływana po zakupie i informuje o tym, czy przekształcenie się powiodło.

queryPurchasesAsync() zwraca zakup z nowym tokenem zakupu od razu, a także powiązane z nim pierwotne uprawnienie.

Wyświetlany jest nowy token zakupu, więc w tym momencie należy go przetworzyć, uwzględniając czas wymiany.

Bezpośrednio po zakończeniu procesu zakupu (backend)

Po zakończeniu procesu zakupu nie jest wysyłany sygnał RTDN SUBSCRIPTION_PURCHASED. System zaplecza nie jest jeszcze informowany o nowym zakupie.

SUBSCRIPTION_PURCHASED RTDN ze starym identyfikatorem produktu jest wysyłany natychmiast po zakończeniu procesu zakupu nowego tokena zakupu.

Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z parametrem „startTime” wskazującym czas zakupu z 2 elementami zamówienia:

  • Jeden reprezentuje stare uprawnienie i ma wartość „expiryTime” w przyszłości. Stare uprawnienie nie zostanie odnowione i będzie zawierać element DeferredItemReplacement z produktem nowego uprawnienia. Oznacza to oczekującą wymianę starego uprawnienia po jego wygaśnięciu.
  • Jeden reprezentuje nowo zakupione uprawnienie. Nie ma ustawionej wartości parametru „expiryTime”.

Wysłano SUBSCRIPTION_EXPIRED w przypadku starego tokena zakupu. Gdy wywołasz metodę purchases.subscriptionsv2.get z tokenem zakupu old, pojawi się ona jako wygasła (uprawnienie do starego abonamentu zostanie przeniesione na nowy zakup na pozostały czas).

Wymiana – pierwsze odnowienie po procesie zakupu (aplikacja)

queryPurchasesAsync() zwraca nowy obiekt Purchase z nowym tokenem zakupu i uprawnieniem.

Nowy token zakupu jest teraz widoczny, więc należy go przetworzyć.

queryPurchasesAsync() zwraca zakup z użyciem nowego tokena zakupu i powiązanych z nim nowych uprawnień.

Nowy zakup powinien zostać przetworzony już po zakończeniu procesu zakupu, więc aplikacja nie powinna podejmować żadnych specjalnych działań poza upewnieniem się, że przyznano odpowiednie uprawnienie.

Wymiana – pierwsze odnowienie po procesie zakupu (backend)

Nowy zakup można teraz przetworzyć i potwierdzić, gdy zostanie wysłane pierwsze powiadomienie RTDN SUBSCRIPTION_RENEWED.

Symbol linkedPurchaseToken w zasobie subskrypcji może służyć do określania, który użytkownik w backendzie subskrypcji (jeśli dotyczy) powinien zostać zaktualizowany o nowe uprawnienie.

Nowy zakup został przetworzony i potwierdzony, gdy w przypadku nowego tokena zakupu wysłano RTDN SUBSCRIPTION_PURCHASED i zarejestrowano go jako „startTime”.

W przypadku ReplacementMode.DEFERRED pierwsze odnowienia działają tak samo jak każde inne odnowienia i nie musisz obsługiwać specjalnej logiki zastępowania, gdy to zdarzenie wystąpi.

Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z 2 elementami zamówienia:

  • Jeden reprezentujący stare uprawnienie z wartością `expiryTime` w przeszłości i bez ustawionej wartości dla DeferredItemReplacement.
  • Jeden reprezentuje nowe uprawnienie z przyszłą datą wygaśnięcia `expiryTime` i włączoną flagą auto_renewing_enabled.

Od teraz zamiast wycofanego ProrationMode.DEFERRED należy używać ReplacementMode.DEFERRED, ponieważ w przypadku zmian uprawnień działa on tak samo, ale umożliwia zarządzanie zakupem w sposób bardziej spójny z zachowaniami w przypadku innych nowych zakupów.

Zarządzanie klientami

Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów możesz w czasie rzeczywistym wykrywać, kiedy użytkownik zdecyduje się anulować subskrypcję. Gdy użytkownik anuluje subskrypcję, ale zanim wygaśnie, możesz wysłać mu powiadomienia push lub wiadomości w aplikacji z prośbą o ponowne zasubskrybowanie.

Gdy użytkownik anuluje subskrypcję, możesz spróbować go odzyskać w aplikacji lub w Sklepie Play. Tabela poniżej zawiera opis różnych scenariuszy subskrypcji wraz z powiązanymi działaniami mającymi na celu odzyskanie subskrybentów i wymaganiami dotyczącymi aplikacji.

Przed wygaśnięciem subskrypcji Po wygaśnięciu subskrypcji
W aplikacji W Sklepie Play W aplikacji W Sklepie Play
Funkcja odzyskiwania klientów Subskrypcja w aplikacji Przywróć Subskrypcja w aplikacji Subskrybuj ponownie
Użytkownik przechodzi proces płatności Tak Nie Tak Tak
Subskrypcja użytkownika pozostaje powiązana z tym samym kodem SKU Użytkownik może zarejestrować się w ramach tego samego lub innego SKU Tak Użytkownik może zarejestrować się w ramach tego samego lub innego SKU Tak
Tworzy nowy token zakupu Tak Nie Tak Tak
Domyślnie włączona Nie Tak, pomoc jest wymagana w przypadku wszystkich deweloperów Nie

Aplikacje bez Biblioteki płatności w wersji 2.0 lub nowszej: nie

Aplikacje korzystające z Biblioteki płatności w wersji 2.0 lub nowszej: tak. Deweloperzy mogą zrezygnować z tej opcji w konsoli.

Kiedy użytkownikowi zostanie naliczona opłata

Jeśli używasz tego samego kodu SKU: koniec bieżącego okresu rozliczeniowego.

Jeśli używasz innego numeru SKU: zależy od trybu proporcjonalnego rozliczania.

Koniec bieżącego okresu rozliczeniowego Natychmiast Natychmiast
Wymagana implementacja udostępniać w aplikacji interfejs ponownej rejestracji;

Wykrywanie zmiany stanu subskrypcji

Precyzyjny link do Sklepu Play

Udostępnij w aplikacji interfejs ponownej rejestracji Obsługa zakupów poza aplikacją

Przed wygaśnięciem subskrypcji – w aplikacji

W przypadku subskrypcji, które zostały anulowane, ale jeszcze nie wygasły, możesz zezwolić subskrybentom na przywrócenie subskrypcji w aplikacji, stosując ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Sprawdź, czy interfejs użytkownika informuje, że użytkownik ma już subskrypcję. Możesz na przykład wyświetlać bieżącą datę wygaśnięcia subskrypcji i cenę cykliczną z przyciskiem Ponownie aktywuj.

Najczęściej warto zaoferować użytkownikowi tę samą cenę i ten sam SKU, które były już przez niego subskrybowane:

  • rozpocząć nowy zakup subskrypcji z tym samym kodem SKU;
  • Nowa subskrypcja zastępuje starą i odnawia się w tym samym dniu wygaśnięcia. Stara subskrypcja zostanie natychmiast oznaczona jako wygasła.
  • Na przykład Achilles ma subskrypcję aplikacji Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje miesięczny abonament w tej samej cenie miesięcznej. Nowa subskrypcja jest proporcjonalnie rozliczana z pozostałymi środkami, jest natychmiast aktywna i nadal odnawia się 1 sierpnia.

Jeśli chcesz zaoferować inną cenę, np. nowy bezpłatny okres próbny lub rabat dla powracających klientów, możesz zamiast tego zaoferować użytkownikowi inny kod SKU:

  • Zainicjuj przejście na wyższy lub niższy poziom z użyciem innego kodu SKU w trybie zastępowania WITHOUT_PRORATION.
  • Nowa subskrypcja zastępuje starą i odnawia się w tym samym dniu wygaśnięcia. Użytkownik zostanie obciążony ceną nowego kodu SKU, w tym cenami wprowadzającymi, w pierwotnym terminie wygaśnięcia. Jeśli stara subskrypcja została utworzona przy użyciu zaciemnionego identyfikatora konta, ten sam identyfikator powinien być przekazywany do BillingFlowParams w przypadku uaktualnień i obniżeń wersji.
  • Na przykład Achilles ma subskrypcję aplikacji Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje roczną subskrypcję w cenie dla nowych użytkowników. Nowa subskrypcja jest od razu aktywna, a użytkownik zostanie obciążony ceną promocyjną 1 sierpnia.
  • Jeśli zdecydujesz się uwzględnić bezpłatny okres próbny lub cenę początkową w jednostce SKU dla powracających klientów, upewnij się, że użytkownik kwalifikuje się do skorzystania z tej oferty. W tym celu odznacz w Konsoli Google Play pole Zezwalaj na jeden bezpłatny okres próbny na aplikację, które ogranicza możliwość skorzystania z bezpłatnego okresu próbnego do jednej aplikacji.

Gdy otrzymasz token zakupu, przetwórz zakup tak samo jak w przypadku nowej subskrypcji. Dodatkowo interfejs Google Play Developer API zwraca w zasobie subskrypcji wartość linkedPurchaseToken. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken, aby stary token nie był używany do uzyskiwania dostępu do Twoich usług.

Przed wygaśnięciem subskrypcji – w Sklepie Play

Gdy subskrypcja jest anulowana, ale nadal aktywna, użytkownicy mogą ją przywrócić w centrum subskrypcji Google Play, klikając Ponownie zasubskrybuj (wcześniej Przywróć). Zachowasz tę samą subskrypcję i token zakupu.

sekcja subskrypcji w aplikacji Sklep Google Play z anulowaną subskrypcją i przyciskiem ponownej subskrypcji;
Rysunek 8. Sekcja Konto > Subskrypcje w aplikacji Sklep Google Play z anulowaną subskrypcją i przyciskiem Ponownie zasubskrybuj.

Więcej informacji o przywracaniu subskrypcji znajdziesz w sekcji Przywracanie.

Po wygaśnięciu subskrypcji – w aplikacji

Możesz zezwolić subskrybentom, których subskrypcja wygasła, na ponowne zasubskrybowanie usługi w aplikacji, stosując ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Uwaga:

  • Aby zaoferować użytkownikom zniżkę, możesz udostępnić identyfikator produktu ze specjalną ceną subskrypcji, czyli kod SKU dla powracających użytkowników. Możesz udostępnić ofertę w aplikacji lub powiadomić użytkownika o ofercie poza aplikacją, np. w e-mailu.
  • Aby rozpocząć subskrypcję odzyskaną, uruchom proces zakupu w aplikacji na Androida za pomocą Biblioteki płatności w Google Play. Jest to taki sam proces jak w przypadku nowej subskrypcji, ale możesz określić kod SKU dostępny dla użytkownika.
  • Jeśli zdecydujesz się uwzględnić bezpłatny okres próbny lub cenę początkową w jednostce SKU dotyczącej ponownego pozyskiwania klientów, upewnij się, że użytkownik kwalifikuje się do skorzystania z tej oferty. W tym celu odznacz w Konsoli Google Play pole Zezwalaj na jeden bezpłatny okres próbny na aplikację, które ogranicza możliwość skorzystania z bezpłatnego okresu próbnego do jednej aplikacji.
  • Jeśli użytkownik ponownie zasubskrybuje ten sam kod SKU, nie będzie już mógł skorzystać z bezpłatnego okresu próbnego ani ceny początkowej. Upewnij się, że interfejs użytkownika to odzwierciedla.

Gdy otrzymasz token zakupu, przetwórz zakup tak samo jak w przypadku nowej subskrypcji. Nie otrzymasz linkedPurchaseToken w zasobie subskrypcji.

Po wygaśnięciu subskrypcji – w Sklepie Play

Jeśli ta opcja jest włączona, użytkownicy mogą ponownie zasubskrybować ten sam kod SKU w ciągu roku od wygaśnięcia subskrypcji, klikając Odnów subskrypcję w centrum subskrypcji Google Play. Spowoduje to wygenerowanie nowego tokena subskrypcji i zakupu.

sekcja subskrypcji w aplikacji Sklep Google Play z anulowaną i wygasłą subskrypcją oraz przyciskami ponownej subskrypcji i usuwania;
Rysunek 9. Sekcja Konto > Subskrypcje w aplikacji Sklep Google Play z anulowaną i wygasłą subskrypcją oraz przyciskami Ponów subskrypcjęUsuń.

Ponowne subskrybowanie jest traktowane jako zakup poza aplikacją, więc stosuj sprawdzone metody obsługi zakupów dokonywanych poza aplikacją.

Promowanie subskrypcji

Możesz utworzyć kody promocyjne, aby przyznać wybranym użytkownikom dłuższy bezpłatny okres próbny obecnej subskrypcji. Więcej informacji znajdziesz w sekcji Kody promocyjne.

W przypadku bezpłatnych okresów próbnych Google Play sprawdza, czy użytkownik ma ważną formę płatności, zanim rozpocznie korzystanie z bezpłatnej wersji próbnej. Niektórzy użytkownicy mogą zobaczyć tę weryfikację jako blokadę lub obciążenie na koncie formy płatności. Ta blokada lub opłata ma charakter tymczasowy i zostanie później cofnięta lub zwrócona.

Po zakończeniu okresu próbnego forma płatności wybrana przez użytkownika zostanie obciążona pełną ceną subskrypcji.

Jeśli użytkownik anuluje subskrypcję w dowolnym momencie bezpłatnego okresu próbnego, subskrypcja pozostanie aktywna do końca tego okresu i nie zostanie naliczona opłata po jego zakończeniu.

Anulowanie lub wycofywanie

Za pomocą interfejsu Google Play Developer API możesz anulować lub cofnąć subskrypcję. Ta funkcja jest też dostępna w Konsoli Google Play.

  • Anulowanie: użytkownicy mogą anulować subskrypcję w Google Play. Możesz też udostępnić użytkownikom opcję anulowania subskrypcji w aplikacji lub witrynie. Aplikacja powinna obsługiwać te anulowania w sposób opisany w sekcji Anulowania.

  • Anulowanie: gdy anulujesz subskrypcję, użytkownik natychmiast traci do niej dostęp. Możesz z niej skorzystać np. w sytuacji, gdy wystąpił błąd techniczny, który uniemożliwił użytkownikowi dostęp do Twojej usługi, a użytkownik nie chce dalej z niej korzystać. Aplikacja powinna obsługiwać te anulowania w sposób opisany w sekcji Cofnięcia.

W tabeli poniżej przedstawiono różnice między anulowaniem a cofnięciem.

Zatrzymuje odnawianie Cofnij dostęp
Anuluj Tak Nie
Wycofaj Tak Tak

Odroczenie płatności za subskrypcję

Możesz przesunąć datę następnej płatności dla subskrybenta, który korzysta z automatycznego odnawiania, za pomocą funkcji Purchases.subscriptions:defer interfejsu Google Play Developer API. W tym okresie użytkownik jest subskrybentem Twoich treści i ma do nich pełny dostęp, ale nie są od niego pobierane opłaty. Data odnowienia subskrypcji zostanie zmieniona na nową.

W przypadku abonamentów przedpłaconych możesz użyć interfejsu defer billing API, aby odroczyć datę wygaśnięcia.

Odroczone płatności umożliwiają:

  • Udostępnij użytkownikom bezpłatny dostęp w ramach specjalnej oferty, np. tygodniowy bezpłatny dostęp za zakup filmu.
  • zapewnić klientom bezpłatny dostęp w ramach gestu dobrej woli;

Rozliczenie można odroczyć o 1 dzień lub nawet o rok w przypadku każdego wywołania interfejsu API. Aby jeszcze bardziej odroczyć płatność, możesz ponownie wywołać interfejs API przed nową datą rozliczenia.

Przykład: Daria ma miesięczną subskrypcję treści online w aplikacji Fishing Quarterly. Zwykle 1 dnia każdego miesiąca pobierana jest od niej opłata w wysokości 1, 25 GBP. W marcu wzięła udział w ankiecie online dla wydawcy aplikacji. Wydawca nagradza ją 6 bezpłatnymi tygodniami, odraczając kolejną płatność do 15 maja, czyli 6 tygodni po pierwotnie zaplanowanej dacie rozliczenia, która przypadała na 1 kwietnia. Darcy nie ponosi opłat za kwiecień ani początek maja i nadal ma dostęp do treści. 15 maja zostanie obciążona standardową opłatą subskrypcyjną w wysokości 1, 25 zł za miesiąc. Jej następna data odnowienia to 15 czerwca.

Jeśli odraczasz płatność, możesz powiadomić użytkownika e-mailem lub w aplikacji, że data płatności została zmieniona.

Rozwiązywanie problemów z odrzuconymi płatnościami

Jeśli wystąpią problemy z płatnością za odnowienie subskrypcji, Google będzie okresowo podejmować próby odnowienia subskrypcji przez pewien czas, zanim ją anuluje. 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 tym czasie Google wysyła użytkownikowi e-maile i powiadomienia z prośbą o zaktualizowanie formy płatności.

Jeśli płatność zostanie odrzucona, subskrypcja przejdzie w okres prolongaty, jeśli jest on skonfigurowany. W okresie prolongaty należy zapewnić użytkownikowi dostęp do uprawnień w ramach subskrypcji.

Po zakończeniu okresu prolongaty subskrypcja przechodzi w okres zawieszenia konta. Gdy konto jest zawieszone, użytkownik nie powinien mieć dostępu do uprawnień w ramach subskrypcji.

W Konsoli Google Play możesz określić długość okresu prolongaty i zawieszenia konta dla każdego abonamentu podstawowego odnawianego automatycznie. Ustawienie okresu krótszego niż wartości domyślne może zmniejszyć liczbę subskrypcji odzyskanych w przypadku odrzucenia płatności.

Aby zwiększyć prawdopodobieństwo odzyskania subskrypcji w przypadku odrzucenia płatności, możesz poinformować użytkownika o problemie z płatnością i poprosić go o jego rozwiązanie.

Możesz to zrobić samodzielnie, zgodnie z opisem w sekcjach okres prolongatyzawieszenie konta, lub wdrożyć interfejs In-App Messaging API, w którym Google wyświetla użytkownikom wiadomość w Twojej aplikacji.

Wysyłanie wiadomości w aplikacji

Jeśli włączysz wiadomości w aplikacji za pomocą InAppMessageCategoryId.TRANSACTIONAL, Google Play będzie wyświetlać użytkownikom wiadomości w okresie prolongaty i zawieszenia konta raz dziennie, dając im możliwość naprawienia płatności bez opuszczania aplikacji.

Snackbar z powiadomieniem o konieczności poprawienia płatności
Rysunek 20. Snackbar z powiadomieniem o konieczności naprawienia płatności.

Zalecamy wywoływanie tego interfejsu API za każdym razem, gdy użytkownik otworzy aplikację, aby określić, czy wiadomość powinna być wyświetlana.

Jeśli użytkownikowi uda się odzyskać subskrypcję, otrzymasz kod odpowiedzi SUBSCRIPTION_STATUS_UPDATED wraz z tokenem zakupu. Następnie użyj tego tokena zakupu, aby wywołać interfejs Google Play Developer API i odświeżyć stan subskrypcji w aplikacji.

Integrowanie wysyłania wiadomości w aplikacji

Aby wyświetlać użytkownikom wiadomości w aplikacji, użyj kodu BillingClient.showInAppMessages().

Oto przykład wywoływania przepływu wiadomości w aplikacji:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });

Obsługa oczekujących transakcji dotyczących subskrypcji

Transakcje oczekujące mogą wystąpić podczas pierwszego zakupu, doładowania, przejścia na wyższą lub niższą wersję. Zakup subskrypcji rozpoczyna się od stanu SUBSCRIPTION_STATE_PENDING, a następnie przechodzi do stanu SUBSCRIPTION_STATE_ACTIVE. Jeśli transakcja wygaśnie lub zostanie anulowana przez użytkownika, przechodzi do stanu SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED. Uprawnienia użytkownika należy aktualizować dopiero po zakończeniu transakcji.

Zmiana stanu subskrypcji w przypadku początkowego zakupu z oczekującymi transakcjami jest prosta. Gdy użytkownik zainicjuje transakcję oczekującą, Twoja aplikacja otrzyma Purchase ze stanem PENDING. Po zakończeniu transakcji aplikacja ponownie otrzyma Purchase ze stanem zaktualizowanym do PURCHASED. A SubscriptionNotification wiadomość typu SUBSCRIPTION_PURCHASED jest wysyłana do klienta RTDN. Wykonaj typowe czynności związane z weryfikacją zakupu, przyznaniem użytkownikowi dostępu do treści i potwierdzeniem zakupu. Jeśli transakcja wygaśnie lub zostanie anulowana, do klienta RTDN zostanie wysłana wiadomość SubscriptionNotification o typie SUBSCRIPTION_PENDING_PURCHASE_CANCELED. W takich przypadkach użytkownik nigdy nie powinien uzyskać dostępu do treści.

Doładowanie, przejście na wyższą lub niższą wersję usługi z oczekującymi transakcjami wiąże się ze zmianami stanu zarówno starej, jak i nowej subskrypcji. Gdy użytkownik zainicjuje oczekującą transakcję doładowania, przejścia na wyższą lub niższą wersję, aplikacja otrzyma token Purchase dla starej subskrypcji z obiektem PendingPurchaseUpdate. Użytkownik nadal ma starą subskrypcję i nie uzyskał jeszcze nowej. Wywołanie funkcji getProducts()getPurchaseToken() na obiekcie PendingPurchaseUpdate zwraca identyfikatory produktów i token zakupu nowej subskrypcji. Po zakończeniu transakcji aplikacja otrzyma obiekt Purchase z tokenem zakupu najwyższego poziomu ustawionym dla nowej subskrypcji i stanem ustawionym na PURCHASED. Do klienta RTDN wysyłana jest wiadomość SubscriptionNotification o typie SUBSCRIPTION_PURCHASED. Dopiero wtedy zastąp stary token zakupu nowym i zaktualizuj dostęp użytkownika do treści. Jeśli transakcja wygaśnie lub zostanie anulowana, do klienta RTDN zostanie wysłana wiadomość o typie SUBSCRIPTION_PENDING_PURCHASE_CANCELED.SubscriptionNotification W takich przypadkach użytkownik powinien nadal mieć dostęp do treści w ramach starej subskrypcji.