Subskrypcja z dodatkami

Subskrypcja z dodatkami umożliwia łączenie ze sobą wielu produktów subskrypcyjnych, które można kupować, rozliczać i zarządzać nimi razem. Istniejące subskrypcje katalogu produktów można bezproblemowo oferować jako dodatki bez konieczności wcześniejszego określania szczegółów ani dodatkowej konfiguracji. Możesz uruchomić proces zakupu z wieloma istniejącymi produktami subskrypcyjnymi i sprzedawać je jako dodatki.

co należy wziąć pod uwagę

Korzystając z funkcji subskrypcji z dodatkami, weź pod uwagę te kwestie:

  • Subskrypcja z dodatkami jest obsługiwana tylko w przypadku automatycznie odnawianych abonamentów podstawowych.

  • Wszystkie produkty w zakupie muszą mieć ten sam okres rozliczeniowy. Nie możesz na przykład mieć subskrypcji z rocznym okresem rozliczeniowym i dodatków z miesięcznym okresem rozliczeniowym.

  • Subskrypcja z dodatkami może zawierać maksymalnie 50 produktów.

  • Ta funkcja jest niedostępna w Indiach (IN) i Korei Południowej (KR).

Integracja z Biblioteką płatności w Play

W tej sekcji opisujemy, jak zintegrować funkcję subskrypcji z dodatkami z biblioteką płatności w Google Play (PBL). Zakładamy, że znasz już początkowe kroki integracji biblioteki Płatności w Google Play, takie jak dodanie zależności biblioteki Płatności w Google Play do aplikacji, zainicjowanie BillingClientpołączenie z Google Play. Ta sekcja dotyczy aspektów integracji PBL, które są specyficzne dla subskrypcji z dodatkami.

Uruchamianie procesu zakupu

Aby uruchomić proces zakupu subskrypcji z dodatkami, wykonaj te czynności:

  1. Pobierz wszystkie elementy subskrypcji za pomocą metody BillingClient.queryProductDetailsAsync.

  2. Ustaw obiekt ProductDetailsParams dla każdego elementu.

    Element reprezentowany przez obiekt ProductDetailsParams określa zarówno ProductDetails wskazujący element subskrypcji, jak i offerToken wybierający konkretną subskrypcję base plan lub offer.

  3. Podaj szczegóły produktu w metodzie BillingFlowParams.Builder.setProductDetailsParamsList. Klasa BillingFlowParams określa szczegóły procesu zakupu.

    Poniższy przykład pokazuje, jak uruchomić proces płatności za subskrypcję z wieloma produktami:

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

Zasady obowiązujące w przypadku produktów w zakupie

  • Aby daty odnowienia dodatków były zgodne z datami odnowienia produktu podstawowego, Google Play może po zakończeniu okresu próbnego lub okresu z ceną dla nowych użytkowników naliczyć proporcjonalną opłatę.
  • Kryteria kwalifikacji do oferty będą oceniane oddzielnie dla każdego produktu.

Przetwarzanie zakupów

Przetwarzanie subskrypcji z dodatkami jest takie samo jak przetwarzanie zakupów pojedynczych produktów opisane w artykule Integrowanie Biblioteki płatności w Google Play z aplikacją. Jedyna różnica polega na tym, że użytkownik może otrzymać wiele uprawnień w ramach jednego zakupu. Zakup subskrypcji z dodatkami zwraca wiele elementów, które można pobrać za pomocą Purchase.getProducts() w bibliotece Płatności w Google Play, a następnie listy lineItemspurchases.subscriptionsv2.get interfejsu Google Play Developer API.

Zmienianie subskrypcji z dodatkami

Wszelkie zmiany w subskrypcji z dodatkami powodują przejście na wyższą lub niższą wersję usługi. Więcej informacji znajdziesz w artykule Uaktualnianie i obniżanie wersji subskrypcji.

