Informacje o subskrypcjach

W tym temacie dowiesz się, jak obsługiwać zdarzenia cyklu życia subskrypcji, takie jak odnowienie i wygaśnięcie. Opisuje on też dodatkowe funkcje subskrypcji, takie jak oferowanie promocji i umożliwianie użytkownikom zarządzania własnymi subskrypcjami.

Jeśli nie masz skonfigurowanych usług subskrypcji w przypadku swojej aplikacji, przeczytaj artykuł Tworzenie i konfigurowanie produktów.

Przegląd subskrypcji

Subskrypcja reprezentuje korzyści, z których użytkownicy mogą korzystać w danym okresie. Subskrypcja może na przykład umożliwiać użytkownikowi dostęp do usługi strumieniowania muzyki.

W tej samej aplikacji możesz mieć kilka subskrypcji, które reprezentują różne zestawy korzyści lub różne poziomy jednego zestawu (np. „srebrny” i „złoty”).

Korzystając z abonamentów podstawowych i ofert, możesz utworzyć wiele konfiguracji dla tego samego abonamentu. Możesz na przykład utworzyć ofertę dla nowych użytkowników, którzy nigdy nie subskrybowali Twojej aplikacji, albo ofertę przejścia na wyższą wersję dla użytkowników, którzy już ją subskrybują.

Szczegółowe informacje o subskrypcjach, abonamentach podstawowych i ofertach znajdziesz w dokumentacji w Centrum pomocy Konsoli Play.

Integracja z abonamentami przedpłaconymi

Abonamenty przedpłacone nie odnawiają się automatycznie po wygaśnięciu. Aby bez przerwy przedłużać ważność subskrypcji, użytkownik musi doładować abonament przedpłacony tej samej subskrypcji.

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

Doładowania abonamentów przedpłaconych zawsze korzystają z trybu wymiany CHARGE_FULL_PRICE i nie musisz go konfigurować bezpośrednio. Użytkownik zostanie natychmiast obciążony opłatą za pełny okres rozliczeniowy, a jego upoważnienie zostanie przedłużone o okres podany w doliczeniu.

Po doładowaniu nowe pola obiektu wyniku Purchase są aktualizowane tak, aby odzwierciedlały ostatni zakup doładowania:

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

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

  • Nazwa pakietu
  • Stan zakupu
  • produkty,
  • Automatyczne odnawianie

Potwierdzenie zakupu przedpłaconego

Podobnie jak w przypadku subskrypcji odnawianych automatycznie, po zakupie musisz potwierdzić swoją tożsamość za abonament przedpłacony. Musisz potwierdzić zarówno początkowy zakup, jak i doładowania. Więcej informacji znajdziesz w artykule Przetwarzanie zakupów.

Ze względu na krótki czas obowiązywania subskrypcji przedpłaconej ważne jest jak najszybsze potwierdzenie zakupu.

Abonamenty przedpłacone z okresem co najmniej tygodnia należy potwierdzić w ciągu 3 dni.

Abonamenty przedpłacone o czasie trwania krótszym niż tydzień muszą zostać potwierdzone w okresie połowy okresu obowiązywania abonamentu. Na przykład deweloperzy mają 1, 5 dnia na zaakceptowanie 3-dniowego abonamentu przedpłaconego.

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

Na ekranie ustawień i ustawień aplikacji powinien znajdować się link umożliwiający użytkownikom zarządzanie subskrypcjami, co pozwoli Ci włączyć do naturalnego wyglądu i stylu aplikacji.

W przypadku trwających subskrypcji możesz dołączyć precyzyjny link z aplikacji do centrum subskrypcji w Google Play. Znajdziesz go w polu subscriptionState zasobu subskrypcji. Z tego powodu możesz utworzyć precyzyjne linki do centrum subskrypcji w Sklepie Play na kilka sposobów.

Użyj tego adresu URL, aby przekierować użytkowników na stronę ze wszystkimi subskrypcjami, tak jak na ilustracji 1 i 2:

https://play.google.com/store/account/subscriptions
Na ekranie subskrypcji w Sklepie Play widać stan wszystkich subskrypcji rozliczanych przez Google Play.
Rysunek 1. Na ekranie subskrypcji w Sklepie Play widać stan wszystkich subskrypcji rozliczanych przez 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 podać bezpośredni link do strony zarządzania aktualną subskrypcją, podaj nazwę pakietu i productId powiązane z kupioną subskrypcją. Aby automatycznie określić productId w przypadku istniejącej subskrypcji, wyślij zapytanie do backendu aplikacji lub wywołaj BillingClient.queryPurchasesAsync() w celu pobrania listy subskrypcji powiązanych z konkretnym użytkownikiem. Każda subskrypcja zawiera odpowiadające jej productId informacje 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 danym elemencie zamówienia.

Użyj tego adresu URL, aby przekierowywać użytkowników do określonego ekranu zarządzania subskrypcją. Zastąp „identyfikator-twojego-produktu” i „pakiet-aplikacji” odpowiednio ciągiem productId i nazwą pakietu aplikacji:

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

