1. Wprowadzenie
W tym samouczku skupisz się na utworzeniu produktu kupowanego raz, zintegrowaniu aplikacji z biblioteką Płatności w Google Play (PBL) i analizowaniu przyczyn rezygnacji z zakupu.
Odbiorcy
Te warsztaty są przeznaczone dla programistów aplikacji na Androida, którzy korzystają z Biblioteki płatności w Google Play (PBL) lub chcą jej używać do generowania przychodów z produktów jednorazowych.
Czego się nauczysz...
- Jak tworzyć produkty kupowane raz w Konsoli Google Play.
- Jak zintegrować aplikację z PBL.
- Jak przetwarzać zakupy produktów konsumpcyjnych i niekonsumpcyjnych kupowanych raz w Bibliotece płatności w Play.
- Jak analizować rezygnacje z zakupu.
Co będzie Ci potrzebne...
- Dostęp do Konsoli Google Play za pomocą konta dewelopera. Jeśli nie masz konta dewelopera, musisz utworzyć konto.
- Przykładowa aplikacja do tego laboratorium, którą możesz pobrać z GitHuba.
- Android Studio
2. Tworzenie przykładowej aplikacji
Aplikacja przykładowa to w pełni funkcjonalna aplikacja na Androida z kompletnym kodem źródłowym, która prezentuje te aspekty:
- Integracja aplikacji z PBL
- Pobieranie produktów kupowanych raz
- Uruchamianie procesów zakupu produktów kupowanych raz
- Scenariusze zakupu, które prowadzą do tych odpowiedzi dotyczących płatności:
BILLING_UNAVAILABLE
USER_CANCELLED
OK
ITEM_ALREADY_OWNED
Poniższy film demonstracyjny pokazuje, jak będzie wyglądać i działać przykładowa aplikacja po wdrożeniu i uruchomieniu.
Wymagania wstępne
Zanim utworzysz i wdrożysz przykładową aplikację, wykonaj te czynności:
- Utwórz konto dewelopera w Konsoli Google Play. Jeśli masz już konto dewelopera, pomiń ten krok.
- Utwórz nową aplikację w Konsoli Play. Podczas tworzenia aplikacji możesz podać dowolną nazwę aplikacji przykładowej.
- Zainstaluj Android Studio.
Kompilacja
Celem tego kroku jest wygenerowanie podpisanego pliku pakietu aplikacji na Androida dla aplikacji przykładowej.
Aby wygenerować pakiet aplikacji na Androida, wykonaj te czynności:
- Pobierz przykładową aplikację z GitHub.
- Skompiluj przykładową aplikację. Zanim to zrobisz, zmień nazwę pakietu przykładowej aplikacji, a potem ją skompiluj. Jeśli w Konsoli Play masz pakiety innych aplikacji, upewnij się, że nazwa pakietu podana w przypadku aplikacji przykładowej jest unikalna.
Uwaga: utworzenie aplikacji przykładowej powoduje wygenerowanie tylko pliku APK, którego możesz używać do testowania lokalnego. Uruchomienie aplikacji nie powoduje jednak pobrania produktów i cen, ponieważ nie zostały one skonfigurowane w Konsoli Play. Zrobisz to w dalszej części tego laboratorium. - Wygeneruj podpisany pakiet aplikacji na Androida.
Następnym krokiem jest przesłanie pakietu aplikacji na Androida do Konsoli Google Play.
3. Tworzenie produktu kupowanego raz w Konsoli Play
Aby utworzyć produkty jednorazowe w Konsoli Google Play, musisz mieć aplikację w Konsoli Play. Utwórz aplikację w Konsoli Play, a następnie prześlij wcześniej utworzony podpisany pakiet aplikacji.
Tworzenie aplikacji
Aby utworzyć aplikację:
- Zaloguj się w Konsoli Google Play, korzystając z konta dewelopera.
- Kliknij Utwórz aplikację. Otworzy się strona Utwórz aplikację.
- Wpisz nazwę aplikacji, wybierz domyślny język i podaj inne szczegóły dotyczące aplikacji.
- Kliknij Utwórz aplikację. Spowoduje to utworzenie aplikacji w Konsoli Google Play.
Teraz możesz przesłać podpisany pakiet aplikacji przykładowej.
Prześlij podpisany pakiet aplikacji
- Prześlij podpisany pakiet aplikacji na ścieżkę testów wewnętrznych w Konsoli Google Play. Dopiero po przesłaniu możesz skonfigurować w Konsoli Play funkcje związane z zarabianiem.
- Kliknij Testuj i publikuj > Testowanie > Wersja wewnętrzna > Utwórz nową wersję.
- Wpisz nazwę wersji i prześlij podpisany plik pakietu aplikacji.
- Kliknij Dalej, a następnie Zapisz i opublikuj.
Teraz możesz tworzyć produkty kupowane raz.
Tworzenie produktu kupowanego raz
Aby utworzyć produkt kupowany raz:
- W Konsoli Google Play w menu nawigacyjnym po lewej stronie kliknij Zarabianie w Google Play > Produkty > Produkty kupowane raz.
- Kliknij Utwórz produkt kupowany raz.
- Podaj te szczegóły produktu:
- Identyfikator produktu: wpisz unikalny identyfikator produktu. Wpisz
one_time_product_01
. - (Opcjonalnie) Tagi: dodaj odpowiednie tagi.
- Nazwa: wpisz nazwę produktu. Na przykład:
Product name
. - Opis: wpisz opis produktu. Na przykład:
Product description
. - (Opcjonalnie) Dodaj obraz ikony: prześlij ikonę, która reprezentuje Twój produkt.
- Identyfikator produktu: wpisz unikalny identyfikator produktu. Wpisz
- Kliknij Dalej.
- Dodaj opcję zakupu i skonfiguruj jej dostępność regionalną. Produkt kupowany raz wymaga co najmniej 1 opcji zakupu, która określa sposób przyznania uprawnienia, jego cenę i dostępność regionalną. W tym samouczku dodamy standardową opcję Kup dla produktu.W sekcji Opcja zakupu podaj te informacje:
- Identyfikator opcji zakupu: wpisz identyfikator opcji zakupu. Na przykład:
buy
. - Typ zakupu: wybierz Kup.
- (Opcjonalnie) Tagi: dodaj tagi dotyczące tej opcji zakupu.
- (Opcjonalnie) Kliknij Opcje zaawansowane, aby skonfigurować opcje zaawansowane. Na potrzeby tego laboratorium możesz pominąć konfigurację opcji zaawansowanych.
- Identyfikator opcji zakupu: wpisz identyfikator opcji zakupu. Na przykład:
- W sekcji Dostępność i ceny kliknij Ustaw ceny > Edytuj zbiorczo ceny.
- Wybierz opcję Kraj / region. Spowoduje to zaznaczenie wszystkich regionów.
- Kliknij Dalej. Otworzy się okno, w którym możesz wpisać cenę. Wpisz 10 PLN, a potem kliknij Zastosuj.
- Kliknij Zapisz, a następnie Aktywuj. Opcja zakupu zostanie utworzona i aktywowana.
Na potrzeby tego laboratorium utwórz 3 dodatkowe produkty kupowane raz z tymi identyfikatorami:
- consumable_product_01
- consumable_product_02
- consumable_product_03
Przykładowa aplikacja jest skonfigurowana tak, aby używać tych identyfikatorów produktów. Możesz podać różne identyfikatory produktów. W takim przypadku musisz zmodyfikować przykładową aplikację, aby używała podanego identyfikatora produktu.
Otwórz przykładową aplikację w Konsoli Google Play i kliknij Zarabianie w Google Play > Produkty > Produkty kupowane raz. Następnie kliknij Utwórz produkt kupowany raz i powtórz kroki od 3 do 9.
Film o tworzeniu produktu kupowanego raz
Poniższy przykładowy film pokazuje opisane wcześniej kroki tworzenia produktu kupowanego raz.
4. Integracja z PBL
Teraz zobaczysz, jak zintegrować aplikację z Biblioteką płatności w Google Play. W tej sekcji opisujemy ogólne etapy integracji i podajemy fragment kodu dla każdego z nich. Możesz użyć tych fragmentów jako wskazówek do wdrożenia rzeczywistej integracji.
Aby zintegrować aplikację z PBL, wykonaj te czynności:
- Dodaj zależność Biblioteki płatności w Google Play do aplikacji przykładowej.
dependencies { val billing_version = "8.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
- Zainicjuj BillingClient. BillingClient to pakiet SDK klienta, który znajduje się w aplikacji i komunikuje się z Biblioteką płatności w Google Play. Poniższy fragment kodu pokazuje, jak zainicjować klienta rozliczeń.
protected BillingClient createBillingClient() { return BillingClient.newBuilder(activity) .setListener(purchasesUpdatedListener) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) .enableAutoServiceReconnection() .build(); }
- Połącz się z Google Play.Poniższy fragment kodu pokazuje, jak połączyć się z Google Play.
public void startBillingConnection(ImmutableList<Product> productList) { Log.i(TAG, "Product list sent: " + productList); Log.i(TAG, "Starting connection"); billingClient.startConnection( new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Query product details to get the product details list. queryProductDetails(productList); } else { // BillingClient.enableAutoServiceReconnection() will retry the connection on // transient errors automatically. // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE, // DEVELOPER_ERROR). Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage()); Log.e(TAG, "Billing response code: " + billingResult.getResponseCode()); } } @Override public void onBillingServiceDisconnected() { Log.e(TAG, "Billing Service connection lost."); } }); }
- Pobierz szczegóły produktu kupowanego raz.Po zintegrowaniu aplikacji z PBL musisz pobrać szczegóły produktu kupowanego raz do aplikacji. Poniższy fragment kodu pokazuje, jak pobrać szczegóły produktu kupowanego raz w aplikacji.
Pobieranieprivate void queryProductDetails(ImmutableList<Product> productList) { Log.i(TAG, "Querying products for: " + productList); QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) { // check billingResult Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode()); // process returned productDetailsList Log.i( TAG, "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList()); setupProductDetailsMap(productDetailsResponse.getProductDetailsList()); billingServiceClientListener.onProductDetailsFetched(productDetailsMap); } }); }
ProductDetails
daje odpowiedź podobną do tej:{ "productId": "consumable_product_01", "type": "inapp", "title": "Shadow Coat (Yolo's Realm | Play Samples)", "name": "Shadow Coat", "description": "A sleek, obsidian coat for stealth and ambushes", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 1990000, "priceCurrencyCode": "USD", "formattedPrice": "$1.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] }, { "productId": "consumable_product_02", "type": "inapp", "title": "Emperor Den (Yolo's Realm | Play Samples)", "name": "Emperor Den", "description": "A fair lair glowing with molten rock and embers", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 2990000, "priceCurrencyCode": "USD", "formattedPrice": "$2.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] }
- Uruchom proces płatności.
public void launchBillingFlow(String productId) { ProductDetails productDetails = productDetailsMap.get(productId); if (productDetails == null) { Log.e( TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId); billingServiceClientListener.onBillingResponse( BillingResponseCode.ITEM_UNAVAILABLE, BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build()); return; } ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder().setProductDetails(productDetails).build()); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); billingClient.launchBillingFlow(activity, billingFlowParams); }
- wykrywać i przetwarzać zakupy, W ramach tego kroku musisz:
- Weryfikowanie zakupu
- Przyznawanie uprawnień użytkownikowi
- Powiadomienie użytkownika
- Powiadamianie Google o procesie zakupu
private void handlePurchase(Purchase purchase) { // Step 1: Send the purchase to your secure backend to verify the purchase following // https://developer.android.com/google/play/billing/security#verify // Step 2: Update your entitlement storage with the purchase. If purchase is // in PENDING state then ensure the entitlement is marked as pending and the // user does not receive benefits yet. It is recommended that this step is // done on your secure backend and can combine in the API call to your // backend in step 1. // Step 3: Notify the user using appropriate messaging. if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { for (String product : purchase.getProducts()) { Log.d(TAG, product + " purchased successfully! "); } } // Step 4: Notify Google the purchase was processed. // For one-time products, acknowledge the purchase. // This sample app (client-only) uses billingClient.acknowledgePurchase(). // For consumable one-time products, consume the purchase // This sample app (client-only) uses billingClient.consumeAsync() // If you have a secure backend, you must acknowledge purchases on your server using the // server-side API. // See https://developer.android.com/google/play/billing/security#acknowledge if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) { if (shouldConsume(purchase)) { ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); billingClient.consumeAsync(consumeParams, consumeResponseListener); } else { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase( acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }
5. Analizowanie rezygnacji z zakupu
W tym laboratorium skupiliśmy się na odpowiedziach Biblioteki płatności w Play w ograniczonych scenariuszach, takich jak USER_CANCELLED, BILLING_UNAVAILABLE, OK i ITEM_ALREADY_OWNED. System rozliczeniowy Google Play może jednak zwracać 13 różnych kodów odpowiedzi, które mogą być wywoływane przez różne czynniki.
W tej sekcji znajdziesz szczegółowe informacje o przyczynach błędów USER_CANCELLED
i BILLING_UNAVAILABLE
oraz proponowane działania naprawcze, które możesz wdrożyć.
Kod błędu odpowiedzi USER_CANCELED
Ten kod odpowiedzi oznacza, że użytkownik opuścił interfejs procesu zakupu przed jego zakończeniem.
Prawdopodobne przyczyny | Jakie działania możesz podjąć? |
|
|
Kod błędu odpowiedzi BILLING_UNAVAILABLE
Ten kod odpowiedzi oznacza, że nie można było dokonać zakupu z powodu problemu z dostawcą usług płatniczych użytkownika lub wybraną przez niego formą płatności. Na przykład karta kredytowa użytkownika wygasła lub użytkownik znajduje się w kraju, w którym usługa nie jest obsługiwana. Ten kod nie wskazuje błędu w samym systemie płatności w Google Play.
Prawdopodobne przyczyny | Jakie działania możesz podjąć? |
|
|
Strategie ponawiania prób w przypadku kodów błędów odpowiedzi
Skuteczne strategie ponawiania prób w przypadku błędów, które można naprawić, w Bibliotece płatności w Google Play (PBL) różnią się w zależności od kontekstu, np. interakcji użytkownika w sesji (takich jak podczas zakupu) w porównaniu z operacjami w tle (takimi jak wysyłanie zapytań o zakupy po wznowieniu działania aplikacji). Wdrożenie tych strategii jest ważne, ponieważ niektóre BillingResponseCode
wartości oznaczają tymczasowe problemy, które można rozwiązać, ponawiając próbę, a inne są trwałe i nie wymagają ponawiania prób.
W przypadku błędów napotkanych podczas sesji użytkownika zalecana jest prosta strategia ponawiania z ustaloną maksymalną liczbą prób, aby zminimalizować zakłócenia w korzystaniu z usługi. Z kolei w przypadku operacji w tle, takich jak potwierdzanie nowych zakupów, które nie wymagają natychmiastowego wykonania, zalecane jest wycofywanie wykładnicze.
Szczegółowe informacje o poszczególnych kodach odpowiedzi i odpowiednich zalecanych strategiach ponawiania znajdziesz w artykule Obsługa kodów odpowiedzi BillingResult.
6. Dalsze kroki
- Dowiedz się, jak zmaksymalizować integrację płatności w Google Play.
- Gdy użytkownicy zaczną kupować te produkty, pamiętaj, aby postępować zgodnie ze sprawdzonymi metodami weryfikowania i przetwarzania zakupów na bezpiecznym backendzie.
Dokumentacja
7. Gratulacje!
Gratulacje! Udało Ci się utworzyć nowy produkt jednorazowy w Konsoli Play, przetestować kody odpowiedzi dotyczące płatności i przeanalizować przyczyny rezygnacji z zakupu.
Ankieta
Twoja opinia na temat tego laboratorium jest dla nas bardzo cenna. Poświęć kilka minut na wypełnienie naszej ankiety.