Z tego dokumentu dowiesz się, jak obsługiwać zdarzenia cyklu życia subskrypcji, takie jak odnowienia i wygaśnięcia. Opisuje też dodatkowe funkcje subskrypcji, takie jak oferowanie promocji i umożliwianie użytkownikom zarządzania własnymi subskrypcjami.
Jeśli nie masz skonfigurowanych produktów subskrypcyjnych w aplikacji, zapoznaj się z artykułem Tworzenie i konfigurowanie produktów.
Przegląd subskrypcji
Subskrypcja to transakcja cykliczna, która przyznaje użytkownikom określone uprawnienia. Uprawnienia to zbiór korzyści, do których użytkownicy mają dostęp przez określony czas. Na przykład subskrypcja może uprawniać użytkownika do dostępu premium.
Za pomocą abonamentów podstawowych i ofert możesz tworzyć wiele konfiguracji tego samego produktu subskrypcyjnego. Możesz na przykład utworzyć ofertę wprowadzającą dla użytkowników, którzy nigdy nie subskrybowali Twojej aplikacji. Podobnie możesz utworzyć ofertę przejścia na wyższy poziom dla użytkowników, którzy już subskrybują Twoją aplikację.
Szczegółowe informacje o produktach subskrypcyjnych, planach podstawowych i ofertach znajdziesz w dokumentacji w Centrum pomocy Konsoli Play.
Biblioteka płatności w Play obsługuje te typy subskrypcji:
Subskrypcja pojedynczego produktu – w tym typie 1 produkt odpowiada 1 uprawnieniu. Na przykład subskrypcja usługi strumieniowania muzyki.
Subskrypcja z dodatkami – w tym przypadku jeden zakup może obejmować kilka różnych uprawnień w ramach jednego zakupu. Na przykład subskrypcja usługi strumieniowania muzyki i subskrypcja wideo. Informacje dotyczące subskrypcji z dodatkami znajdziesz w sekcji Subskrypcje z dodatkami.
Integracja z abonamentami przedpłaconymi
Abonamenty przedpłacone nie odnawiają się automatycznie po wygaśnięciu. Aby przedłużyć uprawnienia do subskrypcji bez przerw, użytkownik musi doładować abonament przedpłacony w ramach tej samej subskrypcji.
W przypadku doładowań uruchom proces płatności tak samo jak w przypadku pierwotnego zakupu. Nie musisz informować, że zakup jest doładowaniem.
Doładowania abonamentów przedpłaconych zawsze korzystają z trybu zastępowania CHARGE_FULL_PRICE i nie musisz go ustawiać. Użytkownik jest od razu obciążany płatnością za pełny okres rozliczeniowy, a jego uprawnienia są przedłużane o czas określony w doładowaniu.
Po doładowaniu te pola w obiekcie wyniku Purchase są aktualizowane, aby odzwierciedlać ostatni zakup doładowania:
- Identyfikator zamówienia
- Czas zakupu
- Podpis
- Token zakupu
- Potwierdzone
Te pola Purchase zawsze zawierają te same dane, które znajdują się w oryginalnym zakupie:
- Nazwa pakietu
- Stan zakupu
- Produkty
- Automatyczne odnawianie
Potwierdzenie zakupu przedpłaconego wspierania kanału
Podobnie jak w przypadku automatycznie odnawianych subskrypcji, musisz potwierdzić abonamenty przedpłacone po zakupie. Zarówno początkowy zakup, jak i wszystkie doładowania muszą zostać potwierdzone. Więcej informacji znajdziesz w artykule Przetwarzanie zakupów.
Ze względu na potencjalnie krótki czas trwania subskrypcji przedpłaconej ważne jest, aby jak najszybciej potwierdzić zakup.
W przypadku planów przedpłaconych trwających co najmniej tydzień potwierdzenie musi nastąpić w ciągu 3 dni.
W przypadku planów przedpłaconych o czasie trwania krótszym niż tydzień potwierdzenie musi nastąpić w połowie czasu trwania planu. Na przykład deweloperzy mają 1, 5 dnia na potwierdzenie 3-dniowego abonamentu przedpłaconego.
Integracja subskrypcji ratalnych
Subskrypcja ratalna to rodzaj subskrypcji, w której użytkownicy płacą za subskrypcję w kilku ratach w określonym czasie, zamiast płacić całą opłatę za subskrypcję z góry.
Dodatkowe uwagi dotyczące subskrypcji ratalnych:
- Dostępność w poszczególnych krajach: subskrypcje ratalne są dostępne tylko w Brazylii, Francji, Hiszpanii i we Włoszech (najnowsze informacje o dostępności znajdziesz w Konsoli).
- Ustalanie ceny: podczas ustalania ceny subskrypcji z płatnościami ratalnymi w Konsoli cena reprezentuje miesięczną kwotę płatności. W połączeniu z ustawionym okresem zobowiązania generuje to łączną kwotę subskrypcji na ekranie zakupu.
- Okres zobowiązania: łączny czas trwania początkowego zobowiązania dotyczącego subskrypcji, w którym wymagane są miesięczne płatności. Jeśli na przykład abonament podstawowy ma 15-miesięczny okres zobowiązania, użytkownik będzie dokonywać 15 miesięcznych płatności w tym okresie.
- Odnowienia: w przypadku subskrypcji ratalnych „odnowienie” oznacza zakończenie okresu zobowiązania, początkowego lub kolejnego. Po początkowej rejestracji pierwsze odnowienie nastąpi po zakończeniu całego początkowego okresu zobowiązania. Kolejne odnowienia następują po zakończeniu każdego kolejnego okresu zobowiązania. Typy odnowienia subskrypcji ratalnych to „automatyczne odnawianie co miesiąc” lub „automatyczne odnowienie na ten sam okres”. W przypadku opcji „odnawia się automatycznie co miesiąc” nie ma kolejnego zobowiązania, a abonament działa jak subskrypcja miesięczna, w której każda miesięczna opłata za subskrypcję stanowi odnowienie.
- Okres rozliczeniowy: w kontekście subskrypcji ratalnych odnosi się do cyklicznego odstępu czasu, w którym dokonywane są poszczególne płatności, zgodnie z abonamentem podstawowym.
- Zmiana abonamentu a zmiana ceny: w przypadku zmian cen i anulowania zobowiązanie jest wiążące. Oznacza to, że jeśli użytkownik będzie chciał anulować subskrypcję lub deweloper będzie chciał zmienić cenę, zmiana ta wejdzie w życie z końcem okresu zobowiązania. W przypadku zmiany abonamentu zobowiązanie nie jest wiążące. Oznacza to, że zmiana planu nie musi czekać do końca okresu zobowiązania. Wchodzi w życie natychmiast lub w najbliższym terminie płatności w zależności od ustawionego trybu zastępowania.
- Zmiana abonamentu w ramach tej samej subskrypcji: zmiana abonamentu podstawowego z płatnościami ratalnymi na abonament podstawowy bez płatności ratalnych w ramach tego samego produktu subskrypcji jest niedozwolona.
Powiadomienia w czasie rzeczywistym dla deweloperów (RTDN):
SUBSCRIPTION_CANCELLATION_SCHEDULEDRTDN jest wysyłane natychmiast po anulowaniu przez użytkownika subskrypcji, gdy płatności za okres zobowiązania są nadal aktywne. Anulowanie jest w trakcie realizacji i wejdzie w życie dopiero po zakończeniu okresu zobowiązania. Jeśli użytkownik nie przywróci subskrypcji, na koniec okresu zobowiązania zostaną wysłaneSUBSCRIPTION_CANCELEDiSUBSCRIPTION_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, z zastrzeżeniem tych samych warunków co w przypadku wszystkich innych subskrypcji. Deweloperzy nie otrzymują płatności z góry, gdy użytkownik wykupuje subskrypcję ratalną.
Windykacja zaległych płatności: jeśli użytkownik nie dokona żadnej płatności ratalnej za subskrypcję, ani Google, ani Deweloper nie będą próbować odzyskać od użytkownika żadnych zaległych płatności, z wyjątkiem sytuacji, w których Google może okresowo ponawiać próbę płatności w okresie prolongaty lub zawieszenia konta zgodnie z normalnymi procedurami ponawiania płatności. Google nie ponosi odpowiedzialności wobec Dewelopera za pozostałe nieopłacone raty.
Dostępność Biblioteki płatności w Google Play: pole
installmentDetailsjest dostępne tylko w przypadku Biblioteki płatności w Google Play w wersji 7 lub nowszej. W przypadku PBL 5 i nowszych subskrypcja ratalna jest zwracana za pomocąqueryProductDetails(), ale nie zawiera szczegółowych informacji o ratach, takich jak liczba zobowiązań płatniczych w ramach planu.
Używanie precyzyjnych linków, aby umożliwić użytkownikom zarządzanie subskrypcją
Aplikacja powinna zawierać link na ekranie ustawień lub preferencji, który umożliwia użytkownikom zarządzanie subskrypcjami. Możesz go wkomponować w naturalny wygląd i styl aplikacji.
Możesz dodać precyzyjny link z aplikacji do centrum subskrypcji w Google Play w przypadku nieaktywnych subskrypcji, które możesz określić za pomocą pola subscriptionState w zasobie subskrypcji. W związku z tym istnieje kilka sposobów na utworzenie linku bezpośredniego do centrum subskrypcji w Sklepie Play.
Link do centrum subskrypcji
Użyj tego adresu URL, aby kierować użytkowników na stronę, na której wyświetlane są wszystkie ich subskrypcje, jak pokazano na ilustracjach 1 i 2:
https://play.google.com/store/account/subscriptions
Ten precyzyjny link może pomóc użytkownikowi przywrócić anulowaną subskrypcję w centrum subskrypcji w Sklepie Play.
Link do konkretnej strony zarządzania subskrypcjami (zalecane)
Aby utworzyć bezpośredni link do strony zarządzania nieaktywną subskrypcją, podaj nazwę pakietu i productId powiązane z zakupioną subskrypcją. Aby programowo określić productId w przypadku istniejącej subskrypcji, wyślij zapytanie do backendu aplikacji lub wywołaj funkcję BillingClient.queryPurchasesAsync(), aby uzyskać listę subskrypcji powiązanych z określonym użytkownikiem. Każda subskrypcja zawiera odpowiedni symbol productId w informacjach o stanie subskrypcji.
Każdy obiekt SubscriptionPurchaseLineItem powiązany z zakupem subskrypcji zawiera wartość productId powiązaną z subskrypcją, którą użytkownik kupił w tym elemencie zamówienia.
Użyj poniższego adresu URL, aby kierować użytkowników na konkretny ekran zarządzania subskrypcjami. Zastąp ciągi „your-sub-product-id” i „your-app-package” odpowiednio productId i nazwą pakietu aplikacji:
https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
Użytkownik może wtedy zarządzać formami płatności i korzystać z funkcji, takich jak anulowanie, ponowna subskrypcja i wstrzymanie.
Zezwalaj użytkownikom na przechodzenie na wyższą lub niższą wersję subskrypcji oraz na jej zmianę
Możesz udostępnić obecnym subskrybentom różne opcje zmiany abonamentu, aby lepiej dopasować go do ich potrzeb:
- Jeśli sprzedajesz kilka poziomów subskrypcji, np. „podstawowy” i „premium”, możesz umożliwić użytkownikom przełączanie się między nimi przez zakup innego abonamentu podstawowego lub innej oferty.
- Możesz zezwolić użytkownikom na zmianę bieżącego okresu rozliczeniowego, np. przejście z abonamentu miesięcznego na roczny.
- Możesz też zezwolić użytkownikom na przełączanie się między abonamentami odnawianymi automatycznie i przedpłaconymi.
Możesz zachęcić użytkowników do wprowadzenia tych zmian, oferując im subskrypcje, które zapewniają zniżkę kwalifikującym się użytkownikom. Możesz na przykład utworzyć ofertę zapewniającą 50% zniżki na pierwszy rok przy przejściu z abonamentu miesięcznego na roczny i ograniczyć tę ofertę do użytkowników, którzy subskrybują abonament miesięczny i nie skorzystali jeszcze z tej oferty. Więcej informacji o kryteriach kwalifikacji do korzystania z ofert znajdziesz w Centrum pomocy.
Ilustracja 3 przedstawia przykładową aplikację z 3 różnymi abonamentami:
Aplikacja może wyświetlać ekran podobny do tego na ilustracji 3, na którym użytkownicy będą mogli zmienić subskrypcję. W każdym przypadku użytkownicy powinni wiedzieć, jaki jest ich obecny abonament i jakie mają możliwości jego zmiany.
Gdy użytkownicy zdecydują się przejść na wyższą lub niższą wersję subskrypcji albo zmienić subskrypcję, możesz określić tryb zastępowania, który określa, jak zastosować proporcjonalną wartość bieżącego opłaconego okresu rozliczeniowego i kiedy nastąpi zmiana uprawnień.
Tryby zastępowania
W tabeli poniżej znajdziesz dostępne tryby zastępowania i przykłady ich użycia oraz liczbę płatności uznanych za zrealizowane.
Tryb zastępowania |
Opis |
Przykład użycia |
Zobowiązania do zapłaty zarejestrowane jako zapłacone (w przypadku wymiany subskrypcji ratalnej) |
|
Wersja subskrypcji zostanie zmieniona od razu. Pozostały czas zostanie dostosowany na podstawie różnicy w cenie i dodany do nowej subskrypcji przez przesunięcie daty następnej płatności. Jest to zachowanie domyślne. |
przejść na droższy poziom bez natychmiastowej dodatkowej płatności; |
0 |
|
Subskrypcja zostanie natychmiast uaktualniona, a cykl rozliczeniowy pozostanie 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. |
przejść na droższy poziom bez zmiany daty rozliczenia; |
1 |
|
Subskrypcja zostanie natychmiast przeniesiona na wyższą lub niższą wersję, a użytkownik zostanie natychmiast obciążony pełną ceną za nowe uprawnienia. Pozostała wartość z poprzedniej subskrypcji jest przenoszona na to samo uprawnienie lub proporcjonalnie rozdzielana w przypadku przejścia na inne uprawnienie. Uwaga: jeśli nowa subskrypcja ma bezpłatny okres próbny lub ofertę wprowadzającą, w momencie przejścia na wyższą lub niższą wersję użytkownik zostanie obciążony kwotą 0 PLN lub ceną oferty wprowadzającej (w zależności od tego, co ma zastosowanie). |
Przejście z krótszego na dłuższy okres rozliczeniowy. |
1 (Uwaga: 0, jeśli nowa subskrypcja ma bezpłatny okres próbny). |
|
Subskrypcja zostanie natychmiast zmieniona na wyższą lub niższą wersję, a nowa cena zostanie naliczona w momencie odnowienia subskrypcji. Cykl rozliczeniowy pozostaje bez zmian. |
Przejść na wyższy poziom subskrypcji, zachowując pozostały okres bezpłatny. |
0 |
|
Subskrypcja zostanie zmieniona na wyższą lub niższą wersję dopiero w momencie odnowienia, ale nowy zakup zostanie zrealizowany od razu i będzie zawierać te 2 elementy:
Uwaga: w przypadku subskrypcji z płatnościami ratalnymi zmiana abonamentu następuje na początku kolejnego okresu płatności. |
przejść na tańszy poziom wspierania; |
1 |
|
Harmonogram płatności za element subskrypcji pozostaje bez zmian w przypadku wymiany. |
Dodawanie lub usuwanie elementu subskrypcji z subskrypcji z dodatkami, gdy określony element powinien pozostać bez zmian. |
Nie dotyczy |
Więcej informacji o różnych zastosowaniach ofert przejścia na wyższy lub niższy pakiet w celu zwiększenia sprzedaży i odzyskania klientów znajdziesz w przewodniku po ofertach i promocjach.
Ustawianie trybu wymiany w przypadku zakupu
W zależności od preferencji i logiki biznesowej możesz używać różnych trybów zastępowania w przypadku różnych typów przejść na subskrypcję. W tej sekcji dowiesz się, jak ustawić tryb zastępowania w przypadku zmiany subskrypcji, oraz poznasz obowiązujące ograniczenia.
Ponowne subskrybowanie lub przełączanie się między abonamentami w ramach tej samej subskrypcji
W Konsoli Google Play możesz określić domyślny tryb zastępowania. To ustawienie pozwala wybrać, kiedy obecni subskrybenci mają być obciążani płatnością, jeśli kupią inny abonament podstawowy lub inną ofertę w ramach tej samej subskrypcji albo ponownie zasubskrybują usługę po anulowaniu subskrypcji. Dostępne opcje to Obciąż od razu, co odpowiada CHARGE_FULL_PRICE, oraz Obciąż w dniu kolejnej płatności, co odpowiada WITHOUT_PRORATION. Są to jedyne odpowiednie tryby zastępowania w przypadku zmiany abonamentu podstawowego w ramach tej samej subskrypcji.
Jeśli na przykład wdrażasz ofertę ponownego zakupu tego samego abonamentu po anulowaniu go przez użytkownika, ale przed zakończeniem subskrypcji, możesz przetworzyć nowy zakup jako zwykły zakup bez podawania żadnych wartości w parametrze SubscriptionUpdateParams. System używa domyślnego trybu zastępowania skonfigurowanego w subskrypcji i automatycznie obsługuje przejście z poprzedniego zakupu na nowy.
Przełączanie pakietów w ramach subskrypcji lub zastępowanie domyślnego trybu wymiany
Jeśli użytkownik zmienia usługi subskrypcyjne – kupuje inną subskrypcję – lub jeśli z jakiegokolwiek powodu chcesz zastąpić domyślny tryb wymiany, określ stawkę proporcjonalną w czasie działania w ramach parametrów procesu zakupu.
Aby prawidłowo podać
ReplacementMode
w SubscriptionProductReplacementParams lub SubscriptionUpdateParams w ramach konfiguracji procesu zakupu w czasie działania, pamiętaj o tych ograniczeniach:
- Podczas przechodzenia na wyższą lub niższą wersję subskrypcji albo inicjowania zmiany subskrypcji na abonament przedpłacony z abonamentu przedpłaconego, abonamentu odnawianego automatycznie lub abonamentu ratalnego jedynym dozwolonym trybem zastępowania jest
CHARGE_FULL_PRICE. Jeśli określisz inny tryb wymiany, zakup się nie powiedzie, a użytkownikowi wyświetli się błąd. - Podczas przełączania planów w ramach tej samej subskrypcji na plan odnawiany automatycznie z planu przedpłaconego lub planu odnawianego automatycznie obowiązują tryby proporcjonalnego rozliczenia
CHARGE_FULL_PRICEiWITHOUT_PRORATION. Jeśli określisz inny tryb proporcjonalnego rozliczania, zakup się nie powiedzie, a użytkownikowi zostanie wyświetlony błąd. - Przełączanie planów w ramach tego samego produktu subskrypcyjnego z abonamentu podstawowego opartego na ratach na abonament podstawowy nieoparty na ratach jest niedozwolone.
- Jeśli używasz trybu wymiany
KEEP_EXISTINGwSubscriptionProductReplacementParams, aby zachować niezmienioną płatność za produkt podczas wymiany, stary identyfikator produktu powinien być taki sam jak identyfikator nowego produktu. TrybKEEP_EXISTINGnie jest obsługiwany w przypadkuSubscriptionUpdateParams.
Przykłady i zachowania związane z zastępowaniem
Aby zrozumieć, jak działa każdy tryb proporcjonalnego rozliczania, przyjrzyjmy się takiemu scenariuszowi:
Samwise ma subskrypcję treści online w aplikacji Country Gardener. Ma miesięczną subskrypcję treści w wersji poziomu 1, która zawiera tylko tekst. Ta subskrypcja kosztuje 2 USD miesięcznie i odnawia się pierwszego dnia każdego miesiąca.
15 kwietnia Samwise zdecydował się przejść na roczną wersję subskrypcji Poziom 2, która obejmuje aktualizacje wideo i kosztuje 36 USD rocznie.
Podczas uaktualniania subskrypcji deweloper wybiera tryb proporcjonalnego rozliczenia. Poniższa lista opisuje, jak każdy tryb proporcjonalnego rozliczenia wpływa na subskrypcję Samwise:
WITH_TIME_PRORATION
Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Zapłacił za cały miesiąc (1–30 kwietnia), ale zmienił subskrypcję w połowie okresu subskrypcji, więc połowa miesięcznej subskrypcji (1 zł) została zastosowana do nowej subskrypcji. Ponieważ jednak nowy abonament kosztuje 36 USD rocznie, saldo środków w wysokości 1 USD wystarczy tylko na 10 dni (16–25 kwietnia). 26 kwietnia zostanie więc obciążony kwotą 36 USD za nowy abonament, a następnie 26 kwietnia każdego kolejnego roku.
Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu. Nowy zakup będzie można pobrać w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.
CHARGE_PRORATED_PRICE
Ten tryb może być używany, ponieważ cena subskrypcji poziomu 2 za jednostkę czasu (36 USD rocznie = 3 USD miesięcznie) jest wyższa niż cena subskrypcji poziomu 1 za jednostkę czasu (2 USD miesięcznie). Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Ponieważ zapłacił za cały miesiąc, ale wykorzystał tylko połowę, do nowej subskrypcji zostanie zastosowana połowa miesięcznej subskrypcji (1 PLN). Nowa subskrypcja kosztuje 36 PLN rocznie, więc pozostałe 15 dni kosztuje 1,50 PLN. W związku z tym za nową subskrypcję zostanie pobrana różnica w wysokości 0,50 PLN. 1 maja Samwise zostanie obciążony kwotą 36 zł za nowy poziom subskrypcji, a następnie 1 maja każdego kolejnego roku.
Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu. Nowy zakup będzie można pobrać w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.
WITHOUT_PRORATION
Subskrypcja Samwise'a na poziomie 1 zostaje natychmiast uaktualniona do poziomu 2 bez dodatkowych opłat. 1 maja pobieramy od niego 36 USD za nowy poziom subskrypcji, a następnie 1 maja każdego kolejnego roku pobieramy kolejne 36 USD.
Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu. Nowy zakup będzie można pobrać w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów.
DEFERRED
Subskrypcja poziomu 1 Samwise’a będzie aktywna do 30 kwietnia. 1 maja zacznie obowiązywać subskrypcja poziomu 2, a Samwise zostanie obciążony kwotą 36 PLN za nowy poziom subskrypcji.
Funkcję PurchasesUpdatedListener aplikacji należy wywołać natychmiast po pomyślnym zakończeniu zakupu. Nowy zakup będzie można pobrać w ramach wywołania funkcji queryPurchasesAsync(). Twój backend natychmiast otrzymuje SUBSCRIPTION_PURCHASEDpowiadomienie w czasie rzeczywistym dla deweloperów. Przetwórz zakup w taki sam sposób, jak każdy inny nowy zakup w tym momencie. W szczególności potwierdź nowy zakup. Pamiętaj, że startTime nowej subskrypcji jest wypełniana w momencie wejścia w życie zastąpienia, czyli po wygaśnięciu starej subskrypcji. W tym momencie otrzymasz SUBSCRIPTION_RENEWED RTDN dla nowego abonamentu. Więcej informacji o działaniu funkcji ReplacementMode.DEFERRED znajdziesz w artykule Obsługa odroczonej zamiany.
CHARGE_FULL_PRICE
Subskrypcja poziomu 1 Samwise’a zostanie natychmiast zakończona. Jego subskrypcja poziomu 2 rozpoczyna się dzisiaj i zostanie obciążony opłatą w wysokości 36 PLN. Zapłacił za cały miesiąc, ale wykorzystał tylko połowę, więc połowa miesięcznej subskrypcji (1 PLN) zostanie zastosowana do nowej subskrypcji. Ponieważ nowa subskrypcja kosztuje 36 zł rocznie, do okresu subskrypcji zostanie dodana 1/36 roku (ok. 10 dni). Dlatego następna opłata za subskrypcję Samwise'a zostanie pobrana za rok i 10 dni od dzisiaj i wyniesie 36 zł. Potem co roku będzie obciążany kwotą 36 zł.
Wybierając tryb proporcjonalnego podziału, zapoznaj się z naszymi rekomendacjami dotyczącymi zastępowania.
KEEP_EXISTING
Samwise ma subskrypcję treści online z aplikacji Country Gardener. Ma miesięczną subskrypcję pakietu 1, który zapewnia dostęp do podstawowych treści. Subskrypcja kosztuje 2 USD miesięcznie przez 3 miesiące, a potem 4 USD miesięcznie. Samwise kupił ten produkt 1 kwietnia. Aplikacja Country Gardener oferuje Plan 2 jako dodatkową zawartość specjalistyczną za 3 USD miesięcznie. 15 kwietnia Samwise dodał do subskrypcji aplikacji Country Gardener abonament 2, zachowując dotychczasowy abonament 1. Harmonogram płatności Samwise'a wygląda tak:
- Proporcjonalna cena za Plan 2 w wysokości 1,50 USD, płatna 15 kwietnia.
- Cena 5,00 USD miesięcznie przez kolejne 2 miesiące obejmująca zarówno cenę wprowadzenia pakietu 1, jak i cenę standardową pakietu 2.
- Potem będziesz płacić stałą miesięczną opłatę w wysokości 7, 00 USD.
Wprowadzanie zmian w subskrypcji w aplikacji
Aplikacja może zaoferować użytkownikom przejście na wyższą lub niższą wersję subskrypcji, wykonując te same czynności co w przypadku uruchamiania procesu zakupu. Jeśli jednak chcesz przejść na wyższą lub niższą wersję, musisz podać szczegóły bieżącej subskrypcji, przyszłej subskrypcji (wyższej lub niższej) oraz trybu zastępowania.
Użyj parametru SubscriptionProductReplacementParams do wymiany (zalecane)
Poniższy przykład pokazuje, jak zaktualizować subskrypcję za pomocą SubscriptionProductReplacementParams.
Obiekt
BillingFlowParams.ProductDetailsParamsma teraz metodęsetSubscriptionProductReplacementParams()do określania informacji o wymianie na poziomie produktu.SubscriptionProductReplacementParamsma 2 metody ustawiające:setOldProductId:Jest to stary produkt, który zostanie zastąpiony produktem w bieżącymProductDetails.setReplacementMode:Jest to tryb wymiany na poziomie produktu. Tryby te są zasadniczo takie same jakSubscriptionUpdateParams, ale zaktualizowano mapowanie wartości.
Istniejące parametry aktualizacji poziomu zakupu
BillingFlowParams.setSubscriptionUpdateParams()należy utworzyć za pomocąsetOldPurchaseToken().Gdy funkcja
setSubscriptionProductReplacementParams()zostanie wywołana w przypadku dowolnego z elementówProductDetailsParams, funkcjaSubscriptionUpdateParams.setSubscriptionReplacementMode()nie będzie miała żadnego efektu.
Poniższy przykładowy kod pokazuje, jak zmienić plan subskrypcji z (old_product_1, old_product_2) na (product_1, product_2, product_3). W tym scenariuszu product_1 zastępuje old_product_1, product_2 zastępuje old_product_2, a product_3 jest natychmiast dodawany do subskrypcji.
Kotlin
val billingClient: BillingClient = ... val replacementModeForBasePlan: Int = ... val replacementModeForAddon: Int = ... val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token" // ProductDetails instances obtained from queryProductDetailsAsync(); val productDetailsParams1 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails1_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan) .build() ) .build() val productDetailsParams2 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails2_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon) .build() ) .build() // Example for a third item without replacement params val productDetailsParams3 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails3_obj) // Required: Set the ProductDetails object .build() val newProductDetailsList = listOf( productDetailsParams1, productDetailsParams2, productDetailsParams3 ) val billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build() ) .setProductDetailsParamsList(newProductDetailsList) .build() // To launch the billing flow: // billingClient.launchBillingFlow(activity, billingFlowParams)
Java
BillingClient billingClient = …; int replacementModeForBasePlan =…; int replacementModeForAddon =…; // ProductDetails obtained from queryProductDetailsAsync(). ProductDetailsParams productDetails1 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan)) .build(); ProductDetailsParams productDetails2 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon)) .build(); ProductDetailsParams productDetails3 = ...; ArrayListnewProductDetailsList = new ArrayList<>(); newProductDetailsList.add(productDetails1); newProductDetailsList.add(productDetails2); newProductDetailsList.add(productDetails3); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build()) .setProductDetailsParamsList(productDetailsList) .build(); billingClient.launchBillingFlow(billingFlowParams);
Ustawianie parametru SubscriptionUpdateParams dla wymiany (wycofane)
Poniższy przykład pokazuje, jak zaktualizować subskrypcję za pomocą SubscriptionUpdateParams.
Kotlin
val offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken() val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList( listOf( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build() ) ).setSubscriptionUpdateParams( BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode( BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE ) .build() ).build() billingClient.launchBillingFlow( activity, billingParams ) // ...
Java
String offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken(); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList( ImmuableList.of( ProductDetailsParams.newBuilder() // fetched via queryProductDetailsAsync .setProductDetails(productDetails) // offerToken can be found in // ProductDetails=>SubscriptionOfferDetails .setOfferToken(offerToken) .build())) .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() // purchaseToken can be found in Purchase#getPurchaseToken .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE) .build()) .build(); BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams); // ...
Rekomendacje dotyczące wymiany
W tabeli poniżej znajdziesz różne scenariusze proporcjonalnego rozliczania wraz z naszymi zaleceniami dotyczącymi każdego z nich:
| Scenariusz | Zalecany tryb wymiany | Wynik |
|---|---|---|
| Przejście na droższy poziom | CHARGE_PRORATED_PRICE |
Użytkownik od razu uzyskuje dostęp, a okres rozliczeniowy pozostaje bez zmian. |
| Przejście na tańszy poziom | DEFERRED |
Użytkownik zapłacił już za droższy poziom, więc zachowa dostęp do korzyści związanych z tym poziomem aż do następnego terminu płatności. |
| Przejście na wyższą wersję podczas bezpłatnego okresu próbnego z zachowaniem okresu próbnego | WITHOUT_PRORATION |
Użytkownik przechodzi na wyższy poziom na pozostałą część okresu próbnego bez dodatkowych opłat. |
| Przejście na wyższą wersję podczas bezpłatnego okresu próbnego – zakończenie dostępu do bezpłatnego okresu próbnego | CHARGE_PRORATED_PRICE |
Użytkownik od razu uzyskuje dostęp do nowego poziomu, a pozostała wartość bezpłatnego okresu próbnego zostaje przeniesiona. Przeniesiona wartość jest obliczana na podstawie ceny abonamentu podstawowego. |
| zachowanie harmonogramu płatności niektórych produktów subskrypcyjnych podczas dodawania lub usuwania innych produktów subskrypcyjnych z subskrypcji z dodatkami; | KEEP_EXISTING |
Użytkownik nadal płaci starą cenę za niezmieniony produkt. Nowe produkty są dodawane od razu. Inne stare elementy można zastąpić, określając tryb zastępowania, lub usunąć. |
Obsługa zakupów związanych ze zmianą subskrypcji
Zmiana abonamentu jest nowym zakupem we wszystkich aspektach i celach. Po pomyślnym zakończeniu procesu rozliczeniowego powinna być przetwarzana i potwierdzana jako taka. Oprócz prawidłowego przetworzenia nowego zakupu musisz wycofać zakup, który jest zastępowany.
Działanie w aplikacji jest takie samo jak w przypadku każdego nowego zakupu. Aplikacja otrzyma wynik nowego zakupu w PurchasesUpdatedListener, a nowy zakup będzie dostępny w queryPurchasesAsync.
Interfejs Google Play Developer API zwraca wartość linkedPurchaseToken w zasobie subskrypcji, gdy zakup zastępuje istniejący. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken, aby mieć pewność, że stary token nie będzie używany do uzyskiwania dostępu do Twoich usług. Więcej informacji o obsłudze zakupu wyższej lub niższej wersji znajdziesz w artykule Zmiana wersji i ponowna rejestracja.
Gdy otrzymasz nowy token zakupu, przeprowadź ten sam proces weryfikacji co w przypadku weryfikacji nowego tokena zakupu. Pamiętaj, aby potwierdzać te zakupy za pomocą funkcji BillingClient.acknowledgePurchase() z biblioteki Płatności w Google Play lub Purchases.subscriptions:acknowledge z interfejsu Google Play Developer API.
Obsługa odroczonej wymiany
Tryb odroczonej wymiany pozwala użytkownikowi wykorzystać pozostałe środki w starym abonamencie przed rozpoczęciem korzystania z nowego.
Gdy w przypadku nowego zakupu użyjesz wartości ReplacementMode.DEFERRED, funkcja queryPurchasesAsync() zwróci nowy token zakupu po zakończeniu procesu zakupu. Token ten pozostanie powiązany ze starym produktem do czasu odroczonej wymiany, która nastąpi w dniu kolejnego odnowienia. Po tym czasie zostanie zwrócony nowy produkt.
W przeszłości można było osiągnąć takie wrażenia użytkownika za pomocą wycofanej funkcji ProrationMode.DEFERRED, ale ProrationMode.DEFERRED została wycofana w Bibliotece płatności w Play 6. W tej tabeli znajdziesz informacje o różnicach w działaniu:
Godzina |
ProrationMode.DEFERRED (wycofano) |
ReplacementMode.DEFERRED |
Bezpośrednio po zakończeniu procesu zakupu (aplikacja) |
Uprawnienia do starego abonamentu będą obowiązywać do następnej daty odnowienia. Aby mieć pewność, że aplikacja przyznaje odpowiednie uprawnienia, funkcja Nowy token zakupu nie jest widoczny, więc nie można go teraz przetworzyć. |
Funkcja
Wyświetlany jest nowy token zakupu, więc w tym momencie należy go przetworzyć, uwzględniając czas wymiany. |
Bezpośrednio po zakończeniu procesu zakupu (backend) |
Po zakończeniu procesu zakupu nie jest wysyłany RTDN SUBSCRIPTION_PURCHASED. System zaplecza nie został jeszcze poinformowany o nowym zakupie. |
SUBSCRIPTION_PURCHASED RTDN ze starym identyfikatorem produktu jest wysyłany natychmiast po zakończeniu procesu zakupu nowego tokena zakupu. Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z parametrem „startTime” wskazującym czas zakupu z 2 elementami zamówienia:
Wysłano SUBSCRIPTION_EXPIRED w przypadku starego tokena zakupu. Gdy wywołasz metodę purchases.subscriptionsv2.get z tokenem zakupu old, pojawi się ona jako wygasła (uprawnienie do starego abonamentu zostanie przeniesione na nowy zakup na pozostały czas). |
Wymiana – pierwsze odnowienie po procesie zakupu (aplikacja) |
Nowy token zakupu jest teraz widoczny, więc należy go przetworzyć. |
Nowy zakup powinien zostać przetworzony już po zakończeniu procesu zakupu, więc aplikacja nie powinna podejmować żadnych specjalnych działań poza upewnieniem się, że przyznano odpowiednie uprawnienie. |
Wymiana – pierwsze odnowienie po procesie zakupu (backend) |
Nowy zakup można teraz przetworzyć i potwierdzić, gdy zostanie wysłane pierwsze powiadomienie RTDN SUBSCRIPTION_RENEWED. Symbol |
Nowy zakup został przetworzony i potwierdzony, gdy wysłano RTDN SUBSCRIPTION_PURCHASED dla nowego tokena zakupu i zarejestrowano go jako „startTime”. W przypadku ReplacementMode.DEFERRED pierwsze odnowienia działają tak samo jak każde inne odnowienia i nie musisz obsługiwać specjalnej logiki zastępowania, gdy to zdarzenie wystąpi. Wywołanie metody purchases.subscriptionsv2.get z nowym tokenem zakupu zwraca zakup z 2 elementami zamówienia:
|
Zamiast wycofanego ProrationMode.DEFERRED należy od teraz używać ReplacementMode.DEFERRED, ponieważ w przypadku zmian uprawnień działa on tak samo, ale oferuje sposób zarządzania zakupem, który jest bardziej spójny z zachowaniami w przypadku innych nowych zakupów.
Zarządzanie klientami
Dzięki powiadomieniom w czasie rzeczywistym dla deweloperów możesz w czasie rzeczywistym wykrywać, kiedy użytkownik zdecyduje się anulować subskrypcję. Gdy użytkownik anuluje subskrypcję, ale zanim wygaśnie, możesz wysłać mu powiadomienia push lub wiadomości w aplikacji z prośbą o ponowne zasubskrybowanie.
Gdy użytkownik anuluje subskrypcję, możesz spróbować go odzyskać w aplikacji lub w Sklepie Play. W tabeli poniżej opisujemy różne scenariusze subskrypcji wraz z powiązanymi działaniami mającymi na celu odzyskanie klientów i wymaganiami dotyczącymi aplikacji.
| Przed wygaśnięciem subskrypcji | Po wygaśnięciu subskrypcji | |||
| W aplikacji | W Sklepie Play | W aplikacji | W Sklepie Play | |
| Funkcja odzyskiwania klientów | Subskrypcja w aplikacji | Przywróć | Subskrypcja w aplikacji | Subskrybuj ponownie |
| Użytkownik przechodzi proces płatności | Tak | Nie | Tak | Tak |
| Subskrypcja użytkownika pozostaje powiązana z tym samym kodem SKU | Użytkownik może zarejestrować się w ramach tego samego lub innego SKU | Tak | Użytkownik może zarejestrować się w ramach tego samego lub innego SKU | Tak |
| Tworzy nowy token zakupu | Tak | Nie | Tak | Tak |
| Domyślnie włączona | Nie | Tak, pomoc jest wymagana w przypadku wszystkich deweloperów | Nie |
Aplikacje bez Biblioteki płatności w wersji 2.0 lub nowszej: nie Aplikacje korzystające z Biblioteki płatności w wersji 2.0 lub nowszej: tak. Deweloperzy mogą zrezygnować z tej opcji w konsoli. |
| Kiedy użytkownik zostanie obciążony opłatą |
Jeśli używasz tego samego kodu SKU: koniec bieżącego okresu rozliczeniowego. Jeśli używasz innego numeru SKU: zależy od trybu proporcjonalnego rozliczania. |
Koniec bieżącego okresu rozliczeniowego | Natychmiast | Natychmiast |
| Wymagana implementacja | udostępniać w aplikacji interfejs ponownej rejestracji; |
Wykrywanie zmiany stanu subskrypcji Precyzyjny link do Sklepu Play |
Udostępnij w aplikacji interfejs ponownej rejestracji | Obsługa zakupów poza aplikacją |
Przed wygaśnięciem subskrypcji – w aplikacji
W przypadku subskrypcji, które zostały anulowane, ale jeszcze nie wygasły, możesz zezwolić subskrybentom na przywrócenie subskrypcji w aplikacji, stosując ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Sprawdź, czy interfejs użytkownika informuje, że użytkownik ma już subskrypcję. Możesz na przykład wyświetlić aktualną datę wygaśnięcia subskrypcji i cenę cykliczną z przyciskiem Ponownie aktywuj.
Najczęściej warto zaoferować użytkownikowi tę samą cenę i ten sam SKU, które były już przez niego subskrybowane:
- rozpocząć nowy zakup subskrypcji z tym samym kodem SKU;
- Nowa subskrypcja zastępuje starą i odnawia się w tym samym dniu wygaśnięcia. Stara subskrypcja zostanie natychmiast oznaczona jako wygasła.
- Na przykład Achilles ma subskrypcję aplikacji Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje miesięczny abonament w tej samej cenie miesięcznej. Nowa subskrypcja jest proporcjonalnie rozliczana z pozostałymi środkami, jest natychmiast aktywna i nadal odnawia się 1 sierpnia.
Jeśli chcesz zaoferować inną cenę, na przykład nowy bezpłatny okres próbny lub zniżkę dla powracających użytkowników, możesz zamiast tego zaoferować użytkownikowi inny identyfikator SKU:
- Zainicjuj przejście na wyższy lub niższy plan z innym kodem SKU, używając trybu zastępowania
WITHOUT_PRORATION. - Nowa subskrypcja zastępuje starą i odnawia się w tym samym dniu wygaśnięcia. Użytkownik zostanie obciążony ceną nowego kodu SKU, w tym cenami wprowadzającymi, w pierwotnym terminie wygaśnięcia. Jeśli stara subskrypcja została utworzona przy użyciu zamaskowanego identyfikatora konta, ten sam identyfikator powinien być przekazywany do
BillingFlowParamsw przypadku uaktualnień i obniżeń wersji. - Na przykład Achilles ma subskrypcję aplikacji Example Music App, która wygasa 1 sierpnia. 10 lipca ponownie subskrybuje roczną subskrypcję w cenie dla nowych użytkowników. Nowa subskrypcja jest od razu aktywna, a użytkownikowi zostanie naliczona cena wprowadzająca 1 sierpnia.
- Jeśli zdecydujesz się uwzględnić bezpłatny okres próbny lub cenę początkową w jednostce SKU oferty powrotnej, upewnij się, że użytkownik kwalifikuje się do skorzystania z niej. W tym celu odznacz pole Zezwalaj na 1 bezpłatny okres próbny na aplikację w konsoli Google Play. Ograniczy to możliwość skorzystania z bezpłatnego okresu próbnego do 1 na aplikację.
Gdy otrzymasz token zakupu, przetwórz zakup tak samo jak w przypadku nowej subskrypcji. Dodatkowo interfejs Google Play Developer API zwraca w zasobie subskrypcji wartość linkedPurchaseToken. Pamiętaj, aby unieważnić token podany w linkedPurchaseToken, aby mieć pewność, że stary token nie będzie używany do uzyskiwania dostępu do Twoich usług.
Przed wygaśnięciem subskrypcji – w Sklepie Play
Gdy subskrypcja jest anulowana, ale nadal aktywna, użytkownicy mogą ją przywrócić w centrum subskrypcji Google Play, klikając Ponownie zasubskrybuj (wcześniej Przywróć). Zachowasz tę samą subskrypcję i token zakupu.
Więcej informacji o przywracaniu subskrypcji znajdziesz w sekcji Przywracanie.
Po wygaśnięciu subskrypcji – w aplikacji
Możesz zezwolić subskrybentom, których subskrypcja wygasła, na ponowne zasubskrybowanie usługi w aplikacji, stosując ten sam proces zakupu produktu w aplikacji co w przypadku nowych subskrybentów. Uwaga:
- Aby zaoferować użytkownikom rabat, możesz udostępnić identyfikator produktu ze specjalnymi cenami subskrypcji, zwany też kodem SKU zachęcającym do powrotu. Możesz udostępnić ofertę w aplikacji lub powiadomić o niej użytkownika poza aplikacją, np. w e-mailu.
- Aby rozpocząć subskrypcję odzyskaną, uruchom proces zakupu w aplikacji na Androida za pomocą Biblioteki płatności w Google Play. Jest to taki sam proces jak w przypadku nowej subskrypcji, ale możesz określić kod SKU dostępny dla użytkownika.
- Jeśli zdecydujesz się uwzględnić bezpłatny okres próbny lub cenę początkową w jednostce SKU oferty powrotnej, upewnij się, że użytkownik kwalifikuje się do skorzystania z niej. W tym celu odznacz w Konsoli Play pole wyboru Zezwalaj na 1 bezpłatny okres próbny na aplikację, co ograniczy możliwość skorzystania z bezpłatnego okresu próbnego do 1 na aplikację.
- Jeśli użytkownik ponownie zasubskrybuje ten sam SKU, nie będzie już mógł skorzystać z bezpłatnego okresu próbnego ani ceny początkowej. Upewnij się, że interfejs użytkownika to odzwierciedla.
Gdy otrzymasz token zakupu, przetwórz zakup tak samo jak w przypadku nowej subskrypcji. Nie otrzymasz linkedPurchaseToken w zasobie subskrypcji.
Po wygaśnięciu subskrypcji – w Sklepie Play
Jeśli ta opcja jest włączona, użytkownicy mogą ponownie subskrybować ten sam kod SKU przez maksymalnie rok od wygaśnięcia subskrypcji, klikając Odnów subskrypcję w centrum subskrypcji Google Play. Spowoduje to wygenerowanie nowego tokena subskrypcji i zakupu.
Ponowne subskrybowanie jest traktowane jako zakup poza aplikacją, więc stosuj sprawdzone metody obsługi zakupów dokonywanych poza aplikacją.
Promowanie subskrypcji
Możesz utworzyć kody promocyjne, aby dać wybranym użytkownikom dłuższy bezpłatny okres próbny istniejącej subskrypcji. Więcej informacji znajdziesz w sekcji Kody promocyjne.
W przypadku bezpłatnych okresów próbnych Google Play sprawdza, czy użytkownik ma ważną formę płatności, zanim rozpocznie korzystanie z bezpłatnej wersji próbnej. Niektórzy użytkownicy mogą zobaczyć tę weryfikację jako blokadę lub obciążenie na koncie formy płatności. Ta blokada lub obciążenie jest tymczasowe i zostanie później cofnięte lub zwrócone.
Po zakończeniu okresu próbnego forma płatności wybrana przez użytkownika zostanie obciążona pełną ceną subskrypcji.
Jeśli użytkownik anuluje subskrypcję w dowolnym momencie bezpłatnego okresu próbnego, subskrypcja pozostanie aktywna do końca tego okresu i nie zostanie naliczona opłata po jego zakończeniu.
Anulowanie lub wycofywanie
Za pomocą interfejsu Google Play Developer API możesz anulować lub cofnąć subskrypcję. Ta funkcja jest też dostępna w Konsoli Google Play.
Anulowanie: użytkownicy mogą anulować subskrypcję w Google Play. Możesz też udostępnić użytkownikom opcję anulowania subskrypcji w aplikacji lub witrynie. Aplikacja powinna obsługiwać te anulowania w sposób opisany w sekcji Anulowania.
Anulowanie: gdy anulujesz subskrypcję, użytkownik natychmiast traci do niej dostęp. Możesz z niej skorzystać np. w sytuacji, gdy wystąpił błąd techniczny, który uniemożliwił użytkownikowi dostęp do Twojej usługi, a użytkownik nie chce dalej z niej korzystać. Aplikacja powinna obsługiwać te anulowania w sposób opisany w sekcji Cofnięcia.
W tabeli poniżej przedstawiono różnice między anulowaniem a cofnięciem.
| Zatrzymuje odnawianie | Unieważnij dostęp | |
| Anuluj | Tak | Nie |
| Wycofaj | Tak | Tak |
Odroczenie płatności za subskrypcję
Możesz przesunąć datę następnej płatności dla subskrybenta, który korzysta z automatycznego odnawiania, używając funkcji
Purchases.subscriptions:defer
z interfejsu Google Play Developer API. W tym okresie użytkownik jest subskrybentem Twoich treści i ma do nich pełny dostęp, ale nie są od niego pobierane opłaty. Data odnowienia subskrypcji zostanie zmieniona na nową.
W przypadku abonamentów przedpłaconych możesz użyć interfejsu defer billing API, aby odroczyć datę wygaśnięcia.
Odroczone rozliczenia umożliwiają:
- Udostępnij użytkownikom bezpłatny dostęp w ramach specjalnej oferty, np. tygodniowy bezpłatny dostęp za zakup filmu.
- zapewnić klientom bezpłatny dostęp w ramach gestu dobrej woli;
Rozliczenie można odroczyć o 1 dzień lub nawet o rok w przypadku każdego wywołania interfejsu API. Aby jeszcze bardziej odroczyć rozliczenie, możesz ponownie wywołać interfejs API przed nową datą rozliczenia.
Darcy ma miesięczną subskrypcję treści online w aplikacji Fishing Quarterly. Zwykle 1 dnia każdego miesiąca pobierana jest od niej opłata w wysokości 1, 25 GBP. W marcu wzięła udział w ankiecie online dla wydawcy aplikacji. Wydawca nagradza ją 6 tygodniami bezpłatnego dostępu, odraczając następną płatność do 15 maja, czyli 6 tygodni po pierwotnej dacie rozliczenia, która przypadała na 3 kwietnia.
- Darcy nie zostanie obciążona opłatą za kwiecień ani początek maja, ale nadal będzie mieć dostęp do treści. 15 maja zostanie naliczona standardowa opłata za subskrypcję w wysokości 1, 25 GBP za miesiąc. Jej następna data odnowienia to 15 czerwca.
Jeśli odraczasz płatność, możesz powiadomić użytkownika e-mailem lub w aplikacji, że data płatności została zmieniona.
Rozwiązywanie problemów z odrzuconymi płatnościami
Jeśli wystąpią problemy z płatnością za odnowienie subskrypcji, Google będzie okresowo podejmować próby odnowienia subskrypcji przez pewien czas, zanim ją anuluje. Ten okres, w którym można odzyskać dostęp do subskrypcji, może składać się z okresu prolongaty, po którym następuje okres zawieszenia konta. W tym czasie Google wysyła użytkownikowi e-maile i powiadomienia z prośbą o zaktualizowanie formy płatności.
Jeśli płatność zostanie odrzucona, subskrypcja przejdzie w okres prolongaty, jeśli jest on skonfigurowany. W okresie prolongaty należy zapewnić użytkownikowi dostęp do uprawnień w ramach subskrypcji.
Po zakończeniu okresu prolongaty subskrypcja przechodzi w okres zawieszenia konta. Gdy konto jest zawieszone, użytkownik nie powinien mieć dostępu do uprawnień w ramach subskrypcji.
W Konsoli Google Play możesz określić długość okresu prolongaty i zawieszenia konta dla każdego abonamentu podstawowego odnawianego automatycznie. Ustawienie okresu krótszego niż wartości domyślne może zmniejszyć liczbę subskrypcji odzyskanych w przypadku odrzucenia płatności.
Aby zwiększyć prawdopodobieństwo odzyskania subskrypcji w przypadku odrzucenia płatności, możesz poinformować użytkownika o problemie z płatnością i poprosić go o jego rozwiązanie.
Możesz to zrobić samodzielnie, zgodnie z opisem w sekcjach okres prolongaty i zawieszenie konta, lub możesz zaimplementować interfejs In-App Messaging API, w którym Google wyświetla użytkownikom komunikat w Twojej aplikacji.
Wysyłanie wiadomości w aplikacji
Jeśli masz włączone wysyłanie wiadomości w aplikacji za pomocą InAppMessageCategoryId.TRANSACTIONAL, Google Play będzie wyświetlać użytkownikom wiadomości w okresie prolongaty i zawieszenia konta raz dziennie, dając im możliwość naprawienia problemu z płatnością bez opuszczania aplikacji.
Zalecamy wywoływanie tego interfejsu API za każdym razem, gdy użytkownik otworzy aplikację, aby określić, czy wiadomość powinna być wyświetlana.
Jeśli użytkownikowi uda się odzyskać subskrypcję, otrzymasz kod odpowiedzi SUBSCRIPTION_STATUS_UPDATED wraz z tokenem zakupu. Następnie użyj tego tokena zakupu, aby wywołać interfejs Google Play Developer API i odświeżyć stan subskrypcji w aplikacji.
Integrowanie wysyłania wiadomości w aplikacji
Aby wyświetlać użytkownikom wiadomości w aplikacji, użyj kodu BillingClient.showInAppMessages().
Oto przykład wywoływania przepływu wiadomości w aplikacji:
Kotlin
val inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build() billingClient.showInAppMessages(activity, inAppMessageParams, object : InAppMessageResponseListener() { override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } })
Java
InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build(); billingClient.showInAppMessages(activity, inAppMessageParams, new InAppMessageResponseListener() { @Override public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } });
Obsługa oczekujących transakcji dotyczących subskrypcji
Transakcje oczekujące mogą wystąpić podczas pierwszego zakupu, doładowania, przejścia na wyższą lub niższą wersję. Zakup subskrypcji rozpoczyna się od stanu SUBSCRIPTION_STATE_PENDING, a następnie przechodzi do stanu SUBSCRIPTION_STATE_ACTIVE. Jeśli transakcja wygaśnie lub zostanie anulowana przez użytkownika, przechodzi do stanu SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED. Uprawnienia użytkownika musisz zaktualizować dopiero po zakończeniu transakcji.
Zmiana stanu subskrypcji w przypadku początkowego zakupu z oczekującymi transakcjami jest prosta. Gdy użytkownik zainicjuje transakcję oczekującą, Twoja aplikacja otrzyma Purchase ze stanem PENDING. Po zakończeniu transakcji aplikacja ponownie otrzyma Purchase ze stanem zaktualizowanym do PURCHASED. Wiadomość o typie SUBSCRIPTION_PURCHASED jest wysyłana do klienta RTDN.SubscriptionNotification Wykonaj typowe czynności związane z weryfikacją zakupu, przyznaniem użytkownikowi dostępu do treści i potwierdzeniem zakupu. Jeśli transakcja wygaśnie lub zostanie anulowana, do klienta RTDN zostanie wysłana wiadomość SubscriptionNotification o typie SUBSCRIPTION_PENDING_PURCHASE_CANCELED. W takich przypadkach użytkownik nigdy nie powinien uzyskać dostępu do treści.
Doładowanie, przejście na wyższą lub niższą wersję usługi z oczekującymi transakcjami wiąże się ze zmianami stanu zarówno starej, jak i nowej subskrypcji. Gdy użytkownik zainicjuje oczekującą transakcję doładowania, przejścia na wyższą lub niższą wersję, Twoja aplikacja otrzyma token Purchase dla starej subskrypcji z obiektem PendingPurchaseUpdate. W tym momencie użytkownik nadal ma starą subskrypcję i nie uzyskał jeszcze nowej. Wywołanie funkcji getProducts() i getPurchaseToken() na obiekcie PendingPurchaseUpdate zwraca identyfikatory produktów i token zakupu nowej subskrypcji. Po zakończeniu transakcji aplikacja otrzyma obiekt Purchase z tokenem zakupu najwyższego poziomu ustawionym dla nowej subskrypcji i stanem ustawionym na PURCHASED. Do klienta RTDN wysyłana jest wiadomość SubscriptionNotification o typie
SUBSCRIPTION_PURCHASED. Dopiero wtedy należy zastąpić stary token zakupu nowym i zaktualizować dostęp użytkownika do treści. Jeśli transakcja wygaśnie lub zostanie anulowana, do klienta RTDN zostanie wysłana wiadomość o typie
SUBSCRIPTION_PENDING_PURCHASE_CANCELED.SubscriptionNotification W takich przypadkach użytkownik powinien nadal mieć dostęp do treści w ramach starej subskrypcji.