Może on zarządzać formami płatności i korzystać z funkcji, takich jak anulowanie, ponowna subskrypcja i wstrzymywanie.

Zezwalaj użytkownikom na przejście na wyższą lub niższą wersję usługi albo zmianę abonamentu

Możesz zaoferować obecnym subskrybentom różne opcje zmiany abonamentu, który lepiej odpowiada ich potrzebom:

  • Jeśli sprzedajesz wiele poziomów subskrypcji, np. „podstawowy” i „premium”, możesz zezwolić użytkownikom na przełączanie się między nimi, kupując abonament podstawowy lub ofertę innego abonamentu.
  • Możesz zezwolić użytkownikom na zmianę bieżącego okresu rozliczeniowego, na przykład przejście z abonamentu miesięcznego na roczny.
  • Możesz też zezwolić użytkownikom na przełączanie się między abonamentem odnawianym automatycznie a abonamentem przedpłaconym.

Możesz zachęcić do tych zmian, przesyłając oferty subskrypcji, które zapewniają zniżkę kwalifikującym się użytkownikom. Możesz na przykład utworzyć ofertę, która zapewnia 50% zniżki w pierwszym roku, jeśli przechodzisz z abonamentu miesięcznego na roczny, i ogranicz ją do użytkowników, którzy mają abonament miesięczny i nie dokonali zakupu. Więcej informacji o kryteriach kwalifikacji ofert znajdziesz w Centrum pomocy.

Rysunek 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świetlić ekran podobny do ilustracji 3, aby umożliwić użytkownikom zmianę subskrypcji. We wszystkich przypadkach użytkownicy muszą dokładnie wiedzieć, jaki jest ich obecny abonament i jakie możliwości mogą zmienić.

Gdy użytkownicy zdecydują się przejść na wyższą lub niższą wersję subskrypcji albo na inny, musisz wybrać tryb wymiany, który określa sposób stosowania proporcjonalnej wartości bieżącego płatnego okresu rozliczeniowego i kiedy nastąpi zmiana uprawnień.

Tryby wymiany

W tabeli poniżej znajdziesz dostępne tryby wymiany i przykładowe wykorzystanie.

Tryb wymiany

Opis

Przykład użycia

WITH_TIME_PRORATION

Subskrypcja zostanie natychmiast zmieniona na wyższą lub niższą. Pozostały czas jest dostosowywany na podstawie różnicy w cenie i zaliczany na poczet nowej subskrypcji przez przesunięcie terminu następnego okresu rozliczeniowego. Jest to jego ustawienie domyślne.

Przejdź na droższy poziom bez dodatkowych opłat.

CHARGE_PRORATED_PRICE

Subskrypcja zostanie uaktualniona natychmiast, a cykl rozliczeniowy pozostanie bez zmian. Użytkownik zostanie obciążony różnicą w cenie za pozostały okres.

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

Przejdź na droższy poziom bez zmiany daty rozliczenia.

CHARGE_FULL_PRICE

Subskrypcja zostanie natychmiast zmieniona na wyższą lub niższą, a użytkownik zostanie natychmiast obciążony pełną ceną za nowe uprawnienie. Pozostała wartość z poprzedniej subskrypcji zostanie przeniesiona dla tego samego uprawnienia lub zostanie obliczona proporcjonalnie za czas przy przechodzeniu na inne uprawnienie.

Uwaga: jeśli nowa subskrypcja jest objęta bezpłatnym okresem próbnym lub ofertą dla nowych użytkowników, w momencie przechodzenia na wyższą lub niższą wersję użytkownik jest obciążany 0 USD lub ceną oferty dla nowych użytkowników (w zależności od tego, która z nich ma zastosowanie).

Przejdź z krótszego na dłuższy okres rozliczeniowy.

WITHOUT_PRORATION

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

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

DEFERRED

Subskrypcja zostanie zmieniona na wyższą lub niższą tylko w przypadku odnowienia subskrypcji, ale nowy zakup zostanie wystawiony natychmiast z datą rozpoczęcia przypadającą w przyszłości dla nowego uprawnienia. Deweloper może więc zezwolić użytkownikom na wprowadzenie dodatkowych zmian. Mogą na przykład przywrócić pierwotny plan lub zainicjować nową zmianę abonamentu odroczonego.

Przejdź na tańszy poziom.

Więcej informacji o różnych zastosowaniach służących do sprzedaży dodatkowej i odzyskiwania użytkowników w ramach ofert przejścia na wyższą lub niższą wersję znajdziesz w przewodniku po ofertach i promocjach.

Ustawianie trybu wymiany w przypadku zakupu

W zależności od Twoich preferencji i logiki biznesowej możesz użyć różnych trybów zastępowania w przypadku różnych rodzajów przenoszenia subskrypcji. Z tej sekcji dowiesz się, jak ustawić tryb zastępczy w przypadku zmiany subskrypcji oraz jakie obowiązują ograniczenia.

