Informacje o wersji Biblioteki płatności w Google Play

Ten dokument zawiera informacje o wersjach Biblioteki płatności w Google Play.

Wersja 9.1.0 Biblioteki płatności w Google Play (18.06.2026)

Dostępne są już wersja 9.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

Wersja 9.0.0 Biblioteki płatności w Google Play (19.05.2026)

Dostępne są już wersja 9.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin. Jeśli chcesz przeprowadzić migrację z poprzednich wersji PBL, zapoznaj się z przewodnikiem po migracji PBL 9.

Podsumowanie zmian

  • Zaktualizowane kody błędów dotyczące zablokowanej aktywności w Sklepie Play: zaktualizowaliśmy kody błędów dotyczące zablokowanych aplikacji w Sklepie Play. W przypadku, gdy aplikacja Sklep Play jest blokowana przez system (np. w trybie dla dzieci dostosowanym przez producenta OEM), kod odpowiedzi zmienił się z ERROR na BILLING_UNAVAILABLE. Dodatkowo w takich przypadkach BillingResult wyświetla teraz komunikat debugowania Sklep Play jest zablokowany.

  • Aktualizacja dopuszczalności wartości null w przypadku rozliczeń zapewnianych przez dewelopera: metoda DeveloperProvidedBillingDetails.getLinkUri() została zaktualizowana i jest teraz @Nullable. Ta zmiana obsługuje scenariusze, w których identyfikator URI bezpośredniego linku do płatności zewnętrznych jest niedostępny na etapie wyboru płatności.

    Aby bezpiecznie obsłużyć tę zmianę, przed przeanalizowaniem lub uruchomieniem intencji przeglądarki upewnij się, że kod integracji obsługuje wartości null i pusty ciąg znaków ("") z metody DeveloperProvidedBillingDetails.getLinkUri().

  • Zaktualizowano wartość targetSdkVersion do 35.

  • Możesz teraz używać wiadomości w aplikacji, aby powiadamiać użytkowników o nadchodzącym wzroście ceny wymagającym zgody użytkownika. Dzięki temu użytkownicy mogą potwierdzić wzrost ceny bez opuszczania aplikacji. Komunikat o oczekującym wzroście ceny wymagającym zgody użytkownika jest wyświetlany od pierwszego dnia, w którym użytkownik może zaakceptować wzrost ceny, i maksymalnie raz na 7 dni.

Wersja 8.3.0 Biblioteki płatności w Google Play (23.12.2025)

Dostępne są już wersja 8.3.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

Wersja 8.2.1 Biblioteki płatności w Google Play (15.12.2025)

Wersja 8.2.1 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Poprawki błędów

Wersja 8.2.0 Biblioteki płatności w Google Play (9.12.2025)

Dostępne są już wersja 8.2.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

Wersja 8.1.0 Biblioteki płatności w Google Play (6.11.2025)

Dostępne są już wersja 8.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

  • Zawieszone subskrypcje

    Do metody BillingClient.queryPurchasesAsync() dodano nowy parametr, który umożliwia uwzględnianie zawieszonych subskrypcji podczas wysyłania zapytań o subskrypcje. Zawieszone subskrypcje są nadal przypisane do użytkownika, ale nie są aktywne, ponieważ użytkownik wstrzymał subskrypcję lub jego forma płatności za odnowienie została odrzucona.

    Obiekt Purchase zwracany w obiekcie nasłuchującym będzie zwracać wartość isSuspended() = true w przypadku wszystkich zawieszonych subskrypcji. W takim przypadku nie należy przyznawać dostępu do kupionej subskrypcji, tylko skierować użytkownika do centrum subskrypcji, gdzie może on zarządzać formami płatności lub wstrzymać subskrypcję, aby ją ponownie aktywować.

  • Aktualizacje subskrypcji:

    • Obiekt BillingFlowParams.ProductDetailsParams ma teraz metodę setSubscriptionProductReplacementParams(), w której możesz określić informacje o zastąpieniu na poziomie produktu.

    • Obiekt SubscriptionProductReplacementParams ma 2 metody ustawiające:

      • setOldProductId: stary produkt, który ma zostać zastąpiony produktem w bieżącym ProductDetails.
      • setReplacementMode: Jest to tryb zastępowania na poziomie produktu. Tryby są zasadniczo takie same jak SubscriptionUpdateParams, ale zaktualizowano mapowanie wartości. Wprowadziliśmy nowy tryb wymiany KEEP_EXISTING, który umożliwia zachowanie dotychczasowego harmonogramu płatności za produkt.
    • SubscriptionUpdateParams setSubscriptionReplacementMode zostanie wycofana. Zamiast niej użyj zasady SubscriptionProductReplacementParams.setReplacementMode.

  • Zaktualizowano minSdkVersion do wersji 23.

  • Włączono interfejsy API zamówień w przedsprzedaży dla produktów kupowanych raz

    Interfejs ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() API, który pobiera szczegóły zamówienia w przedsprzedaży, jest już dostępny.

  • Biblioteka płatności w Google Play obsługuje teraz Kotlin w wersji 2.2.0.