Aby zmienić lub przywrócić istniejący zakup subskrypcji z dodatkami w aplikacji, musisz wywołać interfejs API launchBillingFlow z dodatkowymi parametrami i upewnić się, że:

  • Zawsze wywołuj funkcję setOldPurchaseToken z tokenem zakupu bieżącej subskrypcji.
  • Aby przejść na wyższą lub niższą wersję produktu albo zmienić go na inny, zadzwoń pod numer SubscriptionProductReplacementParams.setReplacementMode, aby określić, jak ma przebiegać zmiana subskrypcji między starym a nowym produktem. W przeciwnym razie nie musisz ustawiać tego parametru.
  • Jeśli element podstawowy nie zostanie zmieniony, nadal możesz wywołać funkcję SubscriptionProductReplacementParams.setSubscriptionReplacementMode, aby zastosować określone zachowanie zastępowania. Obowiązujące w tym przypadku zasady znajdziesz w artykule Ponowne subskrybowanie lub przełączanie pakietów w ramach tej samej subskrypcji.
  • Nowe dodatki zostaną zastosowane od razu, a opłata zostanie naliczona proporcjonalnie, aby dopasować datę kolejnego odnowienia do produktu podstawowego w subskrypcji.
  • Usunięte dodatki wygasną z końcem bieżącego okresu rozliczeniowego.
  • Podczas uruchamiania procesu płatności musisz określić wszystkie aktywne elementy subskrypcji z dodatkami z wyjątkiem tych, które mają zostać usunięte, oraz wszystkie nowe dodatki.

Poniższy przykład pokazuje, jak wywołać interfejs launchBillingFlow API podczas zmiany istniejącego zakupu subskrypcji z dodatkami:

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

Scenariusze modyfikacji subskrypcji

W tabeli poniżej znajdziesz różne scenariusze modyfikacji subskrypcji z dodatkami i odpowiednie zachowania.

Podczas korzystania z parametru SubscriptionProductReplacementParams

Istniejące produkty Zmodyfikowane produkty Czy muszę ustawić tryb wymiany w parametrach SubscriptionProductReplacementParams? Działanie
A (produkt podstawowy), B A (produkt podstawowy) Tak (użyj KEEP_EXISTING)
  • Element B jest przeznaczony do odroczonego usunięcia.
  • Element A zostaje zachowany.
  • Użytkownicy zachowają obecną cenę produktu A, w tym pozostałe płatności wprowadzające, które otrzymali w momencie rejestracji.
A A (produkt podstawowy), B Tak (w przypadku A użyj KEEP_EXISTING)
  • Produkt B zostanie dodany od razu, a opłata za niego zostanie naliczona proporcjonalnie.
  • Element A zostaje zachowany.
  • Użytkownicy zachowają obecną cenę produktu A, w tym pozostałe płatności wprowadzające, które otrzymali w momencie rejestracji.
A (produkt podstawowy), B A (produkt podstawowy), C Tak (w przypadku A użyj KEEP_EXISTING)
  • B jest przeznaczony do odroczonego usunięcia.
  • C zostanie dodany natychmiast, a opłata zostanie naliczona proporcjonalnie.
  • Element A zostaje zachowany.
  • Użytkownicy zachowają obecną cenę produktu A, w tym pozostałe płatności wprowadzające, które otrzymali w momencie rejestracji.
A (produkt podstawowy), B B (produkt podstawowy) Nie A jest zaplanowane do odroczonego usunięcia.
A (produkt podstawowy), B C (produkt podstawowy) Tak
  • Zamiana A -> C zależy od SubscriptionProductReplacementParams replacementMode
  • B jest przeznaczony do odroczonego usunięcia.
A (produkt podstawowy), B C (produkt podstawowy), B Tak
  • Zamiana A -> C zależy od SubscriptionProductReplacementParams replacementMode.
  • Aby zachować element B bez zmian, ustaw jego tryb zastępowania jako KEEP_EXISTING. W przeciwnym razie domyślnie używany jest tryb zastępowania IMMEDIATE_WITHOUT_PRORATION.
