Z tego artykułu dowiesz się, jak zintegrować Bibliotekę płatności w Google Play aplikacji, aby zacząć sprzedawać produkty.
Cykl zakupu
Poniżej przedstawiamy typowy proces zakupu w przypadku zakupu jednorazowego lub subskrypcji.
- Pokaż użytkownikowi, co może kupić.
- Uruchom proces zakupu, aby użytkownik mógł go zaakceptować.
- Zweryfikuj zakup na serwerze.
- Udostępnij treści użytkownikowi.
- Potwierdź przesłanie treści. W przypadku produktów zużywalnych zakupu, aby użytkownik mógł ponownie kupić produkt.
Subskrypcje odnawiają się automatycznie, dopóki nie zostaną anulowane. Subskrypcję można przez te stany:
- Aktywny:użytkownik ma dobrą opinię i ma dostęp do subskrypcji.
- Anulowano: użytkownik anulował dostęp, ale nadal ma dostęp do konta do wygaśnięcia.
- W okresie prolongaty:użytkownik napotkał problem z płatnością, ale nadal ma dostęp gdy Google próbuje ponownie użyć formy płatności.
- Wstrzymano: użytkownik napotkał problem z płatnością i nie ma już dostępu do konta Próbujemy ponownie użyć formy płatności.
- Wstrzymany: użytkownik wstrzymał swój dostęp i nie ma do niego dostępu, dopóki nie do swojego życiorysu zawodowego.
- Wygasła: użytkownik anulował subskrypcję i utracił do niej dostęp. w momencie wygaśnięcia dostępu do danych użytkownika zostanie uznany za rezygnowanego.
Inicjowanie połączenia z Google Play
Aby przeprowadzić integrację z systemem rozliczeniowym Google Play, najpierw dodaj z Biblioteką płatności w Google Play w aplikacji i zainicjować połączenie.
Dodaj zależność Biblioteki płatności w Google Play
Dodaj zależność Biblioteki płatności w Google Play do jej identyfikatora build.gradle
jak pokazano poniżej:
Odlotowe
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" implementation("com.android.billingclient:billing:$billing_version") }
Jeśli korzystasz z Kotlin, moduł KTX Biblioteki płatności w Google Play zawiera
Obsługa rozszerzeń i współdziałań Kotlin, która umożliwia pisanie idiomatyczne
Kotlin podczas korzystania z Biblioteki płatności w Google Play. Uwzględnianie tych wartości
rozszerzeń w projekcie, dodaj tę zależność do
build.gradle
plik jak pokazano:
Odlotowe
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
Inicjowanie klienta rozliczeniowego
Po dodaniu zależności od Biblioteki płatności w Google Play musisz
aby zainicjować instancję BillingClient
. BillingClient
jest głównym elementem
do komunikacji między Biblioteką płatności w Google Play a usługą
reszta aplikacji. BillingClient
zapewnia wygodne metody, obie synchroniczne
i asynchronicznych na potrzeby wielu typowych operacji rozliczeniowych. Zdecydowanie zalecamy
mieć jedno aktywne połączenie BillingClient
otwarte w danym momencie,
unikaj wielu wywołań zwrotnych PurchasesUpdatedListener
dla jednego zdarzenia.
Aby utworzyć BillingClient
, użyj newBuilder()
. Możesz przekazać dowolny kontekst,
do newBuilder()
, a BillingClient
używa go do uzyskania kontekstu aplikacji.
Dzięki temu nie musisz się martwić o wycieki pamięci. Aby otrzymywać aktualizacje na temat:
zakupów, musisz też wywołać setListener()
, przekazując odniesienie do
PurchasesUpdatedListener
Ten odbiornik otrzymuje aktualizacje dotyczące wszystkich
zakupów w aplikacji.
Kotlin
private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases -> // To be implemented in a later section. } private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build()
Java
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { // To be implemented in a later section. } }; private BillingClient billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build();
Połącz z Google Play
Po utworzeniu BillingClient
musisz nawiązać połączenie z
Google Play.
Aby połączyć się z Google Play, zadzwoń pod numer startConnection()
. Połączenie
proces jest asynchroniczny i musisz zaimplementować tag
BillingClientStateListener
, aby otrzymać oddzwonienie po skonfigurowaniu
został zakończony i jest gotowy do przesyłania kolejnych żądań.
Musisz też wdrożyć mechanizm ponawiania prób w celu obsługi utraconych połączeń z Google Play.
Aby wdrożyć logikę ponawiania prób, zastąp onBillingServiceDisconnected()
i upewnij się, że BillingClient
wywołuje metodę
Metodę startConnection()
, aby ponownie połączyć się z Google Play przed
kolejnych próśb.
Poniższy przykład pokazuje, jak rozpocząć połączenie i sprawdzić, czy jest gotowe do użycia:
Kotlin
billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(billingResult: BillingResult) { if (billingResult.responseCode == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } override fun onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. } })
Java
billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } @Override public void onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. } });
Pokaż produkty dostępne do kupienia
Po nawiązaniu połączenia z Google Play możesz wykonywać zapytania. Twoich dostępnych produktów i wyświetlać je użytkownikom.
Zapytanie o szczegóły produktu jest ważnym krokiem przed wyświetleniem produktów, ponieważ zwraca zlokalizowane informacje o nich. Dla: upewnij się, że Twoje produkty są zgodne ze wszystkimi zasadami Google Play.
Aby wysłać zapytanie o szczegóły produktu w aplikacji, zadzwoń pod numer queryProductDetailsAsync()
.
Aby obsługiwać wynik operacji asynchronicznej, musisz także określić
detektor implementujący interfejs ProductDetailsResponseListener
.
Możesz wtedy zastąpić parametr onProductDetailsResponse()
, aby wysyłać powiadomienia
detektor po zakończeniu zapytania, jak w tym przykładzie:
Kotlin
val queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build() billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult, productDetailsList -> // check billingResult // process returned productDetailsList }
Java
QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { // check billingResult // process returned productDetailsList } } )
W przypadku zapytania o szczegóły produktu przekaż instancję
QueryProductDetailsParams
, która określa listę ciągów znaków z identyfikatorami produktów.
utworzone w Konsoli Google Play wraz z elementem ProductType
.
ProductType
może mieć wartość ProductType.INAPP
w przypadku produktów kupowanych raz lub
ProductType.SUBS
za subskrypcje.
Wysyłanie zapytań z użyciem rozszerzeń Kotlin
Jeśli używasz rozszerzeń Kotlin, możesz wysyłać zapytania o produkty w aplikacji.
szczegóły, wywołując funkcję rozszerzenia queryProductDetails()
.
queryProductDetails()
wykorzystuje współrzędne Kotlin, dzięki czemu nie trzeba
zdefiniować osobnego detektora. Zamiast tego funkcja zostaje zawieszona do momentu
Następnie możesz przetworzyć wynik:
suspend fun processPurchases() {
val productList = listOf(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("product_id_example")
.setProductType(BillingClient.ProductType.SUBS)
.build()
)
val params = QueryProductDetailsParams.newBuilder()
params.setProductList(productList)
// leverage queryProductDetails Kotlin extension function
val productDetailsResult = withContext(Dispatchers.IO) {
billingClient.queryProductDetails(params.build())
}
// Process the result.
}
Rzadko niektóre urządzenia nie obsługują funkcji ProductDetails
i
queryProductDetailsAsync()
, zwykle z powodu nieaktualnych wersji Google Play
Usługi. Aby zapewnić sobie odpowiednie wsparcie w tym scenariuszu, naucz się używać
funkcje zgodności wstecznej w migracji Biblioteki płatności w Play 5
.
Przetwarzanie wyniku
Biblioteka płatności w Google Play przechowuje wyniki zapytania w List
:
ProductDetails
obiektów. Możesz następnie wywoływać różne metody w każdym
ProductDetails
obiekt na liście, aby wyświetlić istotne informacje o aplikacji w aplikacji.
np. jego cenę lub opis. Aby wyświetlić dostępne szczegóły produktu
informacje, zobacz listę metod w klasie ProductDetails
.
Zanim zaoferujesz produkt na sprzedaż, sprawdź, czy użytkownik nie ma jeszcze elementu. Jeśli użytkownik ma nadal w bibliotece produktów zużywanych, muszą konsumować przedmiot, zanim będą mogli go ponownie kupić.
Zanim zaoferujesz subskrypcję, sprawdź, czy użytkownik jeszcze jej nie subskrybuje. Pamiętaj też o tych kwestiach:
queryProductDetailsAsync()
zwraca szczegóły produktu objętego subskrypcją oraz z maksymalnie 50 ofert na subskrypcję.queryProductDetailsAsync()
zwraca tylko te oferty, w przypadku których użytkownik odpowiednie. Jeśli użytkownik spróbuje kupić ofertę, której dotyczy nieodpowiednie (na przykład jeśli aplikacja wyświetla nieaktualną listę adresów kwalifikujących się ofert), Google Play informuje użytkownika, że nie spełnia wymagań, użytkownik może zdecydować się na zakup abonamentu podstawowego.
Rozpoczynanie procesu zakupu
Aby wysłać prośbę o zakup z aplikacji, zadzwoń pod numer launchBillingFlow()
z głównego wątku aplikacji. Ta metoda odwołuje się do
BillingFlowParams
obiekt zawierający odpowiedni
Obiekt ProductDetails
uzyskany z wywołania
queryProductDetailsAsync()
. Aby utworzyć obiekt BillingFlowParams
, użyj
klasę BillingFlowParams.Builder
.
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For One-time product, "setOfferToken" method shouldn't be called. // For subscriptions, to get an offer token, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For one-time products, "setOfferToken" method shouldn't be called. // For subscriptions, to get an offer token, call // ProductDetails.subscriptionOfferDetails() for a list of offers // that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
Metoda launchBillingFlow()
zwraca jeden z kilku kodów odpowiedzi wymienionych w polu
BillingClient.BillingResponseCode
Sprawdź ten wynik do:
upewnić się, że podczas rozpoczynania procesu zakupu nie wystąpiły żadne błędy. BillingResponseCode
z OK
oznacza udane uruchomienie.
Po udanym wywołaniu launchBillingFlow()
system wyświetla
Odtwórz ekran zakupu. Rysunek 1 przedstawia ekran zakupu subskrypcji:
![Na ekranie zakupu w Google Play widać subskrypcję,
dostępne do zakupu](https://developer.android.google.cn/static/images/google/play/billing/purchase-screen.png?authuser=19&hl=pl)
Google Play łączy się z firmą onPurchasesUpdated()
, by dostarczyć wynik zakupu
do detektora, który implementuje PurchasesUpdatedListener
za pomocą prostego interfejsu online. Detektor jest określany za pomocą metody setListener()
, gdy
zainicjował(a) klienta.
Aby obsługiwać możliwe kody odpowiedzi, musisz zaimplementować onPurchasesUpdated()
.
Z przykładu poniżej dowiesz się, jak zastąpić kolumnę onPurchasesUpdated()
:
Kotlin
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) { if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) { for (purchase in purchases) { handlePurchase(purchase) } } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } }
Java
@Override void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { handlePurchase(purchase); } } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } }
Pomyślny zakup generuje ekran z potwierdzeniem zakupu w Google Play podobny do tego, rys. 2.
![Ekran z potwierdzeniem zakupu w Google Play](https://developer.android.google.cn/static/images/google/play/billing/purchase-success.png?authuser=19&hl=pl)
Pomyślny zakup generuje też token zakupu, identyfikator reprezentujący użytkownika i identyfikator produktu w aplikacji zakupu. Aplikacje mogą przechowywać token zakupu lokalnie, zalecamy przekazanie tokena do bezpiecznego serwera backendu, zweryfikować zakup i zapewnić ochronę przed oszustwami. Procedura ta została szczegółowo opisana w następnej sekcji.
Użytkownik otrzyma też e-maila z potwierdzeniem transakcji, który zawiera identyfikator zamówienia lub unikalny identyfikator transakcji. Użytkownicy otrzymują e-maila z unikalnym identyfikatorem zamówienia za każdy jednorazowy zakup produktu, a także za pierwszą subskrypcję i kolejnych automatycznych odnowieniach. Możesz użyć identyfikatora zamówienia, do zarządzania zwrotami środków w Konsoli Google Play.
Pokazuj spersonalizowaną cenę
Jeśli Twoja aplikacja może być rozpowszechniana wśród użytkowników w Unii Europejskiej, użyj atrybutu
setIsOfferPersonalized()
, aby poinformować użytkowników, że cena produktu była
i personalizację
za pomocą automatycznego procesu decyzyjnego.
![Ekran zakupu w Google Play z informacją, że cena została dostosowana do potrzeb użytkownika.](https://developer.android.google.cn/static/images/google/play/billing/personalized-pricing.png?authuser=19&hl=pl)
Należy skonsultować się z art. 6 ust. 1 (ea) CRD dyrektywy w sprawie praw konsumentów 2011/83/EU, aby ustalić, czy cena oferowana użytkownikom spersonalizowanej.
Funkcja setIsOfferPersonalized()
stosuje wartości logiczne. Gdy true
, interfejs Google Play
zawiera oświadczenie. Gdy false
, interfejs użytkownika pominie komunikat. Domyślny
ma wartość false
.
Więcej informacji znajdziesz w Centrum pomocy dla klientów indywidualnych.
Przetwarzam zakupy
Gdy użytkownik dokona zakupu, aplikacja musi go przetworzyć.
W większości przypadków aplikacja jest powiadamiana o zakupach na
PurchasesUpdatedListener
Są jednak przypadki, gdy aplikacja
powiadomił(a) o zakupach, dzwoniąc pod numer BillingClient.queryPurchasesAsync()
jak opisano w sekcji Pobieranie zakupów.
Jeśli korzystasz z klienta powiadomień dla deweloperów w czasie rzeczywistym,
do bezpiecznego backendu, możesz rejestrować nowe zakupy, odbierając
subscriptionNotification
lub oneTimeProductNotification
ostrzega o
nowy zakup. Po otrzymaniu takich powiadomień skontaktuj się z
Developer API, aby uzyskać pełny stan i zaktualizować własny stan backendu.
Aplikacja powinna przetwarzać zakup w ten sposób:
- Zweryfikuj zakup.
- Przekaż treść użytkownikowi i potwierdź jej dostarczenie. Opcjonalnie oznacz produkt jako wykorzystany, by użytkownik mógł go kupić ponownie.
Aby zweryfikować zakup, najpierw upewnij się, że stan zakupu to
PURCHASED
. Jeśli zakup to PENDING
, musisz przetworzyć
zakupu zgodnie z opisem w sekcji Obsługa transakcji oczekujących. Do zakupów
otrzymanych od onPurchasesUpdated()
lub queryPurchasesAsync()
, Ty
powinien dokładniej zweryfikować zakup, aby potwierdzić jego zasadność, zanim aplikacja ją zatwierdzi.
zezwolenie. Więcej informacji o prawidłowej weryfikacji zakupu znajdziesz w sekcji Weryfikowanie zakupów
przed przyznaniem uprawnień.
Po zweryfikowaniu zakupu aplikacja jest gotowa do przyznawania uprawnień aplikacji
użytkownika. Konto użytkownika powiązane z zakupem można zidentyfikować za pomocą
ProductPurchase.obfuscatedExternalAccountId
zwrócone przez
Purchases.products:get
w przypadku zakupów produktów w aplikacji oraz
SubscriptionPurchase.obfuscatedExternalAccountId
zwrócone przez
Purchases.subscriptions:get
w przypadku subskrypcji po stronie serwera lub
obfuscatedAccountId
od Purchase.getAccountIdentifiers()
na
po stronie klienta, jeśli został ustawiony przy użyciu parametru setObfuscatedAccountId
, gdy
dokonał(a) zakupu.
Po przyznaniu uprawnień aplikacja musi potwierdzić zakup. Ten potwierdzasz, że informujesz Google Play, że przyznałeś(-aś) uprawnienia za zakup.
Proces przyznawania uprawnienia i potwierdzenia zakupu zależy od tego, czy zakup to przedmiot konsumpcyjny, nieużywany lub subskrypcja.
Produkty konsumpcyjne
W przypadku materiałów eksploatacyjnych, jeśli aplikacja ma bezpieczny backend, zalecamy użycie
Purchases.products:consume
, aby móc wygodnie korzystać z zakupów. Upewnij się, że parametr
zakup nie został jeszcze wykorzystany, sprawdzając pole consumptionState
na stronie
w wyniku wywołania funkcji Purchases.products:get
. Jeśli aplikacja jest przeznaczona tylko dla klientów
bez backendu, użyj consumeAsync()
z
Biblioteka płatności w Google Play. Obie metody spełniają potwierdzenie
wymaganie i wskaż, że aplikacja przyznała użytkownikowi odpowiednie uprawnienia.
Dzięki tym metodom aplikacja może dostosować jednorazowy produkt do
podany token zakupu, który można ponownie kupić. Z Tobą (consumeAsync()
)
musi też przekazywać obiekt, który implementuje interfejs ConsumeResponseListener
za pomocą prostego interfejsu online. Ten obiekt obsługuje wynik operacji konsumpcji. Dostępne opcje
zastępuje metodę onConsumeResponse()
, która
Po zakończeniu operacji wywołuje połączenie z Biblioteki płatności w Google Play.
Poniższy przykład pokazuje korzystanie z produktu z atrybutem Biblioteki płatności w Google Play przy użyciu powiązanego tokena zakupu:
Kotlin
suspend fun handlePurchase(purchase: Purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. val purchase : Purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build() val consumeResult = withContext(Dispatchers.IO) { client.consumePurchase(consumeParams) } }
Java
void handlePurchase(Purchase purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. Purchase purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. ConsumeParams consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Handle the success of the consume operation. } } }; billingClient.consumeAsync(consumeParams, listener); }
Produkty, które się nie zużywają
Aby potwierdzić zakupy, których nie można wykorzystać, jeśli aplikacja ma bezpieczny backend,
zalecamy użycie Purchases.products:acknowledge
, aby
zakupów. Upewnij się, że sprzedawca nie potwierdził wcześniej zakupu
sprawdzanie acknowledgementState
w wyniku wywołania
Purchases.products:get
Jeśli Twoja aplikacja jest przeznaczona tylko dla klientów, użyj BillingClient.acknowledgePurchase()
z
z Biblioteki płatności w Google Play w aplikacji. Przed potwierdzeniem
aplikacji, aplikacja powinna sprawdzić, czy została już potwierdzony, korzystając z
isAcknowledged()
w Bibliotece płatności w Google Play.
Poniższy przykład pokazuje, jak potwierdzić zakup za pomocą Biblioteka płatności w Google Play:
Kotlin
val client: BillingClient = ... val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ... suspend fun handlePurchase() { if (purchase.purchaseState === PurchaseState.PURCHASED) { if (!purchase.isAcknowledged) { val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) val ackPurchaseResult = withContext(Dispatchers.IO) { client.acknowledgePurchase(acknowledgePurchaseParams.build()) } } } }
Java
BillingClient client = ... AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ... void handlePurchase(Purchase purchase) { if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { if (!purchase.isAcknowledged()) { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }
Subskrypcje
Subskrypcje są obsługiwane podobnie jak materiały niewykorzystane. Jeśli to możliwe, użyj funkcji
Purchases.subscriptions.acknowledge
z
interfejsu Google Play Developer API, aby potwierdzić zakup
bezpiecznego backendu. Sprawdź, czy zakup nie został wcześniej potwierdzony przez
sprawdzając acknowledgementState
w zasobach dotyczących zakupu
Purchases.subscriptions:get
W przeciwnym razie możesz potwierdzić
subskrypcja za pomocą BillingClient.acknowledgePurchase()
z
Biblioteka płatności w Google Play po sprawdzeniu isAcknowledged()
. Wszystkie
należy potwierdzić zakup początkowych subskrypcji. Odnawianie subskrypcji
nie wymagają potwierdzenia. Więcej informacji o tym, kiedy subskrypcje
wymagają potwierdzenia, przeczytaj temat Sprzedaż subskrypcji.
Pobieranie zakupów
Odsłuchiwanie powiadomień o zakupach za pomocą PurchasesUpdatedListener
nie jest
wystarcza do przetworzenia wszystkich zakupów przez aplikację. Możliwe, że
aplikacja może nie wiedzieć o wszystkich zakupach użytkownika. Oto kilka
sytuacje, w których aplikacja może utracić śledzenie zakupów lub nie być świadoma zakupów:
- Problemy z siecią podczas zakupu: użytkownik dokonuje zakupu.
i otrzymuje potwierdzenie od Google, ale urządzenie traci sieć
urządzenie, zanim urządzenie otrzyma powiadomienie o zakupie.
przez
PurchasesUpdatedListener
. - Wiele urządzeń: użytkownik kupuje produkt na jednym urządzeniu, a następnie oczekuje, zobaczą go, gdy zmieni urządzenie.
- Obsługa zakupów dokonanych poza aplikacją: niektóre zakupy, takie jak z promocji można dokonywać poza aplikacją.
Aby rozwiązać te problemy, upewnij się, że aplikacja wywołuje
BillingClient.queryPurchasesAsync()
w metodzie onResume()
do
należy się upewnić, że wszystkie zakupy zostaną przetworzone zgodnie z opisem w sekcji dotyczącej przetwarzania danych.
zakupów.
Przykład poniżej pokazuje, jak pobrać informacje o zakupach subskrypcji użytkownika.
Pamiętaj, że queryPurchasesAsync()
zwraca tylko aktywne subskrypcje oraz
niewymagających zakupów.
Kotlin
val params = QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) // uses queryPurchasesAsync Kotlin extension function val purchasesResult = billingClient.queryPurchasesAsync(params.build()) // check purchasesResult.billingResult // process returned purchasesResult.purchasesList, e.g. display the plans user owns
Java
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) .build(), new PurchasesResponseListener() { public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) { // check billingResult // process returned purchase list, e.g. display the plans user owns } } );
Obsługa zakupów dokonanych poza aplikacją
Niektóre zakupy (np. wykorzystanie promocji) mogą odbywać się poza aplikacją. Gdy użytkownik dokona zakupu poza aplikacją, oczekuje, że wyświetli się ona poza aplikacją wiadomości w aplikacji lub skorzystać z jakiegoś mechanizmu powiadomień, aby umożliwić użytkownikowi będą wiedzieć, że aplikacja prawidłowo otrzymała i przetworzyła zakup. Średnio akceptowalne mechanizmy to:
- Pokaż wyskakujące okienko w aplikacji.
- Umieść wiadomość w polu wiadomości w aplikacji i wyraźnie o tym to nowa wiadomość w polu wiadomości w aplikacji.
- Użyj powiadomienia z systemu operacyjnego.
Pamiętaj, że aplikacja może być w dowolnym stanie, rozpozna zakup. Jest nawet możliwe, że aplikacja w ogóle nie będzie zainstalowano podczas dokonywania zakupu. Użytkownicy oczekują, że kupią produkt podczas wznawiania aplikacji, niezależnie od jej stanu.
Musisz wykrywać zakupy niezależnie od tego, w jakim stanie aplikacja została dokonał(a) zakupu. Istnieją jednak wyjątki, w których dopuszczalna jest akceptowalna aby nie powiadamiać użytkownika od razu o jego dostarczeniu. Na przykład:
- W trakcie czynności, w której wyświetlenie komunikatu może rozpraszać uwagę użytkownika. W takim przypadku należy powiadomić użytkownika o zakończeniu danego działania.
- W trakcie przerywników, w których pokazanie wiadomości może rozpraszać uwagę użytkownika. W tym Trzeba powiadomić użytkownika o jego zakończeniu.
- W trakcie początkowego samouczka i konfiguracji użytkownika w grze. Zalecamy powiadamiasz nowych użytkowników o nagrodzie natychmiast po tym, jak otworzą grę; podczas początkowej konfiguracji użytkownika. Można jednak poczekać, aż główna jest sekwencja gry, którą użytkownik może powiadomić.
Przy podejmowaniu decyzji, kiedy i w jaki sposób powiadamiać użytkowników o
zakupów dokonanych poza aplikacją. Za każdym razem, gdy użytkownik nie otrzyma od razu
powiadomienie, może się pomylić i przestać używać aplikacji, skontaktuj się z użytkownikiem
wsparcia lub narzekania w mediach społecznościowych. Uwaga:
Domena PurchasesUpdatedListener
jest zarejestrowana w Twojej aplikacji
kontekstu do obsługi aktualizacji zakupów, w tym zakupów zainicjowanych poza domenę
Twojej aplikacji. Oznacza to, że jeżeli proces zgłaszania nie istnieje,
Użytkownik PurchasesUpdatedListener
nie zostanie powiadomiony. Dlatego aplikacja powinna
wywołaj metodę BillingClient.queryPurchasesAsync()
w metodzie onResume()
jako
wspomniane w artykule Pobieranie zakupów.
Obsługa oczekujących transakcji
Google Play obsługuje transakcje oczekujące, czyli takie, które wymagają jednej lub wykonanie dodatkowych czynności, które mogą wystąpić, gdy użytkownik zainicjuje zakup forma płatności została przetworzona. Aplikacja nie powinna przyznawać dostępu takich zakupów, dopóki Google nie powiadomi Cię, że forma płatności użytkownika została obciążona opłatą.
Na przykład użytkownik może zainicjować transakcję, wybierając sklep stacjonarny gdzie zapłaci później gotówką. Użytkownik otrzymuje kod przez powiadomienia i e-maila. Gdy użytkownik odwiedzi sklep stacjonarny, może wykorzystać kod u kasjera i zapłacić gotówką. Google powiadomi o tym i użytkownik, który otrzymał płatność, Aplikacja może wtedy przyznać uprawnienia uprawnienia użytkownika.
Wywołaj enablePendingPurchases()
w ramach inicjowania
BillingClient
, by włączyć oczekujące transakcje dla Twojej aplikacji. Aplikacja musi:
włączać i obsługiwać oczekujące transakcje w przypadku produktów kupowanych raz. Przed
podczas dodawania pomocy, zapoznaj się z cyklem życia zakupów w przypadku
transakcji.
Gdy aplikacja otrzyma nowy zakup, za pomocą
PurchasesUpdatedListener
lub w wyniku połączenia
queryPurchasesAsync()
, użyj metody getPurchaseState()
do
określić, czy stan zakupu to PURCHASED
, czy PENDING
. Zalecenia
przyznawaj uprawnienia tylko wtedy, gdy stan to PURCHASED
.
Jeśli aplikacja jest uruchomiona, gdy użytkownik finalizuje zakup,
Pole PurchasesUpdatedListener
jest wywoływane ponownie, a pole PurchaseState
jest teraz wywoływane ponownie
PURCHASED
. Na tym etapie aplikacja może przetworzyć zakup przy użyciu
do przetwarzania zakupów. Aplikacja powinna również wywołać funkcję
queryPurchasesAsync()
w metodzie onResume()
aplikacji do obsługi zakupów
które zostały przeniesione do stanu PURCHASED
, gdy Twoja aplikacja nie była uruchomiona.
Po zmianie stanu zakupu z PENDING
na
PURCHASED
, Twój klient powiadomień w czasie rzeczywistym dla deweloperów otrzyma wiadomość
ONE_TIME_PRODUCT_PURCHASED
lub
SUBSCRIPTION_PURCHASED
. Jeśli zakup zostanie anulowany,
otrzymuje ONE_TIME_PRODUCT_CANCELED
lub
SUBSCRIPTION_PENDING_PURCHASE_CANCELED
powiadomienie. Może się tak zdarzyć, jeśli
klient nie ureguluje płatności w wymaganym terminie. Pamiętaj, że
zawsze może użyć interfejsu Google Play Developer API, aby sprawdzić bieżący stan
zakup.
Obsługa zakupu wielu sztuk tego samego produktu
Obsługiwane w Bibliotece płatności w Google Play w wersji 4.0 i nowszych. Google Play pozwala klientom kupować więcej niż jedną sztukę w aplikacji. produktu w jednej transakcji, określając ilość z koszyka. Twoje aplikacja powinna obsługiwać zakupy naraz i przyznawać uprawnienia na podstawie uprawnień w ramach określonej wielkości zakupu.
Aby można było korzystać z zakupów obejmujących kilka sztuk, logika obsługi administracyjnej aplikacji musi sprawdzić,
za określoną liczbę produktów. Dostęp do pola quantity
możesz uzyskać z poziomu jednej z
następujące interfejsy API:
getQuantity()
z Biblioteki płatności w Google Play.Purchases.products.quantity
z interfejsu Google Play Developer API.
Gdy dodasz już reguły do obsługi wielu zakupów jednocześnie, włącz funkcję wielu sztuk tego samego produktu w aplikacji stronie zarządzania usługami w Google Play Developer Console.
Zapytanie o konfigurację płatności użytkownika
getBillingConfigAsync()
podaje kraj, z którego korzysta użytkownik
Google Play.
Możesz przesłać zapytanie o konfigurację płatności użytkownika po
tworząc element BillingClient
. Poniższy fragment kodu opisuje
Jak zadzwonić do: getBillingConfigAsync()
? Przetwórz odpowiedź według
zaimplementuję BillingConfigResponseListener
. Ten detektor otrzymuje
Aktualizacje dotyczące wszystkich zapytań dotyczących konfiguracji płatności zainicjowanych z Twojej aplikacji.
Jeśli zwrócona wartość BillingResult
nie zawiera błędów, możesz sprawdzić
countryCode
w obiekcie BillingConfig
, aby uzyskać wartość Play użytkownika
Kraj.
Kotlin
// Use the default GetBillingConfigParams.
val getBillingConfigParams = GetBillingConfigParams.newBuilder().build()
billingClient.getBillingConfigAsync(getBillingConfigParams,
object : BillingConfigResponseListener {
override fun onBillingConfigResponse(
billingResult: BillingResult,
billingConfig: BillingConfig?
) {
if (billingResult.responseCode == BillingResponseCode.OK
&& billingConfig != null) {
val countryCode = billingConfig.countryCode
...
} else {
// TODO: Handle errors
}
}
})
Java
// Use the default GetBillingConfigParams.
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(getBillingConfigParams,
new BillingConfigResponseListener() {
public void onBillingConfigResponse(
BillingResult billingResult, BillingConfig billingConfig) {
if (billingResult.getResponseCode() == BillingResponseCode.OK
&& billingConfig != null) {
String countryCode = billingConfig.getCountryCode();
...
} else {
// TODO: Handle errors
}
}
});