Z tego tematu dowiesz się, jak obsługiwać zdarzenia cyklu życia subskrypcji, takie jak odnowienie i wygaśnięcie. Dowiesz się z niego też o dodatkowych funkcjach subskrypcji, takich jak oferowanie promocji i umożliwienie użytkownikom zarządzania własnymi subskrypcjami.
Jeśli nie masz skonfigurowanych produktów subskrypcyjnych dla aplikacji, zapoznaj się z artykułem Tworzenie i konfigurowanie produktów.
Przegląd subskrypcji
Subskrypcja to zbiór korzyści, do których użytkownicy mają dostęp w określonym okresie. Subskrypcja może na przykład uprawniać użytkownika do korzystania z usługi strumieniowania muzyki.
W ramach tej samej aplikacji możesz mieć wiele subskrypcji, które reprezentują różne zestawy korzyści lub różne poziomy jednego zestawu korzyści (np. poziomy „Srebrny” i „Złoty”).
Korzystając z abonamentów podstawowych i ofert, możesz tworzyć wiele konfiguracji tej samej subskrypcji. Możesz na przykład utworzyć ofertę dla użytkowników, którzy nigdy nie subskrybowali Twojej aplikacji. Podobnie możesz utworzyć ofertę przejścia na wyższy poziom subskrypcji dla użytkowników, którzy już ją subskrybują.
Szczegółowy przegląd usług subskrypcji, planów podstawowych i ofert znajdziesz w dokumentacji w Centrum pomocy Konsoli Play.
Integracja abonamentów przedpłaconych
Abonamenty przedpłacone nie odnawiają się automatycznie po wygaśnięciu. Aby przedłużyć abonament bez przerwy, użytkownik musi doładować abonament przedpłacony dla tego samego abonamentu.
W przypadku doładowań uruchom proces płatności tak, jak w przypadku pierwotnego zakupu. Nie musisz wskazywać, że zakup jest doładowaniem.
Doładowania abonamentu przedpłaconego zawsze używają trybu zastępowania CHARGE_FULL_PRICE
. Nie musisz go wyraźnie ustawiać.
Użytkownik jest natychmiast obciążany opłatą za pełny okres rozliczeniowy, a jego uprawnienia są przedłużane o czas określony w ramach doładowania.
Po doładowaniu pola w obiekcie Purchase
wyników są aktualizowane, aby odzwierciedlać najnowsze doładowanie:
- 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
Podobnie jak w przypadku subskrypcji z automatycznym odnawianiem, abonamenty przedpłacone musisz zaakceptować po zakupie. 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 trwania subskrypcji przedpłaconych ważne jest, aby jak najszybciej potwierdzić zakup.
Abonamenty przedpłacone o długości co najmniej tygodnia muszą zostać zatwierdzone w ciągu 3 dni.
Abonamenty przedpłacone o krótszym czasie trwania niż tydzień muszą zostać zaakceptowane w ciągu połowy 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 wielu ratach w określonym czasie, a nie płacą całej opłaty z góry.
Dodatkowe kwestie dotyczące subskrypcji ratalnych:
- Dostępność w poszczególnych krajach: funkcja subskrypcji ratalnych jest dostępna tylko w Brazylii, Francji, Hiszpanii i Włoszech (aby sprawdzić najnowszą dostępność, otwórz konsolę).
- Ustawianie ceny: podczas ustawiania ceny subskrypcji ratalnej w Konsoli cena reprezentuje miesięczną kwotę płatności. Połączenie tej kwoty z określonym okresem zobowiązania generuje łączną kwotę abonamentu na ekranie zakupu.
- Okres zobowiązania: łączny czas trwania początkowego zobowiązania subskrypcyjnego, w którym wymagane są płatności miesięczne. Jeśli na przykład abonament podstawowy ma okres zobowiązania wynoszący 15 miesięcy, użytkownik dokona 15 comiesięcznych płatności w tym okresie.
- Odnowienia: w kontekście subskrypcji ratalnych „odnowienie” oznacza zakończenie okresu zobowiązania, zarówno początkowego, jak i kolejnych. Po początkowej rejestracji pierwsze odnowienie następuje po zakończeniu całego początkowego okresu zobowiązania. Kolejne odnowienia odbywają się po zakończeniu każdego kolejnego okresu zobowiązania. Typy odnowień abonamentów z ratami to „automatyczne odnawianie co miesiąc” lub „automatyczne odnowienie na ten sam okres”. W przypadku „automatycznego odnawiania co miesiąc” nie ma kolejnego zobowiązania, a abonament działa jak subskrypcja miesięczna, w której każda płatność miesięczna stanowi odnowienie.
- Okres rozliczeniowy: w kontekście subskrypcji ratalnych odnosi się do powtarzającego się interwału, w którym dokonywane są płatności, zgodnie z określeniami w abonamentach podstawowych.
- Zmiany abonamentu a zmiany cen: w przypadku zmian cen i anulowań obowiązuje rygorystyczne zobowiązanie. Oznacza to, że jeśli użytkownik chce anulować subskrypcję lub deweloper chce zmienić cenę, zmiana ta wejdzie w życie z końcem okresu zobowiązania. W przypadku zmian abonamentu zobowiązanie nie jest wiążące. Oznacza to, że zmiana planu nie musi czekać do końca okresu zobowiązania. Zmiana zacznie obowiązywać natychmiast lub w dniu następnej płatności, w zależności od wybranego trybu wymiany.
- Zmiana abonamentu w ramach tej samej subskrypcji: nie można zmienić abonamentu ratalnego na abonament podstawowy bez rat w ramach tego samego produktu subskrypcji.
Powiadomienia w czasie rzeczywistym dla deweloperów:
SUBSCRIPTION_CANCELLATION_SCHEDULED
powiadomienie w czasie rzeczywistym dla deweloperów jest wysyłane natychmiast po anulowaniu przez użytkownika, gdy płatności są nadal wymagane w okresie zobowiązania. Anulowanie jest w trakcie rozpatrywania i zacznie obowiązywać dopiero po zakończeniu okresu zobowiązania. Jeśli nie zostaną przywrócone przez użytkownika, na koniec okresu zobowiązania zostaną wysłane RTDNSUBSCRIPTION_CANCELED
iSUBSCRIPTION_EXPIRED
.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, zgodnie z tymi samymi warunkami co w przypadku wszystkich innych abonamentów. Deweloperzy nie otrzymują płatności z góry, gdy użytkownik wykupuje subskrypcję ratalną.
Nieodebrane płatności: jeśli użytkownik nie dokona płatności ratalnej, ani Google, ani Deweloper nie będą próbować odzyskać żadnych zaległych lub nieopłaconych kwot od użytkownika. Google może jednak okresowo podejmować próby pobrania płatności w okresie karencji lub okresie zawieszenia konta zgodnie ze swoimi standardowymi procedurami. 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 wersji 7 lub nowszej. W przypadku wersji 5 i późniejszych subskrypcja ratalna jest zwracana za pomocą elementuqueryProductDetails()
, ale nie zawiera szczegółowych informacji o ratach, takich jak liczba zobowiązań ratalnych w ramach planu.
Używanie precyzyjnych linków do zarządzania subskrypcją
Aplikacja powinna zawierać link na ekranie ustawień lub preferencji, który umożliwia użytkownikom zarządzanie subskrypcjami. Link ten powinien być wkomponowany w aplikację w sposób naturalny i nieinwazyjny.
Możesz dodać do aplikacji link do centrum subskrypcji Google Play w przypadku subskrypcji, które nie wygasły. Możesz to sprawdzić w polu subscriptionState
w zasobie subskrypcji.
W związku z tym istnieje kilka sposobów na dodanie linku do centrum subskrypcji w Sklepie Play.
Link do Centrum subskrypcji
Aby przekierować użytkowników na stronę ze wszystkimi ich subskrypcjami (jak pokazano na rysunkach 1 i 2), użyj tego adresu URL:
https://play.google.com/store/account/subscriptions
Ten precyzyjny link może być przydatny, gdy użytkownik chce przywrócić anulowaną subskrypcję w centrum subskrypcji w Sklepie Play.
Link do konkretnej strony zarządzania subskrypcją (zalecane)
Aby utworzyć bezpośredni link do strony zarządzania subskrypcją, której nie minął jeszcze okres ważności, podaj nazwę pakietu i productId
powiązane z zakupioną subskrypcją. Aby za pomocą programowania określić productId
dla istniejącej subskrypcji, przeprowadź 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 odpowiadający jej element productId
w ramach informacji 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 tego adresu URL, aby przekierować użytkowników do konkretnego ekranu zarządzania subskrypcją. Zastąp „your-sub-product-id” i „your-app-package” odpowiednio wartościami 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 wstrzymywanie.
Zezwalanie użytkownikom na przejście na wyższą lub niższą wersję subskrypcji lub jej zmianę
Możesz zaoferować obecnym subskrybentom różne opcje zmiany abonamentu, aby lepiej dostosować go do ich potrzeb:
- Jeśli sprzedajesz subskrypcje na różnych poziomach, np. „podstawową” i „premium”, możesz umożliwić użytkownikom zmianę poziomu poprzez zakup innego abonamentu podstawowego lub innej oferty subskrypcji.
- Możesz zezwolić użytkownikom na zmianę bieżącego okresu rozliczeniowego, np. 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 zniżki na subskrypcję. Możesz na przykład utworzyć ofertę, która zapewnia 50% zniżki na pierwszy rok w przypadku przejścia z abonamentu miesięcznego na roczny, i ograniczyć tę ofertę do użytkowników subskrybujących abonament miesięczny, którzy nie kupili tej oferty. Więcej informacji o kryteriach kwalifikowania się oferty znajdziesz w Centrum pomocy.
Rysunek 3. Przykład aplikacji z 3 różnymi abonamentami:
Aplikacja może wyświetlić ekran podobny do przedstawionego na rysunku 3, oferując użytkownikom opcje zmiany subskrypcji. W każdym przypadku użytkownicy powinni mieć jasność, jaki jest ich obecny abonament i jakie mają opcje jego zmiany.
Gdy użytkownicy zdecydują się na przejście na wyższy abonament, niższy abonament lub zmianę abonamentu, możesz określić tryb zastępowania, który określa, jak ma być stosowana proporcjonalna wartość bieżącego opłaconego okresu rozliczeniowego oraz kiedy nastąpi zmiana uprawnień.
Tryby zastępowania
W tabeli poniżej znajdziesz dostępne tryby zastępowania, przykłady ich użycia oraz liczbę płatności uznanych za zapłacone.
Tryb wymiany |
Opis |
Przykład użycia |
Zadeklarowane płatności zarejestrowane jako zapłacone (w przypadku zastąpienia subskrypcji ratalnej) |
|
Subskrypcja zostanie natychmiast przeniesiona na wyższą lub niższą wersję. Pozostały czas jest dostosowywany na podstawie różnicy w cenie i zaliczany na poczet nowej subskrypcji poprzez przesunięcie daty płatności. Jest to zachowanie domyślne. |
Przejdź na droższy abonament bez konieczności uiszczenia dodatkowej opłaty. |
0 |
|
Subskrypcja zostanie natychmiast ulepszona, a cykl rozliczeniowy pozostanie taki sam. Różnica w cenie za pozostały okres jest następnie obciążana użytkownikiem. Uwaga: ta opcja jest dostępna tylko w przypadku ulepszenia subskrypcji, w którym cena za jednostkę czasu wzrasta. |
Przejdź na wyższy poziom bez zmiany daty płatności. |
1 |
|
Subskrypcja jest natychmiast ulepszana lub obniżana, a użytkownikowi natychmiast naliczana jest pełna cena nowego uprawnienia. Pozostała wartość z poprzedniej subskrypcji jest przenoszona na tę samą usługę lub proporcjonalnie dzielona na czas, gdy przechodzisz na inną usługę. Uwaga: jeśli nowa subskrypcja ma bezpłatny okres próbny lub ofertę wstępną, w momencie przejścia na wyższą lub niższą wersję użytkownik zostanie obciążony kwotą 0 USD lub ceną oferty wstępnej (w zależności od tego, co ma zastosowanie). |
Przejdź z krótszego na dłuższy okres rozliczeniowy. |
1 (Uwaga: 0, jeśli nowa subskrypcja ma bezpłatny okres próbny). |
|
Subskrypcja zostaje od razu przekształcona, a nowa cena zostanie naliczona przy odnowieniu subskrypcji. Cykl rozliczeniowy pozostaje bez zmian. |
Przejdź na wyższą wersję abonamentu, zachowując pozostałą część bezpłatnego okresu. |
0 |
|
Subskrypcja jest ulepszana lub obniżana tylko podczas odnawiania, ale nowy zakup jest realizowany natychmiast z tymi 2 elementami:
Uwaga: w przypadku abonamentów ratalnych zmiana planu następuje w dniu rozpoczęcia kolejnego okresu płatności. |
Przejdź na tańszy poziom. |
1 |
Więcej informacji o różnych zastosowaniach ofert upsell i winback w ramach ofert ulepszenia lub obniżenia poziomu znajdziesz w przewodniku dotyczącym ofert i promocji.
Ustawianie trybu zastępowania 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ść między subskrypcjami. Z tej sekcji dowiesz się, jak ustawić tryb wymiany w przypadku zmiany subskrypcji oraz jakie obowiązują w tym przypadku ograniczenia.
Odnów subskrypcję lub zmień plan w ramach tej samej subskrypcji
Domyślny tryb zastępowania możesz określić w Konsoli Google Play. 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 subskrybują po anulowaniu. Dostępne opcje to Obciążenie natychmiastowe (równoważne opcji CHARGE_FULL_PRICE
) i Obciążenie w dniu kolejnej płatności (równoważne opcji WITHOUT_PRORATION
). To jedyne istotne tryby zastępowania podczas przełączania abonamentów podstawowych w ramach tej samej subskrypcji.
Jeśli na przykład wdrażasz ofertę przywracania klientów w przypadku tego samego abonamentu po anulowaniu przez użytkownika, ale przed zakończeniem subskrypcji, możesz przetworzyć nowy zakup jako zwykły zakup bez wskazywania żadnych wartości w polu SubscriptionUpdateParams
. System używa domyślnego trybu zastępowania skonfigurowanego w subskrypcji i automatycznie przenosi abonament ze starego zakupu do nowego.
Przełączać plany między subskrypcjami lub zastąpić domyślny tryb zastępowania
Jeśli użytkownik zmienia produkty subskrypcji (kupuje inną subskrypcję) lub jeśli z jakiegokolwiek powodu chcesz zastąpić domyślny tryb zastępowania, określasz stopę proporcjonalnego podziału w czasie wykonywania jako część parametrów procesu zakupu.
Aby prawidłowo podać wartość SubscriptionUpdateParams
w ramach konfiguracji procesu zakupu w czasie wykonywania, pamiętaj o tych ograniczeniach:
- Podczas przechodzenia na wyższy lub niższy abonament lub przełączania subskrypcji na abonament przedpłacony z abonamentu przedpłaconego, abonamentu odnawianego automatycznie lub abonamentu ratalnego jedynym dozwolonym trybem wymiany jest
CHARGE_FULL_PRICE
. Jeśli określisz inny tryb zastępowania, zakup nie powiedzie się i użytkownik zobaczy komunikat o błędzie. - Podczas przełączania się w ramach tej samej subskrypcji na abonament odnawiany automatycznie z abonamentu przedpłaconego lub automatycznie odnawianego ważne tryby podziału to
CHARGE_FULL_PRICE
iWITHOUT_PRORATION
. Jeśli określisz inny tryb rozliczenia, zakup nie powiedzie się i użytkownik zobaczy błąd. - Przechodzenie z abonamentu podstawowego z ratami na abonament podstawowy bez rat w ramach tego samego produktu objętego subskrypcją jest niedozwolone.
Przykłady i zachowania związane z zastępowaniem
Aby zrozumieć, jak działa każdy tryb podziału, rozważ ten scenariusz:
Samwise ma subskrypcję treści online z aplikacji Country Gardener. Ma miesięczną subskrypcję wersji poziomu 1 tych treści, która zawiera tylko tekst. Ta subskrypcja kosztuje 2 zł miesięcznie i jest odnawiana pierwszego dnia miesiąca.
15 kwietnia Samwise zdecydował się na przejście na roczny abonament poziomu 2, który obejmuje aktualizacje filmów i kosztuje 36 USD rocznie.
Podczas przekształcania subskrypcji deweloper wybiera tryb podziału. Na liście poniżej opisano, jak każdy tryb podziału wpływa na subskrypcję Samwise:
WITH_TIME_PRORATION
Subskrypcja poziomu 1 użytkownika Samwise kończy się natychmiast. Ponieważ użytkownik zapłacił za cały miesiąc (1–30 kwietnia), ale w połowie okresu subskrypcji zmienił poziom, do jego nowej subskrypcji zostanie zastosowana połowa miesięcznej opłaty (1 USD). Ponieważ jednak nowy abonament kosztuje 36 USD rocznie, saldo w wysokości 1 USD wystarczy na 10 dni (16–25 kwietnia). W rezultacie 26 kwietnia naliczymy opłatę za nowy abonament w wysokości 36 USD, a 26 kwietnia każdego kolejnego roku – kolejną opłatę w tej samej wysokości.
W momencie udanego zakupu należy wywołać funkcję PurchasesUpdatedListener
aplikacji, aby pobrać nowy zakup w ramach wywołania queryPurchasesAsync()
. Twoje zaplecze natychmiast otrzyma
SUBSCRIPTION_PURCHASED
powiadomienie 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 zł/rok = 3 zł/miesiąc) jest wyższa niż cena subskrypcji poziomu 1 za jednostkę czasu (2 zł/miesiąc). Subskrypcja poziomu 1 użytkownika Samwise kończy się natychmiast. Ponieważ zapłacił za cały miesiąc, ale wykorzystał tylko połowę, do nowej subskrypcji zostanie zastosowana opłata za połowę miesiąca (1 USD). Jednak ponieważ nowa subskrypcja kosztuje 36 USD rocznie, pozostałe 15 dni kosztuje 1,50 USD, więc za nową subskrypcję zostanie naliczona różnica w wysokości 0,50 USD. 1 maja zostaje obciążony opłatą w wysokości 36 zł za nowy poziom subskrypcji, a 1 maja każdego kolejnego roku – kolejną opłatą w tej samej wysokości.
W momencie, gdy zakup zostanie zrealizowany, wywołaj metodę PurchasesUpdatedListener
w swojej aplikacji. Nowy zakup możesz pobrać w ramach wywołania metody queryPurchasesAsync()
. Twoje zaplecze natychmiast otrzyma
SUBSCRIPTION_PURCHASED
powiadomienie w czasie rzeczywistym dla deweloperów.
WITHOUT_PRORATION
Subskrypcja poziomu 1 Samwise’a zostaje natychmiast przeniesiona do poziomu 2 bez dodatkowych opłat. 1 maja zostanie naliczona opłata w wysokości 36 USD za nowy poziom subskrypcji, a 1 maja każdego kolejnego roku – kolejna opłata w tej samej wysokości.
W momencie, gdy zakup zostanie zrealizowany, wywołaj metodę PurchasesUpdatedListener
w swojej aplikacji. Nowy zakup możesz pobrać w ramach wywołania metody queryPurchasesAsync()
. Twoje zaplecze natychmiast otrzyma
SUBSCRIPTION_PURCHASED
powiadomienie w czasie rzeczywistym dla deweloperów.
DEFERRED
Subskrypcja poziomu 1 Samwise będzie kontynuowana do 30 kwietnia, kiedy wygaśnie. 1 maja subskrypcja poziomu 2 zacznie obowiązywać i Samwise zostanie obciążony opłatą w wysokości 36 USD za nowy poziom subskrypcji.
W momencie, gdy zakup zostanie zrealizowany, wywołaj metodę PurchasesUpdatedListener
w swojej aplikacji. Nowy zakup możesz pobrać w ramach wywołania metody queryPurchasesAsync()
. Twoje zaplecze natychmiast otrzyma
SUBSCRIPTION_PURCHASED
powiadomienie w czasie rzeczywistym dla deweloperów. W tym momencie przeprowadź zakup w taki sam sposób jak każdy inny nowy zakup. W szczególności upewnij się, że akceptujesz nowy zakup. Pamiętaj, że startTime
nowej subskrypcji jest wypełniany w momencie, gdy zastąpienie zacznie obowiązywać, czyli w momencie wygaśnięcia starej subskrypcji. Wtedy otrzymasz SUBSCRIPTION_RENEWED
RTDN dla nowego abonamentu. Dowiedz się więcej o zachowaniu ReplacementMode.DEFERRED
w artykule Zarządzanie opóźnionym zastąpieniem.
CHARGE_FULL_PRICE
Subskrypcja poziomu 1 użytkownika Samwise kończy się natychmiast. Subskrypcja poziomu 2 rozpoczyna się dziś i zostanie obciążona opłatą w wysokości 36 USD. Ponieważ zapłacił za cały miesiąc, ale wykorzystał tylko połowę, do nowej subskrypcji zostanie zastosowana opłata za pół miesiąca (1 USD). Ponieważ nowa subskrypcja kosztuje 36 USD rocznie, do okresu subskrypcji zostanie dodana 1/36 roku (około 10 dni). Dlatego następna opłata za usługę Samwise będzie wynosić 36 USD i zostanie naliczona za 1 rok i 10 dni od dzisiaj. Po tym czasie będzie on obciążany opłatą w wysokości 36 USD rocznie.
Wybierając tryb podziału, zapoznaj się z zaleceniami dotyczącymi zastępowania.
Zmiana subskrypcji w aplikacji
Aplikacja może oferować użytkownikom przejście na wyższą lub niższą wersję subskrypcji w taki sam sposób jak uruchamianie procesu zakupu. Jednak podczas przechodzenia na wyższą lub niższą wersję musisz podać szczegóły bieżącej subskrypcji, przyszłej subskrypcji (z podwyższoną lub obniżoną ceną) oraz tryb zastępowania, jak 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); // ...
Zalecenia dotyczące wymiany
W tabeli poniżej przedstawiono różne scenariusze proporcjonalnego zmniejszania i zalecenia dotyczące każdego z nich:
Scenariusz | Zalecany tryb zastępowania | Wynik |
---|---|---|
Przejście na droższy pakiet | CHARGE_PRORATED_PRICE |
Użytkownik otrzymuje dostęp natychmiast, zachowując ten sam okres rozliczeniowy. |
Przejście na tańszy poziom | DEFERRED |
Użytkownik zapłacił już za droższy poziom, więc będzie mieć do niego dostęp do następnego terminu płatności. |
Przejście na wersję płatną podczas bezpłatnego okresu próbnego z zachowaniem wersji próbnej | WITHOUT_PRORATION |
Użytkownik zachowuje dostęp do bezpłatnego okresu próbnego, ale na pozostałą część tego okresu przechodzi na wyższy poziom. |
Przejście na wersję płatną podczas bezpłatnego okresu próbnego – utrata dostępu do wersji próbnej | CHARGE_PRORATED_PRICE |
Użytkownik natychmiast uzyska dostęp do nowego poziomu, ale nie będzie już mieć bezpłatnego okresu próbnego. |
Obsługa zakupów po zmianie subskrypcji
Zmiany abonamentu są nowymi zakupami we wszystkich aspektach i celach. Po zakończeniu procesu płatności należy je przetworzyć i zaakceptować. 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 otrzymuje wynik nowego zakupu w PurchasesUpdatedListener
, a nowy zakup jest dostępny w queryPurchasesAsync
.
Interfejs Google Play Developer API zwraca wartość linkedPurchaseToken
w zasobie subskrypcji, gdy zakup zastępuje dotychczasową subskrypcję. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken
, aby nie można było uzyskać dostępu do Twoich usług za pomocą starego tokena. Informacje o przechodzeniu na wyższą lub niższą wersję znajdziesz w artykule Przechodzenie na wyższą lub niższą wersję.
Gdy otrzymasz nowy token zakupu, postępuj zgodnie z tym samym procesem weryfikacji, co w przypadku weryfikacji nowego tokena zakupu. Pamiętaj, aby potwierdzić te zakupy za pomocą interfejsu BillingClient.acknowledgePurchase()
w bibliotece Płatności w Google Play lub interfejsu Purchases.subscriptions:acknowledge
w interfejsie Google Play Developer API.
Obsługa opóźnionej wymiany
Tryb opóźnionego zastąpienia umożliwia użytkownikowi wykorzystanie pozostałego limitu w ramach starego abonamentu przed rozpoczęciem korzystania z nowego.
Gdy użyjesz ReplacementMode.DEFERRED w przypadku nowego zakupu, queryPurchasesAsync()
zwróci nowy token zakupu po przepływie zakupu, który pozostaje powiązany ze starym produktem, dopóki odroczona wymiana nie nastąpi w następnym terminie odnowienia, po którym nowy produkt zostanie zwrócony.
W przeszłości można było uzyskać takie wrażenia użytkownika za pomocą wycofanej biblioteki ProrationMode.DEFERRED
, ale ProrationMode.DEFERRED
została wycofana w Bibliotece płatności w Play w wersji 6. Aby dowiedzieć się, czym się różnią, zobacz tę tabelę:
Godzina |
ProrationMode.DEFERRED (wycofane) |
ReplacementMode.DEFERRED |
Bezpośrednio po zakończeniu procesu zakupu (aplikacja) |
Prawo do starego abonamentu będzie obowiązywać do następnej daty odnowienia. Aby zapewnić, że aplikacja będzie mieć odpowiednie uprawnienia, Nowy token zakupu nie jest wyświetlany, więc nie można go przetworzyć w tej chwili. |
Wyświetla się nowy token zakupu, który powinien zostać przetworzony, biorąc pod uwagę termin wymiany. |
Tuż po zakończeniu procesu zakupu (na zapleczu) |
SUBSCRIPTION_PURCHASED RTDN nie jest wysyłany po procesie zakupu. System zaplecza nie jest jeszcze informowany o nowym zakupie. |
SUBSCRIPTION_PURCHASED RTDN ze starym identyfikatorem produktu jest wysyłany natychmiast po procesie zakupu w przypadku nowego tokenu zakupu. Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z polem „startTime” (czas rozpoczęcia) wskazującym czas zakupu z 2 elementami zamówienia:
SUBSCRIPTION_EXPIRED wysłany dla starego tokena zakupu. Gdy wywołasz metodę purchases.subscriptionsv2.get z tokenem zakupu old, token ten jest wyświetlany jako wygasły (uprawnienia dotyczące starego planu są przenoszone na nowy zakup na pozostałą część czasu). |
Po wymianie – pierwsze odnowienie po procesie zakupu (aplikacja) |
Nowy token zakupu jest teraz widoczny, więc powinien zostać przetworzony. |
Nowy zakup powinien zostać już przetworzony, gdy proces zakupu się zakończył, więc aplikacja nie musi wykonywać żadnych specjalnych działań poza sprawdzeniem, czy przyznano odpowiednie uprawnienia. |
W przypadku wymiany – pierwsze odnowienie po procesie zakupu (back-end) |
Nowy zakup może zostać przetworzony i potwierdzony, gdy zostanie wysłany pierwszy RTDN SUBSCRIPTION_RENEWED. Wartość |
Nowy zakup został przetworzony i potwierdzony, gdy wysłano RTDN SUBSCRIPTION_PURCHASED dla nowego tokena zakupu i zapisano go jako „startTime”. W przypadku ustawienia ReplacementMode.DEFERRED pierwsze odnowienia zachowują się tak samo jak inne odnowienia i nie musisz obsługiwać specjalnej logiki dla zastępowania, gdy to zdarzenie ma miejsce. Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z 2 elementami zamówienia:
|
Od teraz zamiast wycofanego parametru ProrationMode.DEFERRED należy używać parametru ReplacementMode.DEFERRED, ponieważ działa on tak samo w przypadku zmian uprawnień, ale oferuje sposób zarządzania zakupem, który jest bardziej spójny z zachowaniem w przypadku innych nowych zakupów.
Zarządzanie klientami
Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów możesz wykrywać w czasie rzeczywistym przypadki, gdy użytkownik zdecyduje się anulować subskrypcję. Gdy użytkownik anuluje subskrypcję, ale przed jej wygaśnięciem, możesz wysłać do niego 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. Tabela poniżej zawiera opis różnych scenariuszy dotyczących subskrypcji wraz z powiązanymi działaniami przywracającymi użytkowników i wymaganiami dotyczącymi aplikacji.
Przed wygaśnięciem subskrypcji | Po zakończeniu 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 przez proces płatności | Tak | Nie | Tak | Tak |
Abonament użytkownika pozostaje powiązany z tym samym kodem SKU | Użytkownik może zarejestrować się w ramach tego samego lub innego identyfikatora SKU | Tak | Użytkownik może zarejestrować się w ramach tego samego lub innego identyfikatora SKU | Tak |
Tworzy nowy token zakupu | Tak | Nie | Tak | Tak |
Ta opcja jest domyślnie włączona | Nie | Tak, wymagana jest pomoc dla wszystkich programistów | Nie |
Aplikacje bez Biblioteki płatności 2.0 lub nowszej: nie. Aplikacje korzystające z Biblioteki płatności 2.0 lub nowszej: tak. Deweloperzy mogą zrezygnować z tego w konsoli. |
Gdy użytkownik zostanie obciążony opłatą |
Jeśli używasz tego samego kodu SKU: koniec bieżącego okresu rozliczeniowego. Jeśli używasz innego SKU: zależy od trybu podziału. |
Koniec bieżącego okresu rozliczeniowego | Natychmiast | Natychmiast |
Wymagane wdrożenie | Udostępnij w aplikacji interfejs ponownego rejestrowania się. |
wykrywanie zmian stanu subskrypcji, Link do Sklepu Play |
Udostępnij w aplikacji interfejs do ponownego rejestrowania się. | Obsługa zakupów poza aplikacją |
Przed wygaśnięciem subskrypcji – w aplikacji
W przypadku subskrypcji, które zostały anulowane, ale nie wygasły, możesz zezwolić subskrybentom na przywrócenie subskrypcji w aplikacji. Aby to zrobić, zastosuj ten sam proces zakupu produktu w aplikacji, który jest stosowany w przypadku nowych subskrybentów. Upewnij się, że interfejs użytkownika odzwierciedla fakt, że użytkownik ma już subskrypcję. Możesz na przykład wyświetlić aktualną datę wygaśnięcia i okresową cenę użytkownika za pomocą przycisku Ponownie aktywuj.
W większości przypadków warto zaoferować użytkownikowi tę samą cenę i ten sam kod SKU, z których korzystał już wcześniej:
- rozpocząć nowy zakup subskrypcji z tym samym kodem SKU.
- Nowa subskrypcja zastąpi starą i będzie odnawiana w tym samym dniu. Stara subskrypcja zostanie natychmiast oznaczona jako wygasła.
- Achilles ma subskrypcję aplikacji muzycznej Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje miesięczną subskrypcję w tej samej cenie miesięcznej. Nowa subskrypcja jest proporcjonalnie podzielona na pozostałe środki, jest aktywna od razu i nadal odnawia się 1 sierpnia.
Jeśli chcesz zaoferować inną cenę, na przykład nowy bezpłatny okres próbny lub zniżkę na przywrócenie klienta, możesz zamiast tego zaoferować użytkownikowi inny kod SKU:
- Rozpocznij uaktualnianie lub obniżanie poziomu za pomocą innego kodu SKU, używając trybu wymiany
WITHOUT_PRORATION
. - Nowa subskrypcja zastąpi starą i będzie odnawiana w tym samym dniu. W dniu pierwotnej daty wygaśnięcia użytkownikowi zostanie naliczona cena nowego kodu SKU, w tym wszelkie ceny promocyjne. Jeśli stare konto zostało utworzone za pomocą zaszyfrowanego identyfikatora konta, ten sam identyfikator należy przekazać do usługi
BillingFlowParams
w przypadku uaktualniania i obniżania subskrypcji. - Achilles ma subskrypcję aplikacji muzycznej Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje roczną subskrypcję w cenie dla nowych użytkowników. Nowa subskrypcja jest aktywna od razu, a użytkownik zostanie obciążony ceną promocyjną 1 sierpnia.
- Jeśli zdecydujesz się uwzględnić w SKU na potrzeby przywracania użytkowników bezpłatny okres próbny lub cenę początkową, upewnij się, że użytkownik spełnia wymagania. Aby to zrobić, odznacz pole Zezwalaj na 1 bezpłatny okres próbny na aplikację w Konsoli Google Play. Pozwoli to użytkownikowi na korzystanie z 1 bezpłatnego okresu próbnego na aplikację.
Gdy otrzymasz token zakupu, przeprowadź zakup tak samo jak w przypadku nowej subskrypcji. Dodatkowo interfejs Google Play Developer API zwraca wartość linkedPurchaseToken
w zasobie subskrypcji. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken
, aby nie można było uzyskać dostępu do Twoich usług za pomocą starego tokena.
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 Zasubskrybuj ponownie (wcześniej Przywróć). Dzięki temu zachowasz ten sam token subskrypcji i zakupu.
Więcej informacji o przywracaniu subskrypcji znajdziesz w artykule Przywracanie.
Po wygaśnięciu subskrypcji – w aplikacji
Możesz umożliwić subskrybentom, których subskrypcja wygasła, ponowne zasubskrybowanie aplikacji. W tym celu zastosuj ten sam proces zakupu produktów w aplikacji, który jest stosowany w przypadku nowych subskrybentów. Pamiętaj:
- Aby zaoferować użytkownikom rabat, możesz zaproponować identyfikator produktu z ceną specjalną dla subskrypcji, zwany też kodem SKU na odzyskanie klienta. Oferty możesz przedstawić w aplikacji lub powiadomić o niej użytkownika poza aplikacją, np. w e-mailu.
- Aby rozpocząć proces odzyskiwania subskrypcji, uruchom proces zakupu w aplikacji na Androida za pomocą Biblioteki płatności w Google Play. Jest to ten sam proces co w przypadku nowej subskrypcji, ale możesz określić kod SKU, który jest dostępny dla użytkownika.
- Jeśli zdecydujesz się uwzględnić w SKU oferty przywracania użytkowników bezpłatny okres próbny lub cenę początkową, sprawdź, czy użytkownik kwalifikuje się do skorzystania z oferty. Aby to zrobić, odznacz pole Zezwól na 1 bezpłatny okres próbny na aplikację w Konsoli Google Play. Pozwoli to użytkownikowi na skorzystanie z 1 bezpłatnego okresu próbnego na aplikację.
- Jeśli użytkownik ponownie subskrybuje ten sam kod SKU, nie będzie już kwalifikować się do korzystania z bezpłatnych wersji próbnych ani ceny początkowej. Upewnij się, że interfejs użytkownika to uwzględnia.
Gdy otrzymasz token zakupu, przeprowadź zakup tak samo jak w przypadku nowej subskrypcji. W zasobie subskrypcji nie otrzymasz wartości linkedPurchaseToken
.
Po wygaśnięciu subskrypcji – w Sklepie Play
Jeśli ta opcja jest włączona, użytkownicy mogą ponownie subskrybować ten sam SKU przez rok od daty wygaśnięcia, klikając Odnów subskrypcję w centrum subskrypcji Google Play. Spowoduje to wygenerowanie nowego tokena subskrypcji i zakupu.
Odnowienie subskrypcji jest uznawane za zakup poza aplikacją, dlatego stosuj sprawdzone metody obsługi zakupów dokonywanych poza aplikacją.
Promowanie subskrypcji
Możesz utworzyć kody promocyjne, aby udostępnić wybranym użytkownikom dłuższy bezpłatny okres próbny bieżącej subskrypcji. Więcej informacji znajdziesz w artykule 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 bezpłatny okres próbny. Niektórzy użytkownicy mogą zobaczyć tę weryfikację jako blokadę lub obciążenie na koncie formy płatności. To blokada lub obciążenie jest tymczasowe i później anulowane lub zwrócone.
Po zakończeniu okresu próbnego forma płatności użytkownika zostanie obciążona pełną ceną subskrypcji.
Jeśli użytkownik anuluje subskrypcję w dowolnym momencie podczas bezpłatnego okresu próbnego, subskrypcja pozostanie aktywna do końca tego okresu i nie zostanie naliczona opłata.
anulować, zwrócić lub cofnąć,
Możesz użyć interfejsu Google Play Developer API, aby anulować, zwrócić lub cofnąć subskrypcję. Ta funkcja jest też dostępna w Konsoli Google Play.
- Anuluj: użytkownicy mogą anulować subskrypcję w Google Play. Możesz też dać użytkownikom możliwość anulowania subskrypcji w aplikacji lub w witrynie. Twoja aplikacja powinna obsługiwać takie anulowania zgodnie z opisem w sekcji Anulowanie.
- Zwrot środków: po dokonaniu zwrotu środków użytkownik może nadal korzystać z subskrypcji. Zwroty mogą być stosowane na przykład w przypadku błędu technicznego, który uniemożliwił użytkownikowi dostęp do produktu, ale został już naprawiony. Pamiętaj, że aby zwrócić więcej niż ostatnią płatność lub dokonać częściowego zwrotu środków, musisz użyć Konsoli Google Play.
- Cofnij: gdy cofniesz dostęp, użytkownik natychmiast utraci dostęp do subskrypcji. Możesz tego użyć, jeśli na przykład wystąpił błąd techniczny, który uniemożliwił użytkownikowi dostęp do Twojej usługi, a użytkownik nie chce już z niej korzystać. Aplikacja powinna obsługiwać takie anulowania zgodnie z opisem w sekcji Odwołania.
W tabeli poniżej znajdziesz różnice między anulowaniem, zwrotem środków i odwołaniem.
Zatrzymuje odnawianie | Zwrot środków | Unieważnij dostęp | |
Anuluj | Tak | Nie | Nie |
Zwrot środków | Nie | Tak | Nie |
Wycofaj | Tak | Tak | Tak |
Odroczenie rozliczeń za subskrypcję
Możesz przyspieszyć datę następnego rozliczenia subskrybenta z automatycznym odnawianiem, używając interfejsu Purchases.subscriptions:defer
w Google Play Developer API. W tym okresie użytkownik ma subskrypcję Twoich treści z pełnym dostępem, ale nie jest od niego pobierana opłata. Data odnowienia subskrypcji zostanie zmieniona na nową.
W przypadku abonamentów przedpłaconych możesz użyć interfejsu API do opóźniania płatności, aby odroczyć czas wygaśnięcia.
Rozliczenie odroczone umożliwia:
- Udostępnij użytkownikom bezpłatny dostęp jako ofertę specjalną, np. 1 tydzień bezpłatnego dostępu po zakupie filmu.
- Udostępnij klientom bezpłatny dostęp jako gest dobrej woli.
Płatność może zostać odroczona o co najmniej 1 dzień i maksymalnie o 1 rok na każde wywołanie interfejsu API. Aby jeszcze bardziej odłożyć rozliczenie, możesz ponownie wywołać interfejs API przed nową datą rozliczenia.
Darcy ma na przykład miesięczną subskrypcję treści online w aplikacji Fishing Quarterly. Zazwyczaj każdego pierwszego dnia miesiąca naliczane są jej opłaty w wysokości 1, 25 GBP. W marcu wzięła udział w ankiecie online dla wydawcy aplikacji. W ramach nagrody wydawca odroczył jej o 6 tygodni następną płatność do 15 maja, czyli o 6 tygodni od wcześniej zaplanowanego terminu rozliczenia, który przypada 1 kwietnia. Darcy nie zostanie obciążony opłatą za kwiecień ani początek maja, ale nadal będzie mieć dostęp do treści. 15 maja zostanie naliczona normalna opłata abonamentowa w wysokości 1, 25 GBP za ten miesiąc. Jej następna data odnowienia to 15 czerwca.
Gdy odroczysz termin, możesz powiadomić użytkownika e-mailem lub w aplikacji, że zmienił się termin płatności.
Obsługa odrzuconych płatności
Jeśli wystąpią problemy z płatnością za odnowienie subskrypcji, Google będzie przez jakiś czas okresowo próbować odnowić subskrypcję, zanim ją anuluje. Ten okres, w którym można odzyskać dostęp do subskrypcji, składa się z okresu prolongaty, po którym następuje okres zawieszenia konta. W tym czasie Google wysyła do użytkownika e-maile i powiadomienia z prośbą o zaktualizowanie formy płatności.
Po odrzuceniu płatności subskrypcja wchodzi w okres prolongaty, jeśli został skonfigurowany. W trakcie okresu prolongaty upewnij się, że użytkownik nadal ma dostęp do uprawnień w ramach subskrypcji.
Po zakończeniu okresu prolongaty subskrypcja przechodzi w okres zawieszenia konta. Gdy konto jest zawieszone, należy zadbać o to, aby użytkownik nie miał dostępu do uprawnień w ramach subskrypcji.
W Konsoli Google Play możesz określić długość okresu prolongaty i zawieszenia konta w przypadku 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 przywrócenia subskrypcji po odrzuceniu płatności, możesz poinformować użytkownika o problemie z płatnością i poprosić o jego rozwiązanie.
Możesz to zrobić samodzielnie, zgodnie z instrukcjami podanymi w sekcji okres karencji i zablokowanie konta, albo zaimplementować interfejs API do wysyłania wiadomości w aplikacji, w której Google wyświetla użytkownikom wiadomość.
Wysyłanie wiadomości w aplikacji
Jeśli masz włączone wiadomości w aplikacji za pomocą
InAppMessageCategoryId.TRANSACTIONAL
,
Google Play będzie raz dziennie wyświetlać użytkownikom wiadomości w okresie karencji i zablokowania konta, aby umożliwić im poprawienie płatności bez konieczności opuszczania aplikacji.
Zalecamy wywołanie tego interfejsu API za każdym razem, gdy użytkownik otwiera aplikację, aby określić, czy należy wyświetlić komunikat.
Jeśli użytkownik odzyska subskrypcję, otrzymasz kod odpowiedzi SUBSCRIPTION_STATUS_UPDATED
, a także token zakupu. Następnie użyj tego tokena zakupu, aby wywołać interfejs Google Play Developer API i odświeżyć stan subskrypcji w aplikacji.
Integracja wiadomości w aplikacji
Aby wyświetlać użytkownikom wiadomości w aplikacji, użyj BillingClient.showInAppMessages()
.
Oto przykład wywołania 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. } } });
Obsługa oczekujących transakcji dotyczących subskrypcji
Transakcje oczekujące mogą wystąpić w przypadku początkowego zakupu, doładowania, ulepszenia lub obniżenia poziomu. Zakup subskrypcji rozpoczyna się w stanie SUBSCRIPTION_STATE_PENDING
, a następnie przechodzi do stanu SUBSCRIPTION_STATE_ACTIVE
. Jeśli transakcja wygasła lub została anulowana przez użytkownika, przechodzi do SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED
. Musisz i powinieneś zaktualizować uprawnienia użytkownika dopiero po zakończeniu transakcji.
Zmiana stanu subskrypcji w przypadku początkowego zakupu z oczekującymi transakcjami jest prosta. Gdy użytkownik rozpocznie oczekującą transakcję, aplikacja otrzyma Purchase
ze stanem PENDING
. Po zakończeniu transakcji aplikacja ponownie otrzyma zdarzenie Purchase
, ale stan zostanie zaktualizowany na PURCHASED
. Do klienta RTDN wysyłana jest wiadomość SubscriptionNotification
o typie SUBSCRIPTION_PURCHASED
. Wykonaj standardowe czynności, aby potwierdzić zakup, przyznać użytkownikowi dostęp do treści i potwierdzić zakup. 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ę w przypadku oczekujących transakcji wiąże się ze zmianą stanu zarówno starej, jak i nowej subskrypcji. Gdy użytkownik rozpocznie oczekującą transakcję doładowania, przejścia na wyższą lub niższą wersję, aplikacja otrzyma Purchase
dla starej subskrypcji z obiektem PendingPurchaseUpdate
. Użytkownik nadal ma starą subskrypcję i jeszcze nie uzyskał nowej subskrypcji. Wywołanie metod getProducts()
i getPurchaseToken()
obiektu PendingPurchaseUpdate
zwraca identyfikatory produktów i token zakupu nowej subskrypcji. Po zakończeniu transakcji aplikacja otrzymuje zdarzenie Purchase
z tokenem zakupu na najwyższym poziomie ustawionym dla nowej subskrypcji i stanem PURCHASED
. Do klienta RTDN wysyłana jest wiadomość SubscriptionNotification
o typie SUBSCRIPTION_PURCHASED
. W tym momencie powinieneś zastąpić stary token zakupu nowym tokenem zakupu i zaktualizować dostęp użytkownika do treści. 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 powinien nadal mieć dostęp do treści ze starej subskrypcji.