Wersja 8.0.0 Biblioteki płatności w Google Play (30.06.2025)

Wersja 8.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

  • Elementy w aplikacji będą teraz nazywane produktami kupowanymi raz.

  • Wiele opcji zakupu i ofert w przypadku produktów kupowanych raz.

    Teraz możesz mieć wiele opcji zakupu i ofert dla produktów kupowanych raz. Zapewnia to elastyczność w sposobie sprzedaży produktów i ułatwia zarządzanie nimi.

  • Ulepszyliśmy metodę queryProductDetailsAsync().

    Przed wersją PBL 8.0.0 metoda queryProductDetailsAsync() nie zwracała produktów, których nie można było pobrać. Może to być spowodowane tym, że nie znaleziono produktu lub nie ma ofert dostępnych dla użytkownika. W przypadku PBL w wersji 8.0.0 niepobrane produkty są zwracane z nowym kodem stanu na poziomie produktu, który zawiera informacje o niepobranych produktach. Pamiętaj, że zmienił się podpis funkcji ProductDetailsResponseListener.onProductDetailsResponse(), co wymaga wprowadzenia zmian w aplikacji. Więcej informacji znajdziesz w sekcji Przetwarzanie wyniku.

  • Automatyczne ponowne łączenie z usługą.

    Nowy parametr BillingClient.Builder.enableAutoServiceReconnection() builder umożliwia programistom włączenie automatycznego ponownego łączenia z usługą, co upraszcza zarządzanie połączeniami, ponieważ automatycznie obsługuje ponowne łączenie z usługą Płatności w Play i eliminuje konieczność ręcznego wywoływania funkcji startConnection() w przypadku rozłączenia usługi. Więcej informacji znajdziesz w artykule Automatyczne przywracanie połączenia.

  • Kody odpowiedzi podrzędnej dla metody launchBillingFlow().

    Obiekt BillingResult zwrócony przez launchBillingFlow() będzie teraz zawierać pole kodu podrzędnej odpowiedzi. To pole będzie wypełniane tylko w niektórych przypadkach, aby podać bardziej szczegółowy powód niepowodzenia. Pole odpowiedzi podrzędnej może mieć te wartości:

    • PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS – zwracany, gdy środki użytkownika są mniejsze niż cena produktu, który próbuje kupić.
    • USER_INELIGIBLE – zwracany, gdy użytkownik nie spełnia skonfigurowanych wymagań dotyczących kwalifikacji do oferty subskrypcji.
    • NO_APPLICABLE_SUB_RESPONSE_CODE – wartość domyślna zwracana, gdy nie ma zastosowania żaden inny kod odpowiedzi podrzędnej.
  • Usunęliśmy metodę queryPurchaseHistory().

    Metoda queryPurchaseHistory(), która była wcześniej oznaczona jako przestarzała, została usunięta. Więcej informacji o tym, jakich alternatywnych interfejsów API używać, znajdziesz w artykule Sprawdzanie historii zakupów.

  • Usunęliśmy metodę querySkuDetailsAsync().

    Metoda querySkuDetailsAsync(), która wcześniej była oznaczona jako przestarzała, została usunięta. Zamiast tego użyj funkcji queryProductDetailsAsync.

  • Usunęliśmy metodę BillingClient.Builder.enablePendingPurchases().

    Metoda enablePendingPurchases() bez parametrów, która była wcześniej oznaczona jako przestarzała, została usunięta. Zamiast niej użyj zasady enablePendingPurchases(PendingPurchaseParams params). Pamiętaj, że wycofany symbol enablePendingPurchases() jest funkcjonalnie równoważny symbolowi enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()).

  • Usunęliśmy przeciążoną metodę queryPurchasesAsync(), która przyjmuje argument skuType.

    Metoda queryPurchasesAsync(String skuType, PurchasesResponseListener listener), która była wcześniej oznaczona jako przestarzała, została usunięta. Możesz też użyć queryPurchasesAsync(QueryPurchasesParams queryPurchasesParams, PurchasesResponseListener listener).

Wersja 7.1.1 Biblioteki płatności w Google Play (3.10.2024)

Dostępne są już wersja 7.1.1 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Poprawki błędów

Wersja 7.1.0 Biblioteki płatności w Google Play (19.09.2024)

Dostępne są już wersja 7.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

  • Poprawione bezpieczeństwo wątków związane ze stanem połączenia i zarządzaniem nim.
  • Wprowadziliśmy częściowe zmiany w kodach odpowiedzi BillingResult na potrzeby testów. Zostały one w pełni udostępnione w Bibliotece płatności w Play w wersji 7.1.1. Aby przetestować integrację za pomocą tej funkcji, musisz przejść na Bibliotekę płatności w Google Play w wersji 7.1.1. Występuje błąd, który ma wpływ tylko na aplikacje z włączonym testowaniem zastąpień płatności i nie wpływa na zwykłe użytkowanie. Więcej informacji znajdziesz w sekcji Testowanie BillingResult kodów odpowiedzi.

Wersja 7.0.0 Biblioteki płatności w Google Play (14.05.2024)