Ponowne subskrybowanie lub zmiana abonamentu w ramach tej samej subskrypcji

W Konsoli Google Play możesz określić domyślny tryb wymiany. To ustawienie pozwala określić, kiedy obecni subskrybenci mają być obciążani kosztami, jeśli kupią inny abonament podstawowy lub inną ofertę w ramach tej samej subskrypcji albo ponownie wykupią subskrypcję po anulowaniu. Dostępne opcje to Obciążenie natychmiast (równowartość CHARGE_FULL_PRICE) i Obciążenie w dniu następnego rozliczenia, stanowiące odpowiednik WITHOUT_PRORATION. To jedyne odpowiednie tryby wymiany podczas przełączania abonamentów podstawowych w ramach tej samej subskrypcji.

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

Przełączanie subskrypcji między subskrypcjami lub zastąpienie domyślnego trybu wymiany

Jeśli użytkownik zmienia usługi subskrypcji – kupują inną subskrypcję – lub jeśli z jakiegoś powodu chcesz zastąpić domyślny tryb wymiany, określ proporcjonalną wartość procentową w czasie działania w parametrach procesu zakupu.

Aby prawidłowo podać funkcję SubscriptionUpdateParams w ramach konfiguracji procesu zakupu w środowisku wykonawczym, pamiętaj o tych ograniczeniach:

  • W przypadku przechodzenia na abonament przedpłacony na przedpłacony z abonamentu przedpłaconego lub odnawianego automatycznie, jedyny dozwolony tryb to CHARGE_FULL_PRICE. Jeśli określisz inny tryb proporcjonalności, zakup się nie powiedzie, a użytkownik zobaczy komunikat o błędzie.
  • Gdy zmieniasz swój abonament w ramach tej samej subskrypcji na automatycznie odnawiany z abonamentu przedpłaconego lub automatycznie odnawianego, dostępne tryby proporcjonalnego podziału to CHARGE_FULL_PRICE i WITHOUT_PRORATION. Jeśli określisz inny tryb proporcjonalności, zakup się nie powiedzie, a użytkownik zobaczy komunikat o błędzie.

Przykłady zastępowania i zachowania

Aby zrozumieć, jak działa każdy z trybów proporcjonalnych, weź pod uwagę następujący scenariusz:

Samwise ma subskrypcję treści online w aplikacji Country Gardener. Posiada miesięczną subskrypcję treści na poziomie 1, która zawiera tylko tekst. Ta subskrypcja kosztuje 2 USD miesięcznie i jest odnawiana pierwszego dnia miesiąca.

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

Podczas przechodzenia na wyższą wersję deweloper wybiera tryb proporcjonalnego okresu subskrypcji. Na poniższej liście opisujemy, jak poszczególne tryby proporcjonalne wpływają na subskrypcję Samwise:

WITH_TIME_PRORATION

Subskrypcja poziomu 1 Samwise kończy się natychmiast. Ponieważ zapłacił za cały miesiąc (1–30 kwietnia), ale w połowie okresu subskrypcji przeszedł na wersję płatną, do jego nowej subskrypcji zostanie zastosowana połowa miesięcznej subskrypcji (1 USD). Jednak nowa subskrypcja kosztuje 36 zł rocznie, dlatego saldo środków w wysokości 1 zł wystarczy na 10 dni (16–25 kwietnia). Dlatego 26 kwietnia zostanie on obciążony opłatą za nową subskrypcję w wysokości 36 zł, a 26 kwietnia każdego następnego roku zostanie naliczona opłata w wysokości 36 zł.

Wywołaj metodę PurchasesUpdatedListener aplikacji w momencie zakupu, aby pobrać nowy zakup w ramach wywołania queryPurchasesAsync(). Backend od razu otrzymuje powiadomienie SUBSCRIPTION_PURCHASED dla deweloperów w czasie rzeczywistym.

CHARGE_PRORATED_PRICE

Możesz korzystać z tego trybu, ponieważ cena subskrypcji poziomu 2 za jednostkę czasu (36 USD/rok = 3 USD/miesiąc) jest wyższa niż cena subskrypcji Poziomu 1 za jednostkę czasu (2 USD/miesiąc). Subskrypcja poziomu 1 Samwise kończy się natychmiast. Ponieważ zapłacił za cały miesiąc, ale zużył tylko jego połowę, połowa miesięcznej subskrypcji (1 USD) zostaje doliczona do nowej subskrypcji. Nowa subskrypcja kosztuje jednak 36 zł/rok, więc pozostałe 15 dni kosztuje 1,50 zł, więc zapłaci za nową subskrypcję 0,50 zł. 1 maja zostanie obciążony opłatą za nowy poziom subskrypcji w wysokości 36 zł, a kolejne 36 zł – 1 maja każdego roku.

Wywołaj metodę PurchasesUpdatedListener aplikacji w momencie zakupu. Umożliwi Ci to pobranie nowego zakupu w ramach wywołania queryPurchasesAsync(). Backend od razu otrzymuje powiadomienie SUBSCRIPTION_PURCHASED dla deweloperów w czasie rzeczywistym.