A (produkt podstawowy), B C (produkt podstawowy), D Tak
  • Zamiana A -> C zależy od SubscriptionProductReplacementParams replacementMode.
  • B jest przeznaczony do odroczonego usunięcia.
  • D zostanie dodany natychmiast, a opłata zostanie naliczona proporcjonalnie.
A (produkt podstawowy), B A (produkt podstawowy), C Tak
  • Zamiana A –> A i B –> C zależy od trybu zamiany podanego w SubscriptionProductReplacementParams replacementMode w każdym ProductDetailsParams.
  • Aby pozostawić element A bez zmian, ustaw tryb zastępowania na KEEP_EXISTING.
A (produkt podstawowy), B, C D (produkt podstawowy), B, C Tak
  • Zamiana A->D i B->B, C->C zależy od trybu zamiany podanego w SubscriptionProductReplacementParams replacementMode w każdym ProductDetailsParams.
  • Aby zachować elementy B i C bez zmian, ustaw dla nich tryb zastępowania KEEP_EXISTING.

Podczas korzystania z parametru SubscriptionUpdateParams

Istniejące produkty Zmodyfikowane produkty Czy musisz ustawić informacje o zamienniku? Działanie
A (produkt podstawowy), B A (produkt podstawowy) Nie
  • Element B jest przeznaczony do odroczonego usunięcia.
  • Działanie elementu A zależy od ustawienia Zmiany abonamentu podstawowego i oferty w abonamencie podstawowym.
  • Cena produktu A zostanie zaktualizowana do najnowszej ceny, a użytkownicy mogą utracić wszelkie płatności wprowadzające, które otrzymali podczas rejestracji na podstawie kryteriów kwalifikacji do oferty.
A A (produkt podstawowy), B Nie
  • Produkt B zostanie dodany od razu, a opłata za niego zostanie naliczona proporcjonalnie.
  • Działanie elementu A zależy od ustawienia Zmiany abonamentu podstawowego i oferty w abonamencie podstawowym.
  • Cena produktu A zostanie zaktualizowana do najnowszej ceny, a użytkownicy mogą utracić wszelkie płatności wprowadzające, które otrzymali podczas rejestracji, w zależności od kryteriów kwalifikacji do oferty.
A (produkt podstawowy), B A (produkt podstawowy), C Nie
  • B jest przeznaczony do odroczonego usunięcia.
  • C zostanie dodany natychmiast, a opłata zostanie naliczona proporcjonalnie.
  • Działanie elementu A zależy od ustawienia Zmiany abonamentu podstawowego i oferty w abonamencie podstawowym.
A (produkt podstawowy), B B (produkt podstawowy) Nie A jest zaplanowane do odroczonego usunięcia.
A (produkt podstawowy), B C (produkt podstawowy) Tak
A (produkt podstawowy), B C (produkt podstawowy), B Tak Zamiana A -> C zależy od setSubscriptionReplacementMode (wycofano w PBL 8.1).
A (produkt podstawowy), B C (produkt podstawowy), D Tak
  • Zamiana A -> C zależy od setSubscriptionReplacementMode (wycofano w PBL 8.1).
  • B jest przeznaczony do odroczonego usunięcia.
  • D zostanie dodany natychmiast, a opłata zostanie naliczona proporcjonalnie.

Powiadomienia w czasie rzeczywistym dla deweloperów

Pole subscriptionId nie jest podawane w RTDN w przypadku zakupów subskrypcji z dodatkami, które zawierają uprawnienia do wielu produktów. Zamiast tego możesz użyć interfejsów Play Developer API, aby uzyskać informacje o zakupie i zobaczyć powiązane uprawnienia do produktu.

Zmiany cen dla obecnych subskrybentów