Dostępne są już wersja 7.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

Wersja 6.2.1 Biblioteki płatności w Google Play (16.04.2024)

Wersja 6.2.1 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Wersja 6.2.0 Biblioteki płatności w Google Play (6.03.2024)

Wersja 6.2.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Wersja 6.1.0 Biblioteki płatności w Google Play (14.11.2023)

Dostępne są już wersja 6.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin.

Podsumowanie zmian

Wersja 6.0.1 Biblioteki płatności w Google Play (22.06.2023)

Wersja 6.0.1 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Zaktualizuj Bibliotekę płatności w Play, aby była zgodna z Androidem 14.

Wersja 6.0 Biblioteki płatności w Google Play (10.05.2023)

Wersja 6.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

  • Dodaliśmy nowy wyliczenie ReplacementMode, aby zastąpić wyliczenie ProrationMode.

    Pamiętaj, że znak ProrationMode jest nadal dostępny ze względu na zgodność wsteczną.

  • Usunięto identyfikator zamówienia w przypadku zakupów PENDING.

    Wcześniej identyfikator zamówienia był zawsze tworzony, nawet jeśli zakup był w stanie oczekiwania. Od wersji 6.0.0 identyfikator zamówienia nie będzie tworzony w przypadku zakupów oczekujących. W przypadku tych zakupów identyfikator zamówienia zostanie wypełniony po przeniesieniu zakupu do stanu PURCHASED.

  • Usunęliśmy metody queryPurchases i launchPriceConfirmationFlow.

    Metody queryPurchases i launchPriceConfirmationFlow, które wcześniej zostały oznaczone jako przestarzałe, zostały usunięte z biblioteki Płatności Google Play w wersji 6.0.0. Deweloperzy powinni używać queryPurchasesAsync zamiast queryPurchases. Alternatywy dla launchPriceConfirmationFlow znajdziesz w sekcji Zmiany cen.

  • Dodano nowy kod odpowiedzi na błąd sieci.

    Od wersji Biblioteki 6.0.0 dodaliśmy nowy kod odpowiedzi błędu sieci:NETWORK_ERROR. Ten kod jest zwracany, gdy wystąpi błąd z powodu problemu z połączeniem sieciowym. Te błędy połączenia sieciowego były wcześniej zgłaszane jako SERVICE_UNAVAILABLE.

  • Zaktualizowano SERVICE_UNAVAILABLE i SERVICE_TIMEOUT.

    Od wersji PBL 6.0.0 błędy spowodowane przekroczeniem limitu czasu przetwarzania będą zwracane jako SERVICE_UNAVAILABLE zamiast obecnego SERVICE_TIMEOUT.

    W starszych wersjach PBL działanie nie ulega zmianie.

  • Usunięto:SERVICE_TIMEOUT

    Od wersji 6.0.0 PBL wartość SERVICE_TIMEOUT nie będzie już zwracana. Poprzednie wersje Biblioteki płatności w Play będą nadal zwracać ten kod.

  • Dodano dodatkowe logowanie.

    Biblioteka płatności w Play w wersji 6 zawiera dodatkowe rejestrowanie, które dostarcza informacji o korzystaniu z interfejsu API (np. o sukcesach i porażkach) oraz o problemach z połączeniem z usługą. Te informacje będą wykorzystywane do poprawy wydajności Biblioteki płatności w Play i zapewniania lepszej obsługi błędów.

Wersja 5.2.1 Biblioteki płatności w Google Play (22.06.2023)

Wersja 5.2.1 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Zaktualizuj Bibliotekę płatności w Play, aby była zgodna z Androidem 14.

Wersja 5.2 Biblioteki płatności w Google Play (6.04.2023)

Wersja 5.2.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Wersja 5.1 Biblioteki płatności w Google Play (31.10.2022)

Wersja 5.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Ta wersja zawiera następujące zmiany:

Podsumowanie zmian

Wersja 5.0 Biblioteki płatności w Google Play (11.05.2022)

Wersja 5.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Ta wersja zawiera następujące zmiany:

Podsumowanie zmian

  • Wprowadziliśmy nowy model subskrypcji, w tym nowe encje, które umożliwiają tworzenie wielu ofert dla jednego produktu objętego subskrypcją. Więcej informacji znajdziesz w przewodniku po migracji.
  • Dodano BillingClient.queryProductDetailsAsync() zamiast BillingClient.querySkuDetailsAsync().
  • Dodano metodę setIsOfferPersonalized() w przypadku wymagań dotyczących ujawniania informacji o spersonalizowanych cenach w UE. Więcej informacji o tym, jak korzystać z tej metody, znajdziesz w artykule Wskazywanie ceny spersonalizowanej.
  • Usunięto queryPurchases(), która została wcześniej wycofana i zastąpiona przez metodę queryPurchasesAsync wprowadzoną w Bibliotece płatności w Google Play w wersji 4.0.0.
  • Interfejs launchPriceChangeFlow został wycofany i w przyszłej wersji zostanie usunięty. Więcej informacji o alternatywnych rozwiązaniach znajdziesz w artykule Uruchamianie procesu potwierdzania zmiany ceny.
  • Usunięto setVrPurchaseFlow(), która była wcześniej używana podczas tworzenia instancji procesu zakupu. W poprzednich wersjach ta metoda przekierowywała użytkownika, aby dokończył zakup na urządzeniu z Androidem. Po usunięciu tej metody użytkownicy będą mogli sfinalizować zakup w standardowym procesie zakupu.