WITHOUT_PRORATION

Subskrypcja Poziomu 1 Samwisego zostanie natychmiast zmieniona na poziom 2 bez dodatkowych opłat, a 1 maja zostanie obciążony opłatą w wysokości 36 USD za nowy poziom subskrypcji i kolejnymi 36 USD – 1 maja każdego roku kolejnego.

Wywołaj metodę PurchasesUpdatedListener aplikacji w momencie zakupu. Umożliwi Ci to pobranie nowego zakupu w ramach wywołania queryPurchasesAsync(). Backend od razu otrzymuje powiadomienie SUBSCRIPTION_PURCHASED dla deweloperów w czasie rzeczywistym.

DEFERRED

Subskrypcja poziomu 1 Samwise wygaśnie do 30 kwietnia. 1 maja zacznie obowiązywać subskrypcja poziomu 2, a Samwise zostanie obciążony opłatą za nowy poziom subskrypcji w wysokości 36 USD.

Wywołaj metodę PurchasesUpdatedListener aplikacji w momencie zakupu. Umożliwi Ci to pobranie nowego zakupu w ramach wywołania queryPurchasesAsync(). Backend od razu otrzymuje powiadomienie SUBSCRIPTION_PURCHASED dla deweloperów w czasie rzeczywistym. Zakup musisz przetwarzać w taki sam sposób jak każdy inny zakup. W szczególności musisz potwierdzić dokonanie nowego zakupu. Zwróć uwagę, że pole startTime nowej subskrypcji jest wypełniane w momencie wejścia w życie zastąpienia, co ma miejsce po wygaśnięciu starej subskrypcji. W takim przypadku otrzymasz wtedy SUBSCRIPTION_RENEWED czasu RTDN dla nowego abonamentu. Więcej informacji o zachowaniu ReplacementMode.DEFERRED znajdziesz w artykule Obsługa odroczonej wymiany.

CHARGE_FULL_PRICE

Subskrypcja poziomu 1 Samwise kończy się natychmiast. Jego subskrypcja poziomu 2 rozpoczyna się dzisiaj, a jego stawka wynosi 36 zł. Ponieważ zapłacił za cały miesiąc, ale zużył tylko jego połowę, do jego nowej subskrypcji zostanie przypisana połowa miesięcznej subskrypcji (1 USD). Nowa subskrypcja kosztuje 36 USD rocznie, więc do okresu subskrypcji (około 10 dni) zostanie dodany 1/36 dnia roku. W związku z tym następna opłata zostanie naliczona za rok i za 10 dni od dzisiaj i wyniesie 36 zł. Potem jest obciążany opłatą w wysokości 36 USD rocznie.

Zanim wybierzesz tryb proporcjonalnego udostępniania, zapoznaj się z naszymi zaleceniami dotyczącymi wymiany.

Aktywowanie zmian w subskrypcjach w aplikacji

W swojej aplikacji możesz oferować użytkownikom przejście na wyższą lub niższą wersję usługi, wykonując te same czynności co w przypadku rozpoczynania procesu zakupu. Jednak podczas przechodzenia na wyższą lub niższą wersję usługi musisz podać szczegółowe informacje o obecnej subskrypcji, przyszłej (natychmiastowej lub niższej) subskrypcji oraz o trybie wymiany, jak widać 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 proporcjonalne oraz zalecane przez nas zalecenia:

Scenariusz Zalecany tryb wymiany Wynik
Przejście na droższy poziom CHARGE_PRORATED_PRICE Użytkownik natychmiast uzyska dostęp przy zachowaniu tego samego okresu rozliczeniowego.
Przechodzenie na tańszy poziom DEFERRED Użytkownik zapłacił już za droższy poziom, więc zachowa dostęp do następnej daty płatności.
Przejście na wersję płatną w trakcie bezpłatnego okresu próbnego WITHOUT_PRORATION Użytkownik zachowuje dostęp do bezpłatnej wersji próbnej, ale do końca tego okresu przechodzi na wyższy poziom.
Przejście na wersję płatną podczas bezpłatnego okresu próbnego – zakończenie dostępu do bezpłatnego okresu próbnego CHARGE_PRORATED_PRICE Użytkownik natychmiast uzyska dostęp do nowego poziomu, ale nie korzysta już z bezpłatnego okresu próbnego.

Obsługa zakupów zmiany subskrypcji

Zmiany abonamentu to nowe zakupy ze wszystkimi warunkami i celami. Należy je przetworzyć i zaakceptować po zakończeniu procesu rozliczeniowego. Oprócz właściwego przetworzenia nowego zakupu musisz wycofać zakup, który ma zostać zastąpiony.

Zachowanie w aplikacji jest takie samo jak w przypadku każdego nowego zakupu. Aplikacja otrzymuje skuteczność nowego zakupu w usłudze PurchasesUpdatedListener, a nowy zakup jest dostępny w queryPurchasesAsync.

