1. Wprowadzenie
Z tego ćwiczenia dowiesz się, jak zarządzać zmianami w subskrypcjach za pomocą Biblioteki płatności w Google Play (PBL). Dowiesz się, jak różne tryby zastępowania wpływają na ceny i uprawnienia użytkowników, a także jak przetwarzać powiadomienia w czasie rzeczywistym dla deweloperów (RTDN) po stronie backendu.
Odbiorcy
To ćwiczenie jest przeznaczone dla programistów aplikacji na Androida i zawiera wskazówki dotyczące wdrażania zaawansowanych funkcji zarządzania subskrypcjami. Te wskazówki pomogą Ci zapewnić użytkownikom bezproblemową zmianę planu subskrypcji na wyższy lub niższy albo przejście na inny plan.
Czego się nauczysz...
- Jak tworzyć subskrypcje w Konsoli Play.
- Jak wybrać odpowiedni symbol
ReplacementMode(np.WITH_TIME_PRORATIONlubDEFERRED), aby był zgodny z zasadami uaktualniania i obniżania wersji aplikacji. - Jak skonfigurować
BillingFlowParamswlaunchBillingFlow, aby wywołać proces zakupu w Google Play w przypadku zastąpienia abonamentu. - Jak używać powiadomień w czasie rzeczywistym dla deweloperów (RTDN) i interfejsu
purchases.subscriptionsv2API, aby bezpiecznie cofać stary dostęp i przyznawać nowy dostęp w backendzie
Czego potrzebujesz
- Dostęp do Konsoli Google Play za pomocą konta dewelopera. Jeśli nie masz konta dewelopera, musisz utworzyć konto.
- Przykładowa aplikacja do tego ćwiczenia, którą możesz pobrać z GitHub.
- Android Studio
2. Tworzenie przykładowej aplikacji
W tym ćwiczeniu pokazujemy, jak wdrożyć zamianę subskrypcji w Bibliotece płatności w Google Play na przykładzie przykładowej aplikacji na Androida. Przykładowa aplikacja to w pełni funkcjonalna aplikacja na Androida z kompletnym kodem źródłowym, który pokazuje te aspekty:
- Integracja aplikacji z PBL
- Wdrażanie zastępowania subskrypcji
Jeśli znasz już zamianę subskrypcji i PBL, możesz pobrać przykładową aplikację i ją przetestować.
Poniższy film demonstracyjny pokazuje, jak będzie wyglądać i działać przykładowa aplikacja po wdrożeniu i uruchomieniu.
Wymagania wstępne
Zanim utworzysz i wdrożysz przykładową aplikację, wykonaj te czynności:
- Utwórz konto dewelopera w Konsoli Google Play. Jeśli masz już konto dewelopera, pomiń ten krok.
- Utwórz nową aplikację w Konsoli Play z włączonymi funkcjami zarabiania. Możesz też użyć istniejącej aplikacji w Konsoli Play. Jeśli funkcje zarabiania nie są włączone w Twojej aplikacji, wykonaj te czynności, aby je skonfigurować.
- Zainstaluj Android Studio.
Kompilacja
Aby skompilować przykładową aplikację zgodnie z wymaganiami tego ćwiczenia:
- Pobierz przykładową aplikację z GitHuba.
- Zaktualizuj
applicationIdwbuild.gradleprzykładowej aplikacji, aby odzwierciedlał identyfikator aplikacji w Konsoli Play. - Skompiluj aplikację przykładową.
Uwaga: dzięki temu aplikacja zostanie skompilowana do testów lokalnych. Uruchomienie aplikacji nie powoduje jednak pobrania produktów i cen, ponieważ wymagane subskrypcje nie zostały jeszcze utworzone w Konsoli Play. W następnej sekcji dowiesz się, jak tworzyć subskrypcje w Konsoli programisty.
3. Tworzenie subskrypcji w Konsoli Play
System subskrypcji w Google Play zapewnia elastyczność w sposobie tworzenia i sprzedawania subskrypcji, a także zarządzania nimi. W Konsoli Play możesz skonfigurować subskrypcje z wieloma abonamentami podstawowymi, z których każdy może zawierać wiele ofert. Oferty subskrypcji mogą mieć różne modele cenowe i kryteria kwalifikacji. W ramach tego ćwiczenia utworzysz 3 subskrypcje: abonament Premium, Basic Plan i Lite Plan, symulując typową ofertę subskrypcji w różnych pułapach cenowych. Każda z nich będzie miała 1 miesięczny abonament podstawowy odnawiany automatycznie.
Tworzenie nowej subskrypcji
Tworzenie nowej subskrypcji
- Otwórz Konsolę Play i wejdź na stronę Subskrypcje (Zarabianie w Google Play > Produkty > Subskrypcje).
- Kliknij Utwórz subskrypcję.
- Wpisz szczegóły subskrypcji:
- ProductID : wpisz unikalny identyfikator produktu. Wpisz
premium_plan. - Nazwa : wpisz krótką nazwę subskrypcji. Przykład:
Premium Plan
- ProductID : wpisz unikalny identyfikator produktu. Wpisz
- Kliknij Utwórz.
Tworzenie abonamentu Base Plan
- Otwórz Konsolę Play i wejdź na stronę Subskrypcje (Zarabianie w Google Play > Produkty > Subskrypcje).
- Obok subskrypcji, w której chcesz utworzyć abonament podstawowy, kliknij strzałkę w prawo, aby wyświetlić szczegóły.
- Kliknij Dodaj abonament podstawowy.
- Wpisz identyfikator abonamentu podstawowego. Przykład
monthly-auto-renewing. - Wybierz typ Odnowienie automatyczne.
- W przypadku abonamentu podstawowego odnawianego automatycznie ustaw te parametry:
- Okres rozliczeniowy: miesięczny.
- Okres prolongaty: 7 dni.
- Zmiany abonamentu i oferty: Obciążenie w dniu płatności.
- Wznowienie subskrypcji: Zezwól.
- W sekcji Cena i dostępność kliknij Ustaw ceny, aby ustawić cenę abonamentu podstawowego.
- Wybierz wszystkie kraje i regiony, a następnie kliknij Ustaw cenę.
- Ustaw cenę tego abonamentu podstawowego na 10 zł i kliknij Aktualizuj.
- Po ustawieniu ceny abonamentu podstawowego w prawym dolnym rogu kliknij Zapisz, a potem Aktywuj.
Tworzenie subskrypcji dla przykładowej aplikacji
Na potrzeby tego laboratorium utwórz 2 dodatkowe subskrypcje o tej konfiguracji:
- Abonament Basic Plan
- Identyfikator produktu: basic_plan
- Nazwa: Basic Plan
- Identyfikator abonamentu podstawowego: monthly-auto-renewing
- Cena: 5 PLN
- Abonament Lite
- Identyfikator produktu: lite_plan
- Nazwa: Pakiet Lite
- Identyfikator abonamentu podstawowego: monthly-auto-renewing
- Cena: 3 zł
Przykładowa aplikacja jest skonfigurowana tak, aby używać tych identyfikatorów produktów i abonamentów podstawowych. Możesz utworzyć różne subskrypcje o różnych konfiguracjach. W takim przypadku musisz zmodyfikować przykładową aplikację, aby używała utworzonego identyfikatora produktu.
Film o tworzeniu subskrypcji
W tym filmie pokazujemy opisane wcześniej czynności, które należy wykonać, aby utworzyć subskrypcję w Konsoli Play.
4. Zastępowanie subskrypcji
Deweloperzy integrujący się z PBL mogą udostępniać obecnym subskrybentom różne opcje zmiany abonamentu, aby lepiej dopasować go do ich potrzeb:
- Jeśli sprzedajesz kilka poziomów subskrypcji, np. podstawową i premium, możesz umożliwić użytkownikom zmianę poziomu przez zakup abonamentu podstawowego lub oferty innej subskrypcji.
- 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.
Gdy użytkownicy zdecydują się na przejście na wyższą lub niższą wersję subskrypcji albo na zmianę subskrypcji, możesz określić tryb zastępowania, który określa, jak zostanie zastosowana proporcjonalna wartość bieżącego okresu rozliczeniowego i kiedy nastąpi zmiana uprawnień użytkowników.
Biblioteka płatności w Play udostępnia kilka opcji ReplacementMode, które pozwalają kontrolować to zachowanie.
Dostępne tryby zastępowania
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 poprzez zmianę daty następnej płatności. Jest to zachowanie domyślne.CHARGE_PRORATED_PRICE: subskrypcja zostanie natychmiast przeniesiona na wyższy abonament, a cykl rozliczeniowy pozostanie bez zmian. Różnica w cenie za pozostały okres zostanie następnie obciążona użytkownikowi.CHARGE_FULL_PRICE: subskrypcja zostanie natychmiast uaktualniona lub obniżona, a użytkownik zostanie od razu obciążony pełną ceną za nowe uprawnienia. Pozostała wartość z poprzedniej subskrypcji jest przenoszona na ten sam uprawnienie lub proporcjonalnie rozdzielana w przypadku przejścia na inne uprawnienie.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.DEFERRED: subskrypcja jest przenoszona na wyższą lub niższą wersję tylko w momencie odnowienia.
5. WITH_TIME_PRORATION
W tym trybie wymiany subskrypcja jest od razu przenoszona na wyższą lub niższą wersję. Pozostały czas zostanie skorygowany 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.
Przykład
Użytkownik przechodzi z abonamentu Basic (4,99 USD miesięcznie) na abonament Premium (9,99 USD miesięcznie) 15 kwietnia, czyli w połowie miesięcznego cyklu rozliczeniowego.
W tym scenariuszu:
- Użytkownik natychmiast uzyskuje dostęp do planu Premium.
- Google Play automatycznie oblicza okres proporcjonalny. Jeśli na przykład Play obliczy, że pozostałe 15 dni abonamentu Basic jest warte 7 dni abonamentu Premium, następna data płatności zostanie przesunięta na 21 kwietnia.
- Użytkownik nie musi od razu dokonywać płatności.
Fragment kodu
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Uaktualnienie z WITH_TIME_PRORATION
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na abonament Premium.
Użytkownik natychmiast uzyska dostęp do subskrypcji Premium. Kwota do natychmiastowej zapłaty przez użytkownika wynosi 0,00 USD. Pozostała wartość abonamentu Basic jest proporcjonalnie przeliczana na czas trwania abonamentu Premium, co powoduje przesunięcie daty kolejnego odnowienia. W nowo dostosowanym terminie płatności użytkownik zostanie obciążony kwotą odnowienia w wysokości 9,99 PLN.
Obniżenie wersji z WITH_TIME_PRORATION
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na pakiet Lite.
Uprawnienia użytkownika zostaną natychmiast obniżone do wersji Lite. Kwota do natychmiastowej zapłaty wynosi 0,00 USD. Pozostała wartość abonamentu Basic jest proporcjonalnie przeliczana na czas trwania abonamentu Lite, co znacznie wydłuża datę kolejnego odnowienia. W nowo dostosowanym terminie płatności użytkownik zostanie obciążony kwotą odnowienia w wysokości 2,99 PLN.
Podsumowanie
W tej sekcji dowiesz się, jak WITH_TIME_PRORATION modyfikuje uprawnienia użytkowników bez natychmiastowego obciążania ich kosztami, dostosowując czas do następnego odnowienia na podstawie różnicy w cenie. Jest to skuteczna strategia domyślna, która umożliwia przejście na wyższą lub niższą wersję subskrypcji.
6. CHARGE_PRORATED_PRICE
W tym trybie wymiany subskrypcja jest natychmiast uaktualniana, a cykl rozliczeniowy pozostaje bez zmian. Różnica w cenie za pozostały okres zostanie następnie obciążona użytkownikowi.
Uwaga: ta opcja jest dostępna tylko w przypadku uaktualnienia produktu subskrypcyjnego, w którym cena za jednostkę czasu wzrasta.
Przykład
Użytkownik korzystający z abonamentu Basic (4,99 USD miesięcznie) postanawia przejść na abonament Premium (9,99 USD miesięcznie) 20 kwietnia, gdy do końca miesięcznego cyklu rozliczeniowego pozostało około 10 dni.
W tym scenariuszu:
- Użytkownik natychmiast uzyskuje dostęp do planu Premium.
- Od użytkownika zostanie natychmiast pobrana proporcjonalna opłata za pozostałe 10 dni bieżącego cyklu rozliczeniowego. To około 2,99 PLN, czyli 10 dni subskrypcji Premium.
- Data rozliczenia użytkownika nie ulegnie zmianie.
Fragment kodu
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Przejście na wyższą wersję z opłatą CHARGE_PRORATED_PRICE
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na abonament Premium.
Użytkownik od razu przechodzi na abonament Premium, zachowując pierwotną datę odnowienia. Kwota do zapłaty od razu to proporcjonalna różnica między cenami planów Premium i Basic za pozostałe dni bieżącego cyklu. W dniu odnowienia użytkownik zostanie obciążony pełną kwotą odnowienia subskrypcji Premium w wysokości 9, 99 PLN.
Obniżenie wersji z opłatą CHARGE_PRORATED_PRICE
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na pakiet Lite.
Ten tryb wymiany powoduje błąd podczas obniżania wersji, ponieważ jest dostępny tylko w przypadku uaktualnień subskrypcji, w których cena za jednostkę czasu wzrasta. Proces płatności zakończy się niepowodzeniem i wyświetli użytkownikowi błąd informujący, że tryb proporcjonalnego rozliczenia nie jest obsługiwany w przypadku przejścia na niższą wersję.
Podsumowanie
W tej sekcji wyjaśniliśmy, jak CHARGE_PRORATED_PRICE umożliwia natychmiastowe uaktualnienie subskrypcji przez naliczanie użytkownikom dokładnej różnicy w cenie za pozostały okres rozliczeniowy przy zachowaniu cyklu rozliczeniowego. Jest to przydatne, gdy użytkownik chce przejść na droższy pakiet bez zmiany daty rozliczenia.
7. CHARGE_FULL_PRICE
W tym trybie wymiany subskrypcja jest natychmiast uaktualniana lub obniżana, a użytkownik od razu płaci pełną cenę za nowe uprawnienie. Pozostała wartość z poprzedniej subskrypcji jest przenoszona na ten sam uprawnienie lub proporcjonalnie rozdzielana w przypadku przejścia na inne uprawnienie.
Przykład
Użytkownik korzysta z abonamentu Basic (4,99 USD miesięcznie od 1 kwietnia). 20 kwietnia użytkownik chce przejść na abonament Premium (9, 99 zł miesięcznie).
W tym scenariuszu:
- Od użytkownika od razu zostanie pobrana pełna cena abonamentu Premium (9,99 zł).
- Pozostała wartość abonamentu Basic (np. 10 dni) jest przeliczana na równoważny czas w abonamencie Premium. W tym przykładzie 10 dni w wersji Basic odpowiada 5 dniom w wersji Premium.
- Następna data odnowienia subskrypcji użytkownika zostanie dostosowana tak, aby uwzględniała ten proporcjonalny czas. Data odnowienia to 25 maja (20 kwietnia + 1 miesiąc + 5 dni).
- Kolejne odnowienia będą następować co miesiąc, począwszy od 25 maja.
Fragment kodu
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Uaktualnienie z opłatą CHARGE_FULL_PRICE
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na abonament Premium.
Użytkownik od razu przejdzie na subskrypcję Premium. Kwota do zapłaty od razu to pełna cena subskrypcji Premium – 9,99 USD. Pozostała wartość abonamentu Basic zostanie przekonwertowana na czas w ramach nowego abonamentu Premium, co nieznacznie wydłuży okres do pierwszej daty odnowienia. Potem kwota odnowienia będzie wynosić 9, 99 PLN za cykl.
Przejście na niższą wersję z opłatą CHARGE_FULL_PRICE
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na pakiet Lite.
Użytkownik od razu przechodzi na pakiet Lite i rozpoczyna się nowy cykl rozliczeniowy. Kwota do zapłaty od razu to pełna cena docelowa w wysokości 2,99 PLN. Niewykorzystana część pakietu podstawowego zostanie proporcjonalnie przeliczona na czas w ramach nowego planu Lite, co spowoduje przesunięcie pierwszej daty odnowienia. Po tym czasie opłata za odnowienie będzie wynosić 2, 99 PLN za cykl.
Podsumowanie
W tej sekcji wyjaśniliśmy, jak CHARGE_FULL_PRICE obciąża użytkownika pełną kwotą w dniu przejścia na wyższy pakiet, natychmiast rozpoczynając nowy cykl rozliczeniowy. Pozostałe saldo z poprzedniego abonamentu zostanie proporcjonalnie zastosowane do następnej daty odnowienia.
8. WITHOUT_PRORATION
W tym trybie zamiany subskrypcja zostanie natychmiast zmieniona na wyższą lub niższą wersję, a nowa cena zostanie naliczona w momencie odnowienia subskrypcji.
Przykład
Użytkownik korzysta z abonamentu Basic (4,99 USD miesięcznie od 1 kwietnia). 20 kwietnia użytkownik chce przejść na abonament Premium (9, 99 zł miesięcznie).
W tym scenariuszu:
- Użytkownik natychmiast uzyskuje dostęp do planu Premium.
- Użytkownik nie musi płacić wyższej ceny (9,99 USD) do następnego odnowienia subskrypcji (1 maja).
Fragment kodu
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Uaktualnienie z WITHOUT_PRORATION
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na abonament Premium.
Użytkownik od razu przechodzi na abonament Premium, zachowując dotychczasową datę odnowienia. Kwota do natychmiastowej zapłaty wynosi 0,00 USD. Użytkownik ma dostęp do abonamentu Premium przez pozostały czas w danym cyklu, a następnie w dniu kolejnego rozliczenia przechodzi na nową kwotę odnowienia w wysokości 9,99 PLN.
Obniżenie wersji bez zwrotu środków
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na pakiet Lite.
Użytkownik natychmiast przechodzi na plan Lite i traci dostęp do funkcji Basic, za które zapłacił. Kwota do natychmiastowej zapłaty wynosi 0,00 USD. Cykl rozliczeniowy pozostanie bez zmian, a użytkownik zapłaci nową, niższą stawkę w wysokości 2,99 PLN przy kolejnym odnowieniu subskrypcji.
Podsumowanie
W tej sekcji pokazaliśmy, jak WITHOUT_PRORATION natychmiastowo zamienia uprawnienia użytkownika bez opłaty za realizację transakcji, pozostawiając cykl rozliczeniowy bez zmian.
9. ODROCZONE
W tym trybie wymiany subskrypcja jest uaktualniana do wyższej lub niższej wersji tylko w momencie odnowienia, ale nowy zakup jest realizowany natychmiast. Obecny produkt zostanie ustawiony jako nieodnawialny i wygasa na koniec bieżącego cyklu rozliczeniowego, a nowo zamówione uprawnienie zacznie obowiązywać od razu po tym.
Przykład
Użytkownik korzysta z abonamentu Basic (4,99 USD miesięcznie od 1 kwietnia). 20 kwietnia użytkownik chce przejść na abonament Premium (9, 99 zł miesięcznie).
W tym scenariuszu:
- Użytkownik nie ponosi natychmiastowej opłaty.
- Użytkownik nadal korzysta z funkcji Basic do końca bieżącego cyklu rozliczeniowego (30 kwietnia).
- W dniu następnego odnowienia (1 maja) subskrypcja automatycznie przejdzie na Premium.
Fragment kodu
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.DEFERRED;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
Przejście na wyższy pakiet z odroczoną płatnością
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.DEFERRED. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na abonament Premium.
Użytkownik pozostanie w abonamencie Basic do końca bieżącego cyklu rozliczeniowego. Kwota do natychmiastowej zapłaty wynosi 0,00 USD. W dniu odnowienia subskrypcji ich uprawnienia zostaną uaktualnione do pakietu Premium, a oni zostaną obciążeni nową kwotą odnowienia w wysokości 9,99 USD.
Przejście na niższą wersję z ODROCZONYM
Aby zasymulować ten scenariusz:
- W
MainActivityprzykładowej aplikacji zmieńreplacementModewe fragmencie kodu naSubscriptionProductReplacementParams.ReplacementMode.DEFERRED. - Przebuduj i uruchom aplikację.
- Anuluj istniejące subskrypcje (jeśli takie masz) w Sklepie Google Play. Wygasną one.
- Kup abonament Basic.
- Przejdź na pakiet Lite.
Użytkownik pozostanie w abonamencie Basic do końca bieżącego cyklu rozliczeniowego. Kwota do natychmiastowej zapłaty wynosi 0,00 USD. W dniu odnowienia subskrypcji ich uprawnienia zostaną uaktualnione do pakietu Lite, a oni zostaną obciążeni nową kwotą odnowienia w wysokości 2,99 USD.
Podsumowanie
W tej sekcji wyjaśniliśmy, jak tryb zastępowania DEFERRED odracza uaktualnienie lub obniżenie wersji do końca płatnego okresu aktywnego użytkownika. Dlatego jest to szczególnie przydatne w przypadku obniżania wersji, aby nie utracić już kupionych funkcji.
10. Przetwarzanie po stronie backendu i klienta
Gdy użytkownik skutecznie zastąpi subskrypcję, upewnij się, że zarówno aplikacja, jak i backend prawidłowo obsługują tę zmianę, aby uniknąć problemów, takich jak przerwy w działaniu usługi lub podwójne obciążenie.
Przykładowy scenariusz
- Użytkownik ma abonament miesięczny Basic (product_id
basic_plani purchase_tokenbasic_purchase_token_123). - Użytkownik przechodzi na pakiet Premium w trybie natychmiastowej zamiany (jeden z tych trybów:
WITHOUT_PRORATION,WITH_TIME_PRORATION,CHARGE_PRORATED_PRICE,CHARGE_FULL_PRICE). - Po pomyślnym przełączeniu subskrypcji Google traktuje ją jako NOWĄ i tworzy nowy, inny token zakupu pakietu Premium (product_id
premium_plani purchase_tokenpremium_purchase_token_123).
Przetwarzanie po stronie klienta
onPurchasesUpdated
Gdy zakup zamienny zostanie sfinalizowany, wywoływane jest zdarzenie PurchasesUpdatedListener. Mimo że była to zmiana, Google Play traktuje pakiet Premium jako nowy zakup.
Aplikacja otrzyma obiekt Purchase zawierający premium_purchase_token_123 token zakupu i identyfikator produktu premium_plan. Musisz traktować to dokładnie tak samo jak nowego subskrybenta: zweryfikować token i przygotować się do przyznania dostępu.
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
// purchase.getPurchaseToken() = premium_purchase_token_123
// purchase.getProducts() will contain premium_plan
// Verify the purchase and grant entitlement
handleNewPurchase(purchase);
}
}
}
queryPurchasesAsync
queryPurchasesAsync zwraca tylko aktywne subskrypcje kupione w Twojej aplikacji. Na tej podstawie możesz określić, które uprawnienie wyświetlić użytkownikowi. W przypadku natychmiastowej wymiany queryPurchasesAsync() przestanie zwracać stary token zakupu BASIC i będzie zwracać tylko nowy token zakupu PREMIUM.
Wywołuj tę metodę za każdym razem, gdy aplikacja zostanie wznowiona lub gdy zakończy się zakup. Jeśli token Premium jest obecny, natychmiast przyznaj funkcje Premium i usuń funkcje podstawowe.
Przetwarzanie na serwerze (RTDN)
Gdy nastąpi wymiana, Google Play wyśle powiadomienie dla deweloperów w czasie rzeczywistym (RTDN) do skonfigurowanego tematu Pub/Sub.
- W przypadku natychmiastowej wymiany Google wysyła
SUBSCRIPTION_PURCHASEDRTDN z nowym tokenem zakupu.Przykładowy ładunek RTDN{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - Gdy serwer otrzyma z RTDN nowy token zakupu, wywołaj interfejs API
purchases.subscriptionsV2z nowym tokenem zakupu, aby pobrać szczegóły zakupu. Odpowiedź interfejsu API zawiera polelinkedPurchaseToken, które służy do określania, czy token zakupu odnosi się do nowego zakupu subskrypcji, czy do zastąpienia subskrypcji. - W przypadku wymiany subskrypcji
linkedPurchaseTokenodnosi się do tokena zakupu starej subskrypcji. W tym przypadku będzie tobasic_purchase_token_123.PrzykładowaGET purchases.subscriptionsV2odpowiedźcurl \ 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications/<application_id>/purchases/subscriptionsv2/tokens/premium_purchase_token_123' \ --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \ --header 'Accept: application/json' { "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "...", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", // The purchase token of the subscription that was replaced (Basic Plan in this case) "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // productID of the new subscription (Premium Plan in this case) "expiryTime": "....", "autoRenewingPlan": {...}, "offerDetails": { "basePlanId": "monthly-auto-renewing" // base plan ID of the new subscription }, "itemReplacement": { // Details about the subscription replacement "productId": "subscription_basic", // productID of the old subscription (Basic Plan in this case) "replacementMode": "CHARGE_PRORATED_PRICE", // Replacement strategy used for this subscription change "basePlanId": "monthly-auto-renewing" // base plan ID of the old subscription }, "offerPhase": {...} } ], "etag": "<etag_value>" } - Musisz potwierdzić zakup nowej subskrypcji Premium. Możesz to zrobić w aplikacji lub na serwerze backendu. Jeśli w ciągu 3 dni nie potwierdzisz zakupu, otrzymasz zwrot środków, a uprawnienia zostaną cofnięte. Więcej informacji o przetwarzaniu i potwierdzaniu zakupów znajdziesz w dokumentacji dla deweloperów.
Podsumowanie
W tej sekcji omówiliśmy kroki obsługi natychmiastowej wymiany subskrypcji zarówno po stronie klienta, jak i na Twoim backendzie. Dowiedziałeś się, że Google Play traktuje nowy pakiet jako zupełnie nowy zakup i wydaje nowy token zakupu. Po stronie klienta musisz przetworzyć ten nowy zakup za pomocą funkcji PurchasesUpdatedListener i zaktualizować uprawnienia na podstawie odpowiedzi z queryPurchasesAsync. W backendzie musisz nasłuchiwać SUBSCRIPTION_PURCHASED RTDN dla nowego tokena, używać interfejsu purchases.subscriptionsv2 API, aby zidentyfikować linkedPurchaseToken starej subskrypcji, i natychmiast cofnąć dostęp powiązany ze starym tokenem, przyznając jednocześnie nowe uprawnienia. Pamiętaj, aby zawsze potwierdzać nowy zakup.
11. Przetwarzanie odroczonych wymian
W przeciwieństwie do trybów natychmiastowej wymiany ReplacementMode.DEFERRED odracza zmianę subskrypcji i aktualizację uprawnień do końca bieżącego cyklu rozliczeniowego. Obsługa odroczonych wymian wymaga specjalnej logiki, aby zapewnić użytkownikom odpowiednie uprawnienia we właściwym czasie.
Przykładowy scenariusz
- Użytkownik ma podstawowy abonament miesięczny (product_id
basic_plani purchase_tokenbasic_purchase_token_123), który odnawia się 15 kwietnia. - 1 kwietnia użytkownik decyduje się przejść na abonament Premium, korzystając z
ReplacementMode.DEFERRED. - Google natychmiast tworzy NOWY token zakupu dla pakietu Premium (product_id
premium_plani purchase_tokenpremium_purchase_123), ale kwota do obciążenia użytkownika i uprawnienia są zaplanowane na 15 kwietnia.
Przetwarzanie odroczonej wymiany
1. Bezpośrednio po zakończeniu procesu zakupu (aplikacja)
- Funkcja
PurchasesUpdatedListenerjest wywoływana po zakończeniu procesu zakupu. Aplikacja otrzyma obiektPurchasezawierający nowy token zakupupremium_purchase_token_123, ale identyfikator produktu będzie nadal odnosić się do staregobasic_plan, ponieważ użytkownik ma uprawnienia tylko do abonamentu Basic. Musisz potraktować to dokładnie tak samo jak nowy zakup i potwierdzić token.@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { // purchase.getPurchaseToken() = premium_purchase_token_123 // purchase.getProducts() will contain basic_plan // Verify and acknowledge the purchase handleNewPurchase(purchase); } } } queryPurchasesAsynczwraca zakup z nowym tokenem zakupu (premium_purchase_token_123) od razu, a także powiązane z nim pierwotne uprawnienie (basic_plan). Możesz na tym polegać, aby nadal przyznawać użytkownikowi uprawnienia do abonamentu Basic.
2. Bezpośrednio po zakończeniu procesu zakupu (backend)
- SUBSCRIPTION_PURCHASED RTDN jest wysyłane natychmiast po zakończeniu procesu zakupu nowego tokena zakupu (
premium_purchase_token_123).Przykładowy ładunek RTDN{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - Wywołaj interfejs
GET purchases.subscriptionsv2z nowym tokenem zakupu, aby pobrać szczegóły zakupu. Odpowiedź zawiera 2 elementy zamówienia.- Jedna reprezentuje starą subskrypcję (abonament podstawowy) i ma datę
expiryTimew przyszłości. Stara subskrypcja nie zostanie odnowiona i będzie zawieraćdeferredItemReplacementz nową subskrypcją (abonamentem premium). Oznacza to oczekujące zastąpienie starego uprawnienia po jego wygaśnięciu. - Jedna z nich będzie reprezentować nowo kupioną subskrypcję. Nie ma ustawionej wartości „expiryTime”.
{ "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "2026-05-07T15:50:11.383Z", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // Premium Plan has no expiry time "autoRenewingPlan": {...}, "offerDetails": {...}, "itemReplacement": {. // Subscription replacement details "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {} }, { "productId": "basic_plan", // Subscription to be replaced "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time in the future "autoRenewingPlan": {}, "offerDetails": {...}, "deferredItemReplacement": { // identifier indicating this subscription will be replaced upon renewal "productId": "subscription_premium" }, "latestSuccessfulOrderId": "GPA.<order_id>", "itemReplacement": {...}, } ], "etag": "<etag>" } - Jedna reprezentuje starą subskrypcję (abonament podstawowy) i ma datę
- Musisz potwierdzić nowy token zakupu. Możesz to zrobić w aplikacji lub na serwerze backendu. Więcej informacji o przetwarzaniu i potwierdzaniu zakupów znajdziesz w dokumentacji dla deweloperów.
- SUBSCRIPTION_EXPIRED RTDN jest wysyłany w przypadku starego tokena zakupu (
basic_purchase_token_123).Przykładowy ładunek RTDN{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":13, // SUBSCRIPTION_EXPIRED "purchaseToken":"basic_purchase_token_123" //purchase token for the old subscription } } - Podczas wywoływania interfejsu
GET purchases.subscriptionsv2API ze starym tokenem zakupu pojawia się on jako wygasły (SUBSCRIPTION_STATE_EXPIRED). Uprawnienie do starego abonamentu jest przenoszone na nowy zakup na pozostały czas.
3. W dniu wymiany – pierwsze odnowienie po procesie zakupu (aplikacja)
queryPurchasesAsynczwraca zakup z nowym tokenem zakupu (premium_purchase_token_123) i nową subskrypcją z nim powiązaną (premium_plan).- Nowy zakup powinien zostać przetworzony już po zakończeniu procesu zakupu. Nie musisz podejmować żadnych specjalnych działań poza upewnieniem się, że użytkownik ma dostęp do odpowiedniej subskrypcji.
4. W dniu wymiany – pierwsze odnowienie po procesie zakupu (backend)
- W przypadku
ReplacementMode.DEFERREDpierwsze odnowienia są zgodne ze standardowym działaniem każdego innego odnowienia, które przetwarzaSUBSCRIPTION_RENEWEDRTDN. W takiej sytuacji nie musisz stosować żadnej specjalnej logiki zastępowania. - Wywołaj interfejs
GET purchases.subscriptionsv2z nowym tokenem zakupu, aby pobrać szczegóły zakupu. Odpowiedź zawiera 2 elementy zamówienia.- Jedna z nich reprezentuje starą subskrypcję (abonament podstawowy) i ma datę
expiryTimew przeszłości. Stara subskrypcja nie będzie już miała ustawionej wartości w poludeferredItemReplacement. - Jedna z nich reprezentuje nową subskrypcję z datą
expiryTimew przyszłości, a poleautoRenewEnabledma wartośćtrue.
{ "kind": "androidpublisher#subscriptionPurchaseV2", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>..0", "linkedPurchaseToken": "basic_purchase_token_123", // purchase token of the old subscription "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // New subscription "expiryTime": "2026-05-07T16:00:09.437Z", // Expiry time set in the future "autoRenewingPlan": { "autoRenewEnabled": true, // Auto Renewing Flag set to True "recurringPrice": {...} }, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {. // Details of the subscription replacement "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {...} }, { "productId": "basic_plan", // Old subscription, Does not contains the deferredItemReplacement field "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time set in the past "autoRenewingPlan": {}, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {...}, } ], "etag": "<etag>" } - Jedna z nich reprezentuje starą subskrypcję (abonament podstawowy) i ma datę
Podsumowanie
W tej sekcji opisano unikalne postępowanie wymagane w przypadku ReplacementMode.DEFERRED. Dowiedziałeś się, że w przeciwieństwie do trybów natychmiastowych zmiana uprawnień następuje dopiero na koniec bieżącego cyklu rozliczeniowego. W tej sekcji omówiliśmy niezbędne kroki, które należy wykonać w aplikacji i backendzie, aby prawidłowo przetworzyć pierwszy zakup, potwierdzić nowy token i zarządzać przełączaniem uprawnień, gdy wygaśnie stara subskrypcja i aktywuje się nowa.
12. Środowisko testowe do zastępowania subskrypcji
Funkcja Replacement Playground w przykładowej aplikacji umożliwia testowanie przejść na wyższą i niższą wersję subskrypcji w przypadku produktów subskrypcyjnych skonfigurowanych na koncie w Konsoli Google Play. W tej sekcji opisaliśmy, jak korzystać z funkcji Replacement Playground.
Konfiguracja
Aby korzystać z funkcji Playground zamienny, upewnij się, że:
packageIdw plikubuild.gradlejest zgodny z aplikacją skonfigurowaną w Konsoli Google Play.- Konto użytkownika testowego jest zarejestrowane jako tester licencji w Konsoli Google Play. Więcej informacji o testowaniu licencji znajdziesz w artykule Testowanie implementacji płatności w aplikacji.
Środowisko testowe do zastępowania subskrypcji
Przykładowa aplikacja zawiera kartę Replacement Playground, która umożliwia symulowanie zmian subskrypcji. Możesz wysyłać zapytania dotyczące subskrypcji zdefiniowanych w Konsoli Play i testować przełączanie się między nimi za pomocą różnych trybów zastępowania. W tym środowisku możesz sprawdzić, jak różne tryby wpływają na cykle rozliczeniowe i uprawnienia w przypadku subskrypcji, dzięki czemu możesz określić, które opcje najlepiej odpowiadają potrzebom Twojej firmy.
Aby symulować zamiany za pomocą narzędzia, wykonaj te czynności:
- Otwórz kartę Playground (Piaskownica).
- Jeśli masz aktywną subskrypcję: będzie ona wyróżniona. To subskrypcja, która zostanie zastąpiona.

- Jeśli nie masz aktywnej subskrypcji: musisz najpierw ją kupić.
- W sekcji Playground domyślnie wyświetlają się plany Basic, Premium i Lite utworzone na potrzeby tego kursu.
- Aby przetestować inne plany skonfigurowane w Konsoli Play, kliknij Dodaj plan niestandardowy i wyszukaj według
productIdibasePlanId. - Kup wybraną subskrypcję.
- Powinna się teraz wyświetlać nowo zakupiona aktywna subskrypcja użytkownika.

- Wybierz subskrypcję docelową, na którą użytkownik chce przejść .
- Wybierz tryb zastępowania przejścia.

- Aby zasymulować zastąpienie subskrypcji, kliknij przycisk Test Replacement (Testuj zastąpienie).
- Powinna się wyświetlić plansza dolna Płatności w Google Play z obliczonymi szczegółami zastąpienia subskrypcji (np. natychmiastowymi opłatami i dostosowaniami cyklu rozliczeniowego).

- Dokończ transakcję.
- Otwórz stronę Zarządzaj subskrypcjami w aplikacji Sklep Play, aby wyświetlić zmiany w aktywnej subskrypcji wraz ze szczegółami dotyczącymi zaktualizowanych dat odnowienia i cen.

13. Dalsze kroki
- Dowiedz się, jak optymalnie wykorzystać integrację z usługą Płatności w Google Play.
- Gdy użytkownicy zaczną kupować te produkty, pamiętaj, aby postępować zgodnie ze sprawdzonymi metodami weryfikacji i przetwarzania zakupów na bezpiecznym backendzie.
Dokumentacja
14. Gratulacje
Gratulacje! Zaimplementowano zamianę subskrypcji z różnymi trybami proporcjonalnego rozliczania i skonfigurowano obsługę przejść między planami na backendzie.
Czego się dowiedziałeś(-aś)
- Jak skonfigurować
SubscriptionProductReplacementParamsz określonymi trybami zastępowania. - Różnica między natychmiastowym przejściem na wyższy poziom a odroczonym przejściem na niższy poziom.
- Jak wycofać stare tokeny subskrypcji za pomocą
linkedPurchaseTokenprzy użyciu RTDN.
Ankieta
Twoja opinia na temat tego ćwiczenia w Codelabs jest dla nas bardzo cenna. Poświęć kilka minut na wypełnienie naszej ankiety.