Wersja 4.1 Biblioteki płatności w Google Play (23.02.2022)

Wersja 4.1.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Ta wersja zawiera następujące zmiany:

Podsumowanie zmian

Wersja 4.0 Biblioteki płatności w Google Play (18.05.2021)

Wersja 4.0.0 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Podsumowanie zmian

Wersja 3.0.3 Biblioteki płatności w Google Play (12.03.2021)

Dostępne są już wersje 3.0.3 Biblioteki płatności w Google Play, rozszerzenia Kotlin i wtyczki Unity.

Poprawki błędów w językach Java i Kotlin

  • Naprawiono wyciek pamięci podczas wywoływania funkcji endConnection().
  • Rozwiązanie problemu, gdy Biblioteka płatności w Google Play jest używana przez aplikacje, które korzystają z trybu uruchamiania pojedynczego zadania. Gdy aplikacja zostanie wznowiona z launchera Androida, a przed zawieszeniem wyświetlało się okno płatności, zostanie wywołane wywołanie zwrotneonPurchasesUpdated().

Poprawki błędów w Unity

  • Aktualizacja do wersji 3.0.3 języka Java, która usuwa wyciek pamięci i rozwiązuje problem uniemożliwiający dokonywanie zakupów po wznowieniu aplikacji z launchera Androida, gdy przed zawieszeniem aplikacji widoczne było okno rozliczeń.

Wersja 3.0.2 Biblioteki płatności w Google Play (24.11.2020)

Wersja 3.0.2 Biblioteki płatności w Google Play i rozszerzenia Kotlin są już dostępne.

Poprawki błędów

  • Naprawiliśmy błąd w rozszerzeniu Kotlin, który powodował, że współprogram kończył się niepowodzeniem z błędem „Already resumed”.
  • Rozwiązaliśmy problem z nierozwiązanymi odwołaniami, gdy rozszerzenie Kotlin jest używane z biblioteką kotlinx.coroutines w wersji 1.4 lub nowszej.

Wersja 3.0.1 Biblioteki płatności w Google Play (30.09.2020)

Wersja 3.0.1 Biblioteki płatności w Google Play i rozszerzenie Kotlin są już dostępne.

Poprawki błędów

  • Naprawiliśmy błąd, który powodował, że jeśli aplikacja została zamknięta i przywrócona podczas procesu płatności, funkcja PurchasesUpdatedListener mogła nie zostać wywołana z wynikiem zakupu.

Wersja 3.0 Biblioteki płatności w Google Play (8.06.2020)

Dostępne są już wersje 3.0.0 Biblioteki płatności w Google Play, rozszerzenia Kotlin i wtyczki Unity.

Podsumowanie zmian

  • Usunięto obsługę kodów SKU z nagrodami.
  • Usunęliśmy parametry ChildDirected i UnderAgeOfConsent.
  • Usunięto wycofane metody ładunku dla deweloperów.
  • Usunęliśmy wycofane metody BillingFlowParams.setAccountId() i BillingFlowParams.setDeveloperId().
  • Usunęliśmy wycofane metody BillingFlowParams.setOldSkus(String oldSku) i BillingFlowParams.addOldSku(String oldSku).
  • Dodano adnotacje dotyczące dopuszczalności wartości null.

Poprawki błędów

  • SkuDetails.getIntroductoryPriceCycles() zwraca teraz int zamiast String.
  • Rozwiązaliśmy problem, który powodował, że proces płatności był traktowany jako zawierający dodatkowe parametry, nawet jeśli nie były one ustawione.

Wersja 2.2.1 Biblioteki płatności w Google Play (20.05.2020)

Dostępna jest już wersja 2.2.1 Biblioteki płatności w Google Play.

Poprawki błędów

  • Zaktualizowano domyślną wersję biblioteki płatności w Google Play w języku Java, od której zależy rozszerzenie Kotlin.

Wersja 2.2.0 Biblioteki płatności w Google Play i obsługa Unity (23.03.2020)

Wersja 2.2.0 Płatności w Google Play udostępnia funkcje, które pomagają deweloperom przypisywać zakupy do właściwych użytkowników. Te zmiany zastępują konieczność tworzenia rozwiązań niestandardowych na podstawie danych przekazywanych przez dewelopera. W ramach tej aktualizacji funkcja ładunku dewelopera została wycofana i zostanie usunięta w przyszłej wersji. Więcej informacji, w tym zalecane alternatywy, znajdziesz w sekcji Dane dla deweloperów.

Biblioteka płatności w Google Play 2 do silnika Unity