Interfejs Google Play Developer API zwraca wartość linkedPurchaseToken w zasobie subskrypcji, gdy zakup zastępuje istniejący. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken, aby mieć pewność, że nie użyjesz starego tokena do uzyskania dostępu do Twoich usług. Informacje o obsłudze zakupów związanych z przechodzeniem na wyższą i niższą wersję usługi znajdziesz w artykule Przechodzenie na wyższą i niższą wersję usługi oraz ponowna rejestracja.

Gdy otrzymasz nowy token zakupu, wykonaj tę samą procedurę weryfikacji co w przypadku weryfikacji nowego tokena zakupu. Pamiętaj, aby potwierdzić te zakupy od: BillingClient.acknowledgePurchase() z Biblioteki płatności w Google Play lub Purchases.subscriptions:acknowledge w interfejsie Google Play Developer API.

Obsługa odroczonej wymiany

Tryb odroczonej wymiany pozwala użytkownikowi na wykorzystanie pozostałego uprawnienia przed przejściem na nowy.

Gdy używasz metody ReplacementMode.DEFERRED przy nowym zakupie, queryPurchasesAsync() zwraca po procesie zakupu nowy token zakupu, który pozostaje powiązany ze starą usługą, aż do odroczonego zastąpienia w dniu następnego odnowienia. Po tym czasie nowy produkt zostanie zwrócony.

Wcześniej można było korzystać z wersji ProrationMode.DEFERRED wycofanej dla użytkowników, ale usługa ProrationMode.DEFERRED została wycofana wraz z biblioteką płatności w Play 6. Z tej tabeli dowiesz się, czym różni się to zachowanie:

Czas

ProrationMode.DEFERRED (wycofana)

Zamiennik.WSTRZYMANY

Tuż po pomyślnym zakończeniu procesu zakupu (aplikacja)

Usługa PurchasesUpdatedListener jest wywoływana po zakupie ze stanem informującym o powodzeniu przejścia na wyższą lub niższą wersję usługi.

Przejście na stary abonament trwa do daty następnego odnowienia. Aby zapewnić w aplikacji odpowiednie uprawnienia, queryPurchasesAsync() zwraca obiekt zakupu z pierwotnym tokenem zakupu i pierwotnym uprawnieniem do momentu wymiany.

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

Usługa PurchasesUpdatedListener jest wywoływana po zakupie ze stanem informującym o powodzeniu przejścia na wyższą lub niższą wersję usługi.

queryPurchasesAsync() od razu zwraca zakup przy użyciu tokena zakupu nowego i powiązanego z nim pierwotnego uprawnienia.

Pojawia się nowy token zakupu, dlatego należy go na tym etapie przetworzyć z uwzględnieniem daty wymiany.

Tuż po udanym procesie zakupu (backend)

Numer RTDN SUBSCRIPTION_PURCHASED nie jest wysyłany po zakończeniu procesu zakupu. Backend nie ma jeszcze informacji o nowym zakupie.

SUBSCRIPTION_PURCHASED RTDN ze starym identyfikatorem produktu jest wysyłane natychmiast po procesie zakupu dla 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:

  • Jedna z nich reprezentuje stare uprawnienie i ma wartość „expiryTime” w przyszłości. Stare upoważnienie nie zostanie odnowione i zawiera element DeferredItemReplacement zawierający iloczyn nowego upoważnienia. Oznacza to, że po wygaśnięciu starego uprawnienia oczekujesz na jego zastąpienie.
  • Jedna z nich reprezentująca nowo kupione uprawnienie. Nie ma ustawionej wartości „expiryTime”.

W przypadku starego tokena zakupu wysłano okres SUBSCRIPTION_EXPIRATIOND. Gdy wywołasz metodę purchases.subscriptionsv2.get za pomocą starego tokena zakupu, będzie ona widoczna jako wygasła (w pozostałym okresie uprawnienia do starego abonamentu zostaną przeniesione do nowego zakupu).

Przy zmianie – pierwsze odnowienie po procesie zakupu (aplikacja)

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

Pojawił się nowy token zakupu, więc należy go przetworzyć.

queryPurchasesAsync() od razu zwraca zakup przy użyciu nowego tokena zakupu i nowego uprawnienia powiązanego z nim.

Nowy zakup powinien zostać przetworzony już po pomyślnym zakończeniu procesu zakupu, więc aplikacja nie powinna podejmować żadnych specjalnych działań poza sprawdzeniem, czy użytkownik ma odpowiednie uprawnienia.

Przy wymiany – pierwsze odnowienie po procesie zakupu (backend)

Nowy zakup może być teraz przetworzony i potwierdzony po wysłaniu pierwszej SUBSCRIPTION_RENEWED RTDN.

Za pomocą obiektu linkedPurchaseToken w zasobie subskrypcji można w razie potrzeby określić, który użytkownik w backendzie subskrypcji należy zaktualizować na podstawie nowego uprawnienia.

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