Zmiana cen subskrypcji dla obecnych subskrybentów subskrypcji z zakupem dodatków przebiega podobnie jak zmiana cen subskrypcji pojedynczych produktów, co opisaliśmy w artykule Zmienianie cen subskrypcji. Istnieją jednak pewne ograniczenia i różnice w funkcjonalności, które opisujemy w tej sekcji.

Rezygnowanie ze starszej kohorty cenowej

Zakończenie starszej kohorty ma też wpływ na subskrypcje z zakupionymi dodatkami. Obowiązują te reguły:

  • Wszystkie oczekujące wzrosty cen z możliwością akceptacji powinny mieć ten sam czas odnowienia z nową ceną. Jeśli element w subskrypcji z dodatkami ma wzrost ceny wymagający zgody użytkownika, który nie został jeszcze potwierdzony przez użytkownika, wszelkie nowe wzrosty ceny wymagające zgody użytkownika w przypadku innych elementów zakupu będą ignorowane, chyba że spowodują ten sam czas odnowienia zastosowania nowej ceny co istniejący wzrost ceny w stanie OUTSTANDING. Gdy użytkownik potwierdzi wzrost ceny, zostaną zarejestrowane wszelkie nowsze zmiany ceny. Użytkownicy mogą zaakceptować wszystkie niepotwierdzone wzrosty ceny wymagające zgody użytkownika tylko jednocześnie.

    Przykład:

    • Załóżmy, że masz subskrypcję z dodatkami (produkty A i B), która odnawia się 7 dnia każdego miesiąca.
    • Produkt A jest w trakcie zmiany ceny z 7 PLN na 10 PLN, a wzrost ceny ma nastąpić 7 lipca.
    • 2 czerwca rozpoczyna się nowa migracja ceny z 5 USD na 6 USD w przypadku produktu B. Podwyżka ceny z możliwością rezygnacji zaczyna obowiązywać 37 dni po migracji, więc najwcześniejsza podwyżka ceny produktu B nastąpi 7 sierpnia.

    W tym scenariuszu dopóki użytkownik nie zaakceptuje zmiany ceny produktu A (dopóki nie będzie on w stanie POTWIERDZONY), zmiana ceny produktu B nie zostanie zarejestrowana w przypadku zakupu subskrypcji, a metoda SubscriptionPurchaseV2 nie zwróci szczegółów zmiany ceny produktu B. Gdy użytkownik potwierdzi zmianę ceny produktu A, rozpocznie się zmiana ceny produktu B. Użytkownik otrzyma wzrost ceny wymagający zgody użytkownika w przypadku produktu B dopiero po zaakceptowaniu wzrostu ceny wymagającego zgody użytkownika w przypadku produktu A.

  • E-mail od Google Play zawiera listę wszystkich produktów, których ceny wzrosną lub spadną tego samego dnia.

Anulowanie subskrypcji z dodatkami

Użytkownicy mogą anulować cały zakup subskrypcji z dodatkami w centrum subskrypcji Google Play, a Ty możesz anulować cały zakup subskrypcji z dodatkami tylko za pomocą interfejsu Google Play Developer API.

Gdy zakup subskrypcji zostanie anulowany bez cofnięcia, żadne elementy zakupu nie będą odnawiać się automatycznie, ale użytkownik będzie nadal mieć dostęp do uprawnionych elementów do końca odpowiednich okresów rozliczeniowych.

Unieważnianie i zwracanie środków za subskrypcje z dodatkami

Oto niektóre wytyczne dotyczące wycofywania subskrypcji i przyznawania zwrotów środków:

  • W Konsoli Play możesz zwrócić środki za konkretne zamówienie bez odbierania dostępu do subskrypcji.

  • Wywołaj orders.refund, aby w pełni zwrócić użytkownikowi środki za konkretne płatności za subskrypcję bez odbierania mu dostępu do niej.

  • Zadzwoń pod numer purchases.subscriptionsv2.revoke, aby natychmiast odebrać dostęp do wszystkich elementów subskrypcji. Za pomocą tego interfejsu API możesz:

    • cofnąć dostęp do wszystkich elementów i zwrócić proporcjonalną kwotę;

    • W przypadku wycofania subskrypcji z dodatkami z proporcjonalnym zwrotem środków zwrot środków zostanie przyznany za ostatnie zamówienie każdego produktu w proporcjonalnej kwocie na podstawie czasu pozostałego do następnego odnowienia.

    • Cofnij dostęp do wszystkich elementów i zapewnij pełny zwrot środków.

    • Cofnij dostęp do poszczególnych elementów i otrzymaj pełny zwrot środków za dany element.