Oprócz obecnych wersji Biblioteki płatności w Google Play 2 w językach Java i Kotlin udostępniliśmy wersję tej biblioteki do użytku z silnikiem Unity. Deweloperzy gier korzystający z interfejsu Unity do obsługi zakupów w aplikacji mogą już teraz przejść na nową wersję, aby korzystać ze wszystkich funkcji Biblioteki płatności w Google Play 2 i ułatwić sobie późniejsze aktualizacje do przyszłych wersji tej biblioteki.

Więcej informacji znajdziesz w artykule Korzystanie z Płatności w Google Play w Unity.

Podsumowanie zmian

Wersja 2.1.0 Biblioteki płatności w Google Play i wersja 2.1.0 rozszerzenia Kotlin (10.12.2019)

Dostępna jest już wersja 2.1.0 Biblioteki płatności w Google Play i nowe rozszerzenie Kotlin. Rozszerzenie Kotlin biblioteki Play Billing Library udostępnia alternatywne interfejsy API w języku Kotlin, które zapewniają lepsze bezpieczeństwo wartości null i korutyny. Przykłady kodu znajdziesz w artykule Korzystanie z Biblioteki płatności w Google Play.

Ta wersja zawiera następujące zmiany:

Podsumowanie zmian

  • W przypadku BillingFlowParams wycofano setOldSku(String oldSku) i zastąpiono go elementem setOldSku(String oldSku, String purchaseToken), aby uniknąć niejednoznaczności, gdy wiele kont na urządzeniu ma ten sam kod SKU.

Wersja 2.0.3 Biblioteki płatności w Google Play (5.08.2019)

Dostępna jest już wersja 2.0.3 Biblioteki płatności w Google Play.

Poprawki błędów

  • Naprawiliśmy błąd, który powodował, że funkcja querySkuDetailsAsync() czasami kończyła się niepowodzeniem i zwracała kod DEVELOPER_ERROR zamiast wyniku.

Wersja 2.0.2 Biblioteki płatności w Google Play (8.07.2019)

Dostępna jest już wersja 2.0.2 Biblioteki płatności w Google Play. Ta wersja zawiera aktualizacje dokumentacji referencyjnej i nie zmienia funkcjonalności biblioteki.

Wersja 2.0.1 Biblioteki płatności w Google Play (6.06.2019)

Dostępna jest już wersja 2.0.1 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Poprawki błędów

  • Naprawiliśmy błąd, który w niektórych przypadkach powodował zwracanie komunikatów debugowania jako null.
  • Rozwiązaliśmy potencjalny problem z wyciekiem pamięci.

Wersja 2.0 Biblioteki płatności w Google Play (07.05.2019)

Dostępna jest już wersja 2.0 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Zakupy muszą zostać potwierdzone w ciągu 3 dni.

Google Play obsługuje kupowanie produktów w aplikacji i poza nią. Aby zapewnić spójne wrażenia z zakupów niezależnie od tego, gdzie użytkownik kupuje Twój produkt, musisz potwierdzać wszystkie zakupy otrzymane za pomocą Biblioteki płatności w Google Play tak szybko, jak to możliwe po przyznaniu użytkownikowi uprawnień. Jeśli nie potwierdzisz zakupu w ciągu 3 dni, użytkownik automatycznie otrzyma zwrot środków, a Google Play unieważni zakup. W przypadku transakcji oczekujących (nowość w wersji 2.0) 3-dniowy okres rozpoczyna się, gdy zakup przejdzie w stan PURCHASED, i nie obowiązuje, gdy zakup jest w stanie PENDING.

W przypadku subskrypcji musisz potwierdzić każdy zakup, który ma nowy token zakupu. Oznacza to, że musisz potwierdzić wszystkie początkowe zakupy, zmiany abonamentu i ponowne rejestracje, ale nie musisz potwierdzać kolejnych odnowień. Aby sprawdzić, czy zakup wymaga potwierdzenia, możesz sprawdzić pole acknowledgement w zakupie.

Obiekt Purchase zawiera teraz metodę isAcknowledged(), która wskazuje, czy zakup został potwierdzony. Dodatkowo interfejs Google Play Developer API zawiera wartości logiczne potwierdzenia dla obu tych typów:Purchases.products i Purchases.subscriptions. Zanim potwierdzisz zakup, sprawdź, czy nie został on już potwierdzony.

Potwierdzenie zakupu możesz przesłać za pomocą jednej z tych metod:

  • W przypadku produktów konsumpcyjnych użyj wartości consumeAsync(), która znajduje się w interfejsie API klienta.
  • W przypadku produktów, które nie są konsumowane, użyj parametru acknowledgePurchase(), który znajdziesz w interfejsie API klienta.
  • W interfejsie Server API dostępna jest też nowa metoda acknowledge().

Funkcja BillingFlowParams.setSku() została usunięta

W tej wersji usunęliśmy wcześniej wycofaną metodę BillingFlowParams#setSku(). Przed wyrenderowaniem produktów w procesie zakupu musisz teraz wywołać funkcję BillingClient.querySkuDetailsAsync(), przekazując wynikowy obiekt SkuDetails do funkcji BillingFlowParams.Builder.setSkuDetails().