W przypadku zastępowania Mode.DEFERRED pierwsze odnowienia przebiegają tak samo jak w przypadku każdego innego odnowienia i nie musisz wykonywać specjalnej procedury dotyczącej wymiany w momencie wystąpienia tego zdarzenia.

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

  • Jedna z nich reprezentuje stare uprawnienie z datą „expiryTime” w przeszłości i braku ustawionej wartości dla DeferredItemReplacement.
  • Jedna z nich reprezentuje nowe uprawnienie z wartością „expiryTime” w przyszłości i włączoną flagą auto_renewing_enabled.

Od teraz zamiast wycofanej metody ProrationMode.DEFERRED należy używać funkcji ReplacementMode.DEFERRED, ponieważ działa ona tak samo w przypadku zmian uprawnień, ale umożliwia zarządzanie zakupami w sposób bardziej spójny z pozostałymi nowymi zakupami.

Zarządzanie klientami

Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów możesz w czasie rzeczywistym wykrywać, kiedy użytkownik rezygnuje. Jeśli 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 wykupienie subskrypcji.

Gdy użytkownik anuluje subskrypcję, możesz spróbować odzyskać go w aplikacji lub w Sklepie Play. W tabeli poniżej opisujemy różne scenariusze subskrypcji wraz z powiązanymi działaniami zwrotnymi 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 przywracania Subskrypcja w aplikacji Przywróć Subskrypcja w aplikacji Subskrybuj ponownie
Użytkownik przechodzi przez 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ę na taki sam kod SKU lub inny Tak Użytkownik może zarejestrować się na taki sam kod SKU lub inny Tak
Tworzy nowy token zakupu Tak Nie Tak Tak
Włączone domyślnie Nie Tak, pomoc jest wymagana dla wszystkich programistów Nie

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

Aplikacje z Biblioteką płatności w wersji 2.0 lub nowszej: tak. Deweloperzy mogą zrezygnować z tej funkcji w Konsoli.

Kiedy użytkownik jest obciążany opłatą

Jeśli używasz tej samej wersji SKU: koniec bieżącego okresu rozliczeniowego.

Jeśli używasz innych kodów SKU, zależy to od trybu proporcjonalnego podziału.

Koniec bieżącego okresu rozliczeniowego Od razu Od razu
Wymagana implementacja Udostępnij w aplikacji interfejs do ponownej rejestracji

Wykryj zmianę stanu subskrypcji

Precyzyjny link do Sklepu Play

Udostępnianie w aplikacji interfejsu do 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. Aby to zrobić, zastosuj ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Sprawdź, czy interfejs użytkownika informuje, że użytkownik ma subskrypcję. Możesz na przykład wyświetlić aktualną datę ważności i cenę cykliczną użytkownika za pomocą przycisku Aktywuj ponownie.

Najczęściej będziesz oferować użytkownikom te same ceny i kody SKU, które już zasubskrybowali. Oto niektóre z nich:

  • Rozpocznij nowy zakup subskrypcji z tym samym kodem SKU.
  • Nowa subskrypcja zastępuje starą i zostanie odnowiona z tą samą datą ważności. Stara subskrypcja zostanie natychmiast oznaczona jako wygasła.
  • Załóżmy na przykład, że Adam ma subskrypcję aplikacji Przykładowa muzyka, której data ważności mija 1 sierpnia. 10 lipca ponownie wykupuje subskrypcję miesięczną w tej samej cenie co miesiąc. Naliczamy pozostałe środki za nową subskrypcję, która jest od razu aktywna i nadal jest odnawiana 1 sierpnia.

Jeśli chcesz zaoferować inną cenę, np. nowy bezpłatny okres próbny lub rabat na pozyskanie zwrotu, możesz zaoferować użytkownikowi inny kod SKU:

  • Rozpocznij przejście na wyższą lub niższą wersję usługi przy użyciu innego kodu SKU w trybie wymiany WITHOUT_PRORATION.
  • Nowa subskrypcja zastępuje starą i zostanie odnowiona z tą samą datą ważności. Użytkownik zostanie obciążony ceną nowego kodu SKU, w tym wszelkich cen dla nowych użytkowników, w pierwotnej dacie ważności. Jeśli stara subskrypcja została utworzona przy użyciu zaciemnionego identyfikatora konta, ten sam identyfikator powinien zostać przekazany do BillingFlowParams na potrzeby przejścia na wyższą lub niższą wersję usługi.
  • Załóżmy na przykład, że Adam ma subskrypcję aplikacji Przykładowa muzyka, której data ważności mija 1 sierpnia. 10 lipca ponownie wykupuje subskrypcję roczną w cenie początkowej. Nowa subskrypcja stanie się od razu aktywna, a 1 sierpnia użytkownik zostanie obciążony ceną dla nowych użytkowników.
  • Jeśli zdecydujesz się uwzględnić bezpłatny okres próbny lub cenę początkową w swoim kodzie SKU winback, upewnij się, że użytkownik kwalifikuje się do skorzystania z oferty. Aby to zrobić, odznacz pole Zezwalaj na 1 bezpłatny okres próbny na aplikację w Konsoli Google Play, aby ograniczyć mu możliwość skorzystania z jednej bezpłatnej wersji próbnej na aplikację.