Unieważnianie poszczególnych elementów w subskrypcji z dodatkami

Aby cofnąć poszczególne elementy subskrypcji z dodatkami bez cofania całego zakupu, wywołaj purchases.subscriptionsv2.revoke z polem ItemBasedRefund ustawionym w RevocationContext. productId produktu, który ma zostać wycofany i za który mają zostać zwrócone środki, można ustawić w polu ItemBasedRefund.

Pole ItemBasedRefund można ustawić w przypadku zakupów obejmujących co najmniej 1 produkt z automatycznie odnawianą subskrypcją.

  • Jeśli po cofnięciu elementu określonego w ItemBasedRefund w ramach zakupu subskrypcji nadal będą aktywne inne elementy, cofnięty zostanie tylko ten element, a środki za niego zostaną w pełni zwrócone bez przerywania stanu subskrypcji.
  • Jeśli po wycofaniu produktu określonego w ItemBasedRefund w ramach subskrypcji nie pozostały żadne aktywne produkty, produkt zostanie wycofany, otrzymasz pełny zwrot środków, a subskrypcja zostanie anulowana.

co należy wziąć pod uwagę

  • W przypadku korzystania z ItemBasedRefund można cofnąć tylko 1 element naraz. Żądanie może być wywoływane wielokrotnie, jeśli trzeba cofnąć różne elementy.
  • Jeśli zakup subskrypcji jest w stanie odrzucenia płatności lub element określony w ItemBasedRefund nie jest własnością użytkownika albo wygasł, odrzucenie elementu jest blokowane.
  • Odrzucanie produktów nie jest obsługiwane w przypadku subskrypcji przedpłaconych.

Wygasanie produktu podczas odrzucenia płatności

W przypadku zakupu subskrypcji z dodatkami niektóre odnowienia mogą wymagać tylko przedłużenia części uprawnień do elementów bez wpływu na elementy z przyszłą datą wygaśnięcia.

Niezależnie od tego, które produkty są objęte odnowieniem, jeśli płatność za odnowienie zostanie odrzucona, cała subskrypcja przejdzie w okres prolongaty, a konto zostanie zablokowane zgodnie z opisem w dokumentacji.

Wybór okresu przywracania

Okres prolongaty nadal przyznaje użytkownikowi uprawnienia. Jeśli po zakupie subskrypcji z dodatkami płatność za odnowienie zostanie odrzucona, zostanie wybrany produkt z najkrótszym okresem prolongaty spośród wszystkich aktywnych produktów, a jego okres prolongaty i okres zawieszenia konta zostaną zastosowane jako okres przywrócenia w przypadku tego odnowienia.

Aktywne produkty to produkty, które były aktywne w momencie zakupu subskrypcji z dodatkami tuż przed próbą odnowienia. Nie obejmują one żadnych nowo dodanych produktów (które nie będą uprawnione do czasu odzyskania) ani żadnych produktów, które nie są już aktywne z powodu usunięcia lub wyłączenia.

Zastosowane zostaje ustawienie zawieszenia konta dla produktu z wybranym minimalnym okresem prolongaty. Jeśli jest więcej niż 1 produkt z minimalnym okresem prolongaty, ale różnymi okresami zawieszenia konta, zostanie zastosowany najdłuższy okres zawieszenia konta.

Okres prolongaty