Przykłady kodu znajdziesz w artykule Korzystanie z Biblioteki płatności w Google Play.

Obsługiwany jest ładunek dewelopera

Wersja 2.0 biblioteki płatności w Google Play dodaje obsługę ładunku dewelopera – dowolnych ciągów znaków, które można dołączyć do zakupów. Do zakupu możesz dołączyć parametr z informacjami o deweloperze, ale tylko wtedy, gdy zakup zostanie potwierdzony lub wykorzystany. W przeciwieństwie do ładunku dewelopera w AIDL, ładunek można określić podczas uruchamiania procesu zakupu. Ponieważ zakupy mogą być teraz inicjowane poza aplikacją, ta zmiana zapewnia, że zawsze masz możliwość dodania do nich ładunku.

Aby uzyskać dostęp do ładunku w nowej bibliotece, obiekty Purchase zawierają teraz metodę getDeveloperPayload().

Spójne oferty

Gdy oferujesz kod SKU z rabatem, Google Play zwraca teraz pierwotną cenę kodu SKU, aby można było pokazać użytkownikom, że otrzymują rabat.

SkuDetails zawiera 2 nowe metody pobierania pierwotnej ceny kodu SKU:

Transakcje oczekujące

W wersji 2.0 Biblioteki płatności w Google Play musisz obsługiwać zakupy, w przypadku których przed przyznaniem uprawnień wymagane jest wykonanie dodatkowych działań. Użytkownik może na przykład kupić produkt w aplikacji w sklepie stacjonarnym, płacąc gotówką. Oznacza to, że transakcja jest realizowana poza aplikacją. W takim przypadku należy przyznać uprawnienia dopiero po zakończeniu transakcji przez użytkownika.

Aby włączyć oczekujące zakupy, wywołaj enablePendingPurchases() w ramach inicjowania aplikacji.

Użyj Purchase.getPurchaseState() , aby określić, czy stan zakupu to PURCHASED czy PENDING. Pamiętaj, że uprawnienia należy przyznawać tylko wtedy, gdy stan ma wartość PURCHASED. Aby sprawdzić Purchase stan aktualizacji, wykonaj te czynności:

  1. Podczas uruchamiania aplikacji wywołaj funkcję BillingClient.queryPurchases(), aby pobrać listę nieużytych produktów powiązanych z użytkownikiem.
  2. Wywołaj Purchase.getPurchaseState() w przypadku każdego zwróconego obiektu Purchase.
  3. Zaimplementuj metodę onPurchasesUpdated(), aby reagować na zmiany w obiektach Purchase.

Interfejs Google Play Developer API zawiera też stan PENDING dla Purchases.products. Transakcje oczekujące nie są obsługiwane w przypadku subskrypcji.

W tej wersji wprowadziliśmy też nowy typ powiadomień w czasie rzeczywistym dla deweloperów: OneTimeProductNotification. Ten typ powiadomienia zawiera pojedynczą wiadomość, której wartość to ONE_TIME_PRODUCT_PURCHASED lub ONE_TIME_PRODUCT_CANCELED. Ten typ powiadomienia jest wysyłany tylko w przypadku zakupów powiązanych z opóźnionymi formami płatności, takimi jak gotówka.

Potwierdzając zakupy oczekujące, rób to tylko wtedy, gdy stan zakupu to PURCHASED, a nie PENDING.

Zmiany w interfejsie API

Wersja 2.0 Biblioteki płatności w Google Play zawiera kilka zmian w interfejsie API, które obsługują nowe funkcje i wyjaśniają istniejące funkcje.

consumeAsync

Funkcja consumeAsync() przyjmuje teraz obiekt ConsumeParams zamiast purchaseToken. ConsumeParams zawiera purchaseToken oraz opcjonalny ładunek dewelopera.

W tej wersji usunęliśmy poprzednią wersję consumeAsync().

queryPurchaseHistoryAsync

Aby uniknąć nieporozumień, funkcja queryPurchaseHistoryAsync() zwraca teraz obiekt PurchaseHistoryRecord zamiast obiektu Purchase. Obiekt PurchaseHistoryRecord jest taki sam jak obiekt Purchase, z tym że odzwierciedla tylko wartości zwracane przez queryPurchaseHistoryAsync() i nie zawiera pól autoRenewing, orderId ani packageName. Pamiętaj, że nic się nie zmieniło w przypadku zwracanych danych – funkcja queryPurchaseHistoryAsync() zwraca te same dane co wcześniej.

Wartości zwracane BillingResult

Interfejsy API, które wcześniej zwracały wartość całkowitą BillingResponse, zwracają teraz obiekt BillingResult. BillingResult zawiera liczbę całkowitą BillingResponse oraz ciąg znaków debugowania, którego możesz użyć do zdiagnozowania błędów. Ciąg debugowania jest w języku angielskim (Stany Zjednoczone) i nie jest przeznaczony do wyświetlania użytkownikom.

Poprawki błędów

Wersja 1.2.2 Biblioteki płatności w Google Play (7.03.2019)