Gdy otrzymasz token zakupu, przetwórz zakup tak samo jak w przypadku nowej subskrypcji. Interfejs Google Play Developer API zwraca też w zasobie subskrypcji wartość linkedPurchaseToken. Pamiętaj o unieważnieniu tokena podanego w linkedPurchaseToken, aby mieć pewność, że nie będzie on używany do uzyskiwania dostępu do Twoich usług.

Przed wygaśnięciem subskrypcji – w Sklepie Play

Gdy subskrypcja została anulowana, ale nadal jest aktywna, użytkownicy mogą ją przywrócić w centrum subskrypcji Google Play, klikając Odnów subskrypcję (wcześniej Przywróć). Subskrypcja i token zakupu zostaną zachowane.

Sekcja subskrypcji w aplikacji Sklep Google Play przedstawiająca anulowaną subskrypcję i przycisk odnawiania subskrypcji.
Rysunek 8. Sekcja Konto > Subskrypcje w aplikacji Sklep Google Play z widoczną anulowaną subskrypcją i przyciskiem Odnów subskrypcję.

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

Po wygaśnięciu subskrypcji – w aplikacji

Możesz zezwolić subskrybentom, którzy wygasli, na ponowne wykupienie subskrypcji w aplikacji, stosując ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Zwróć uwagę na te kwestie:

  • Aby zaoferować użytkownikom rabat, możesz podać identyfikator produktu ze specjalną ceną subskrypcji, nazywany też kodem SKU wygranej. Ofertę możesz udostępnić w aplikacji lub powiadomić o niej użytkownika poza aplikacją, np. w e-mailu.
  • Aby rozpocząć subskrypcję powrotną, uruchom proces zakupu w aplikacji na Androida, korzystając z Biblioteki płatności w Google Play. Działa to tak samo 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 zgłoszeniu SKU, upewnij się, że użytkownik kwalifikuje się do korzystania z tej usługi. Aby to zrobić, odznacz pole Zezwalaj na jedną bezpłatną wersję próbną na aplikację w Konsoli Google Play. Spowoduje to ograniczenie dostępu użytkownika do jednej bezpłatnej wersji próbnej na aplikację.
  • Jeśli użytkownik ponownie zasubskrybuje ten sam kod SKU, nie będzie się już kwalifikować do skorzystania z bezpłatnych okresów próbnych ani z ceny początkowej. Upewnij się, że jest to zgodne z Twoim interfejsem użytkownika.

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 przez maksymalnie 1 rok po wygaśnięciu jego ważności. Aby to zrobić, kliknij Odnów subskrypcję w centrum subskrypcji w Google Play. Spowoduje to wygenerowanie nowego tokena zakupu i subskrypcji.

Sekcja subskrypcji w aplikacji Sklep Google Play z informacjami o anulowanej i wygasłej subskrypcji oraz przyciskami odnawiania i usuwania.
Rysunek 9. Konto > Subskrypcje w aplikacji Sklep Google Play z widoczną anulowaną i wygasłą subskrypcją oraz przyciskami Odnów subskrypcję i Usuń.

Ponowna subskrypcja jest uznawana za zakup poza aplikacją, więc pamiętaj, by przestrzegać sprawdzonych metod obsługi zakupów robionych poza aplikacją.

Promuj subskrypcję

Możesz tworzyć kody promocyjne, aby dać wybranym użytkownikom przedłużony bezpłatny okres próbny subskrypcji. Więcej informacji znajdziesz w sekcji Kody promocyjne.

W przypadku bezpłatnych okresów próbnych przed rozpoczęciem tego okresu Google Play sprawdza, czy użytkownik ma ważną formę płatności. Niektórzy użytkownicy mogą zobaczyć tę weryfikację jako blokadę lub obciążenie swojej formy płatności. Blokada lub obciążenie jest tymczasowa i później można ją cofnąć lub zwrócić.

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

Jeśli użytkownik anuluje subskrypcję w dowolnym momencie podczas tego okresu, subskrypcja pozostanie aktywna do końca tego okresu, a po jego zakończeniu nie zostaną naliczone żadne opłaty.

Anulowanie, zwrot lub unieważnianie

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

  • Anuluj: 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ć anulowanie zgodnie z opisem w sekcji Anulowanie.
  • Zwrot środków: gdy zwrócisz środki, użytkownik może nadal korzystać z subskrypcji. Zwrotu środków można użyć, jeśli np. w wyniku wystąpienia błędu technicznego, który uniemożliwił użytkownikowi dostęp do produktu, ale został on już naprawiony. Pamiętaj, że jeśli chcesz zwrócić więcej niż ostatnią płatność lub dokonać częściowego zwrotu, musisz użyć Konsoli Google Play.
  • Anulowanie: gdy anulujesz subskrypcję, użytkownik natychmiast utraci do niej dostęp. Można go użyć, jeśli np. z powodu błędu technicznego, który uniemożliwił użytkownikowi dostęp do usługi, a użytkownik nie chce dalej z niej korzystać. Aplikacja powinna obsługiwać te anulowanie w sposób opisany w sekcji Wycofania.