Gdy płatność za odnowienie subskrypcji zostanie odrzucona, subskrypcja przejdzie w stan okresu prolongaty. W okresie prolongaty użytkownik nadal będzie mieć dostęp do wszystkich aktywnych elementów z poprzedniego okresu odnowienia. Jeśli po okresie prolongaty problem z formą płatności nie zostanie rozwiązany, cała subskrypcja zostanie zawieszona. Jeśli w okresie prolongaty inne produkty osiągną datę odnowienia, po wznowieniu subskrypcji po odrzuceniu płatności zostanie zainicjowana nowa próba pobrania opłaty za te produkty.

Zawieszenie konta

Gdy subskrypcja jest wstrzymana, dostęp do wszystkich elementów subskrypcji jest zawieszony do czasu odzyskania płatności.

Jeśli subskrypcja w okresie zawieszenia konta zostanie przywrócona, zakup subskrypcji będzie nadal obowiązywać. Jeśli subskrypcja nie zostanie przywrócona, produkty, za które nie udało się pobrać płatności, wygasną, a dostęp do pozostałych produktów zostanie przywrócony na pozostały okres rozliczeniowy.

Przykład:

  • Użytkownik ma subskrypcję Mój abonament podstawowy, która odnawia się 1 dnia każdego miesiąca. 15 sierpnia dodaje abonament dodatkowy za 10 zł miesięcznie z 7-dniowym bezpłatnym okresem próbnym. Żaden z tych produktów nie ma ustawionego okresu prolongaty, a oba mają 30-dniowy okres zawieszenia konta.

  • 22 sierpnia użytkownik zostaje obciążony kwotą 2, 90 zł (10 zł*9/31) za okres do 31 sierpnia, ale forma płatności użytkownika wygasa wcześniej, a subskrypcja zostaje odrzucona 22 sierpnia.

Gdy subskrypcja zostanie zawieszona z powodu odrzucenia płatności, użytkownik nie będzie mieć dostępu do żadnych elementów subskrypcji z dodatkami. Pozostały czas subskrypcji w przypadku elementów, które nie są odnawiane, zostanie zwrócony użytkownikom, gdy subskrypcja zostanie wycofana z zawieszenia konta z powodu odzyskania płatności lub anulowania.

W poprzednim przykładzie subskrypcja zostaje wstrzymana 22 sierpnia.

  • Jeśli konto zostanie odzyskane 25 sierpnia, czyli przed datą odnowienia 1 września, użytkownik odzyska dostęp do abonamentu Base Plandodatku tego samego dnia. Następna data rozliczenia została zmieniona na 4 września.

  • Jeśli konto nie zostanie odzyskane w ciągu 30 dni, 21 września subskrypcja zostanie anulowana, a użytkownik straci dostęp do planu dodatkowego i odzyska dostęp do planu podstawowego do 30 września.

W tym przykładzie musisz uzyskać zaktualizowany atrybut expiryTime DLA WSZYSTKICH produktów w subskrypcji z dodatkami, ponieważ niektóre produkty mogą odzyskać uprawnienia po okresie prolongaty i zawieszenia konta.

Raportowanie finansowe i uzgadnianie

Użyj raportu Zarobki, aby porównać aktywne subskrypcje z transakcjami w Google Play. Każdy element zamówienia transakcji ma identyfikator zamówienia. W przypadku zakupów obejmujących kilka produktów raporty Zarobki i szacunkowa sprzedaż będą zawierać osobne wiersze dla każdej transakcji, np. obciążenia, opłaty, podatku i zwrotu środków, w przypadku każdego produktu.

W przypadku paneli w Konsoli Play:

  • Statystyki przychodów w sekcji Raporty finansowe w konsoli są podzielone według produktów.

  • Zarządzanie zamówieniami odzwierciedla zakup subskrypcji z dodatkami i zawiera szczegółowe listy zakupionych produktów. W ramach zarządzania zamówieniami możesz cofnąć, anulować lub w pełni zwrócić środki za zakup użytkownika.