Dostępna jest już wersja 1.2.2 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Poprawki błędów

  • Rozwiązaliśmy problem z wątkami, który pojawił się w wersji 1.2.1. Wywołania w tle nie blokują już wątku głównego.

Inne zmiany

  • Chociaż nadal zalecamy korzystanie z głównego wątku, możesz teraz tworzyć instancje Biblioteki Płatności w Google Play z wątku w tle.
  • Tworzenie instancji zostało w pełni przeniesione do wątku w tle, aby zmniejszyć prawdopodobieństwo wystąpienia błędów ANR.

Wersja 1.2.1 Biblioteki płatności w Play (4.03.2019)

Dostępna jest już wersja 1.2.1 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Najważniejsze zmiany

Inne zmiany

  • Dodano publiczne konstruktory dla klas PurchasesResult i SkuDetailsResult, aby ułatwić testowanie.
  • Obiekty SkuDetails mogą używać nowej metody getOriginalJson().
  • Wszystkie wywołania usług AIDL są teraz obsługiwane przez wątki w tle.

Poprawki błędów

  • Do publicznych interfejsów API nie są już przekazywane odbiorniki wywołań zwrotnych o wartości null.

Wersja 1.2 Biblioteki płatności w Google Play (18.10.2018)

Dostępna jest już wersja 1.2 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Podsumowanie zmian

  • Biblioteka płatności w Google Play jest teraz licencjonowana na podstawie Umowy licencyjnej dotyczącej pakietu Android SDK.
  • Dodano interfejs launchPriceChangeConfirmationFlow API, który wyświetla użytkownikom prośbę o sprawdzenie zmiany oczekującej ceny subskrypcji.
  • Dodaliśmy obsługę nowego trybu proporcjonalnego rozliczania DEFERRED podczas uaktualniania lub obniżania wersji subskrypcji użytkownika.
  • W klasie BillingFlowParams zastąpiliśmy setSku() wartością setSkuDetails().
  • Drobne poprawki błędów i optymalizacje kodu.

Potwierdzenie zmiany ceny

W Konsoli Google Play możesz teraz zmienić cenę subskrypcji i poprosić użytkowników o sprawdzenie i zaakceptowanie nowej ceny po wejściu do aplikacji.

Aby użyć tego interfejsu API, utwórz obiekt PriceChangeFlowParams, używając skuDetails produktu objętego subskrypcją, a następnie wywołaj launchPriceChangeConfirmationFlow(). Zaimplementuj PriceChangeConfirmationListener, aby obsługiwać wynik po zakończeniu procesu potwierdzania zmiany ceny, jak pokazano w tym fragmencie kodu:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

Proces potwierdzania zmiany ceny wyświetla okno z informacjami o nowej cenie, w którym użytkownicy są proszeni o jej zaakceptowanie. Ten przepływ zwraca kod odpowiedzi typu BillingClient.BillingResponse.

Nowy tryb proporcjonalny

Gdy zmieniasz subskrypcję użytkownika na wyższą lub niższą wersję, możesz użyć nowego trybu proporcjonalnego rozliczenia, DEFERRED. W tym trybie subskrypcja użytkownika zostanie zaktualizowana przy kolejnym odnowieniu. Więcej informacji o konfigurowaniu tego trybu proporcjonalnego znajdziesz w artykule Ustawianie trybu proporcjonalnego.

Nowa metoda ustawiania szczegółów kodu SKU

W klasie BillingFlowParams metoda setSku() została wycofana. Ta zmiana ma na celu optymalizację procesu płatności w Google Play.

Podczas tworzenia nowej instancji BillingFlowParams w klientach płatności w aplikacji zalecamy bezpośrednie używanie obiektu JSON za pomocą setSkuDetails(), jak pokazano w tym fragmencie kodu:

W klasie BillingFlowParams Builder metoda setSku() została wycofana. Zamiast tego użyj metody setSkuDetails(), jak pokazano w tym fragmencie kodu: Obiekt przekazany do obiektu setSkuDetails() pochodzi z metody querySkuDetailsAsync().

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

Wersja 1.1 Biblioteki płatności w Play (7.05.2018)

Dostępna jest już wersja 1.1 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Podsumowanie zmian

  • Dodaliśmy możliwość określenia trybu proporcjonalnego rozliczenia w metodzie BillingFlowParams podczas przechodzenia na wyższą lub niższą wersję istniejącej subskrypcji.
  • Flaga logiczna replaceSkusProration w BillingFlowParams nie jest już obsługiwana. Zamiast niej użyj zasady replaceSkusProrationMode.
  • launchBillingFlow() wywołuje teraz wywołanie zwrotne w przypadku nieudanych odpowiedzi.

Zmiany w zachowaniu

Wersja 1.1 Biblioteki płatności w Google Play zawiera te zmiany w działaniu:

Deweloperzy mogą ustawić replaceSkusProrationMode w klasie BillingFlowParams.

ProrationMode zawiera więcej informacji o rodzaju proporcjonalnego rozliczenia w przypadku przejścia na wyższy lub niższy pakiet subskrypcji użytkownika.

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