W tabeli poniżej pokazujemy różnice między anulowaniem, zwrotem środków i unieważnieniem.

Zatrzymuje odnawianie Zwrot środków Unieważnianie dostępu
Anuluj Tak Nie Nie
Zwrot środków Nie Tak Nie
Unieważnij Tak Tak Tak

Odroczenie płatności za subskrybenta

W przypadku automatycznie odnawianego subskrybenta możesz przesunąć datę następnej płatności, używając interfejsu Purchases.subscriptions:defer z interfejsu Google Play Developer API. W tym czasie użytkownik subskrybuje Twoje treści z pełnym dostępem, ale nie jest obciążany opłatą. Data odnowienia subskrypcji zostanie zmieniona na nową.

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

Płatności odroczone umożliwiają:

  • Daj użytkownikom bezpłatny dostęp w ramach oferty specjalnej, np. dając tydzień bezpłatnie na zakup filmu.
  • Zapewnij klientom bezpłatny dostęp w ramach gestu reputacji.

Płatności można odroczyć maksymalnie o 1 dzień i maksymalnie 1 rok na wywołanie interfejsu API. Aby jeszcze bardziej odroczyć naliczanie opłat, możesz ponownie wywołać interfejs API, zanim nadejdzie nowa data rozliczenia.

Przykład: Darcy ma miesięczną subskrypcję treści online w aplikacji „Rybacki” W marcu wzięła udział w ankiecie online dla wydawcy aplikacji. Wydawca daje jej 6 bezpłatnych tygodni, odroczając kolejną płatność do 15 maja, czyli do 6 tygodni od zaplanowanej daty rozliczenia, czyli 1 kwietnia. Darcy nie płaci za kwiecień ani początek maja i nadal ma dostęp do treści. 15 maja zostanie naliczona standardowa opłata za subskrypcję w wysokości 1, 25 zł za ten miesiąc. Następna data odnowienia subskrypcji to 15 czerwca.

Możesz o tym poinformować użytkownika e-mailem lub w aplikacji, aby powiadomić go o zmianie daty płatności.

Obsługa odrzuconych płatności

W przypadku problemów z płatnościami z odnowieniem subskrypcji Google będzie okresowo próbować odnowić subskrypcję przez pewien czas, zanim ją anulujesz. Okres przywracania konta może się składać 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.

Po odrzuceniu płatności rozpoczyna się okres prolongaty, jeśli został skonfigurowany. W okresie prolongaty upewnij się, że użytkownik nadal ma dostęp do uprawnień w ramach subskrypcji.

Po zakończeniu okresu prolongaty rozpoczyna się okres zawieszenia konta. Gdy konto jest zawieszone, musisz sprawdzić, czy użytkownik nie ma 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 automatycznie odnawianego abonamentu podstawowego. Określenie długości krótszej niż domyślne może zmniejszyć liczbę subskrypcji przywracanych z odrzuconych płatności.

Aby zmaksymalizować prawdopodobieństwo odzyskania subskrypcji po odrzuceniu płatności, możesz poinformować użytkownika o problemie z płatnością i poprosić go o rozwiązanie problemu.

Możesz to zrobić samodzielnie, jak opisano w sekcjach dotyczących okresu prolongaty i zawieszenia konta, albo zaimplementować w aplikacji interfejs API do obsługi wiadomości, dzięki któremu Google będzie wyświetlać wiadomość użytkownikom Twojej aplikacji.

Wysyłanie wiadomości w aplikacji

Jeśli masz włączone wysyłanie wiadomości w aplikacji za pomocą konta InAppMessageCategoryId.TRANSACTIONAL, Google Play będzie raz dziennie wyświetlać użytkownikom wiadomości w okresie prolongaty i zawieszeniu konta oraz umożliwić im poprawienie płatności bez opuszczania aplikacji.

Pasek powiadomień informujący użytkownika o konieczności poprawienia płatności
Rysunek 20. Pasek powiadomień z informacją, że należy poprawić płatność.

Zalecamy wywoływanie tego interfejsu API za każdym razem, gdy użytkownik otwiera aplikację, aby określić, czy komunikat powinien się wyświetlić.

Jeśli użytkownik odzyskał subskrypcję, otrzymasz kod odpowiedzi SUBSCRIPTION_STATUS_UPDATED wraz z tokenem zakupu. Następnie użyj tego tokena zakupu do wywołania interfejsu Google Play Developer API i odświeżenia stanu subskrypcji w aplikacji.

Integracja wiadomości w aplikacji

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

Oto przykład aktywowania procesu wysyłania 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.
                }
            }
        });