Google Play obsługuje te tryby proporcjonalnego rozliczania:

IMMEDIATE_WITH_TIME_PRORATION Wymiana zaczyna obowiązywać natychmiast, a nowy czas wygaśnięcia zostanie proporcjonalnie rozliczony i zwrócony lub obciążony na koncie użytkownika. Jest to bieżące działanie domyślne.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Wymiana zacznie obowiązywać od razu, a cykl rozliczeniowy pozostanie bez zmian. Zostanie pobrana cena za pozostały okres.

Uwaga: ta opcja jest dostępna tylko w przypadku uaktualnienia subskrypcji.

IMMEDIATE_WITHOUT_PRORATION Zmiana zacznie obowiązywać natychmiast, a nowa cena zostanie naliczona przy kolejnym odnowieniu. Cykl rozliczeniowy pozostaje bez zmian.

replaceSkusProration nie jest już obsługiwana w przypadku zajęć BillingFlowParams

Deweloperzy mogli ustawić flagę logiczną, aby pobierać proporcjonalną kwotę za prośbę o przejście na wyższą wersję subskrypcji. W związku z tym, że obsługujemy parametr ProrationMode, który zawiera bardziej szczegółowe instrukcje dotyczące proporcjonalnego rozliczania, ta wartość logiczna nie jest już obsługiwana.

launchBillingFlow() wywołuje teraz wywołanie zwrotne w przypadku nieudanych odpowiedzi

Biblioteka płatności zawsze wywołuje wywołanie zwrotne PurhcasesUpdatedListener i asynchronicznie zwraca BillingResponse. Zachowywana jest też synchroniczna wartość zwracana BillingResponse.

Poprawki błędów

  • Prawidłowe wcześniejsze wyjście w metodach asynchronicznych, gdy usługa jest odłączona.
  • Builder Obiekty parametrów nie zmieniają już wbudowanych obiektów.
  • Problem 68087141: launchBillingFlow() teraz wywołuje wywołanie zwrotne w przypadku nieudanych odpowiedzi.

Wersja 1.0 Biblioteki płatności w Google Play (19.09.2017, ogłoszenie)

Dostępna jest już wersja 1.0 Biblioteki płatności w Google Play. Ta wersja zawiera następujące zmiany.

Ważne zmiany

  • Uprawnienia do płatności wbudowanych w pliku manifestu biblioteki. Nie musisz już dodawać uprawnienia com.android.vending.BILLING do pliku manifestu Androida.
  • Nowy konstruktor dodany do klasy BillingClient.Builder.
  • Wprowadzono wzorzec konstruktora dla klasy SkuDetailsParams, który będzie używany w metodach do wysyłania zapytań o kody SKU.
  • Zaktualizowaliśmy kilka metod interfejsu API, aby zapewnić spójność (te same nazwy i kolejność argumentów zwracanych).

Zmiany w zachowaniu

Wersja 1.0 Biblioteki płatności w Google Play zawiera te zmiany w działaniu:

Klasa BillingClient.Builder

BillingClient.Builder jest teraz inicjowany za pomocą nowego wzorca newBuilder:

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

Metoda launchBillingFlow jest teraz wywoływana za pomocą klasy BillingFlowParams.

Aby zainicjować proces płatności za zakup lub subskrypcję, metoda launchBillingFlow() otrzymuje instancję BillingFlowParams zainicjowaną za pomocą parametrów specyficznych dla żądania:

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

Nowy sposób wysyłania zapytań o dostępne produkty

Argumenty metod queryPurchaseHistoryAsync() i querySkuDetailsAsync() zostały zawinięte w wzorzec Builder:

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

Wynik jest teraz zwracany za pomocą kodu wyniku i listy obiektów SkuDetails zamiast poprzedniej klasy opakowującej, co ułatwia korzystanie z interfejsu API i zapewnia spójność w ramach naszych interfejsów API:

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

Zmieniono kolejność parametrów w metodzie onConsumeResponse()

Kolejność argumentów w przypadku funkcji onConsumeResponse z interfejsu ConsumeResponseListener została zmieniona, aby była spójna w całym interfejsie API:

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

Rozpakowany obiekt PurchaseResult

PurchaseResult zostało rozpakowane, aby zapewnić spójność w naszym interfejsie API:

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

Poprawki błędów

Wersja Developer Preview 1 (12 czerwca 2017 r., komunikat)

Uruchomiliśmy wersję dla programistów, która ma uprościć proces tworzenia aplikacji pod względem rozliczeń, dzięki czemu deweloperzy mogą skupić się na implementowaniu logiki specyficznej dla aplikacji na Androida, takiej jak architektura aplikacji i struktura nawigacji.

Biblioteka zawiera kilka wygodnych klas i funkcji, których możesz używać podczas integrowania aplikacji na Androida z interfejsem API Płatności w Google Play. Biblioteka zapewnia też warstwę abstrakcji na podstawie usługi Android Interface Definition Language (AIDL), co ułatwia deweloperom definiowanie interfejsu między aplikacją a interfejsem API Płatności w Google Play.