Analizowanie rezygnacji z zakupu produktu w Płatnościach w Google Play

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...

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:

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:

  1. Pobierz przykładową aplikację z GitHub.
  2. 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.
  3. Wygeneruj podpisany pakiet aplikacji na Androida.
    1. Generowanie klucza przesyłania i magazynu kluczy
    2. Podpisywanie aplikacji kluczem przesyłania
    3. Konfigurowanie podpisywania aplikacji przez Google Play

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ę:

  1. Zaloguj się w Konsoli Google Play, korzystając z konta dewelopera.
  2. Kliknij Utwórz aplikację. Otworzy się strona Utwórz aplikację.
  3. Wpisz nazwę aplikacji, wybierz domyślny język i podaj inne szczegóły dotyczące aplikacji.
  4. 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

  1. 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.
  2. Kliknij Testuj i publikuj > Testowanie > Wersja wewnętrzna > Utwórz nową wersję.
  3. Wpisz nazwę wersji i prześlij podpisany plik pakietu aplikacji.
  4. Kliknij Dalej, a następnie Zapisz i opublikuj.

Teraz możesz tworzyć produkty kupowane raz.

Tworzenie produktu kupowanego raz

Aby utworzyć produkt kupowany raz:

  1. W Konsoli Google Play w menu nawigacyjnym po lewej stronie kliknij Zarabianie w Google Play > Produkty > Produkty kupowane raz.
  2. Kliknij Utwórz produkt kupowany raz.
  3. 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.
    Uwaga: na potrzeby tego kursu możesz pominąć konfigurowanie sekcji Podatki, zgodność z przepisami i programy.
  4. Kliknij Dalej.
  5. 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.
  6. W sekcji Dostępność i ceny kliknij Ustaw ceny > Edytuj zbiorczo ceny.
  7. Wybierz opcję Kraj / region. Spowoduje to zaznaczenie wszystkich regionów.
  8. Kliknij Dalej. Otworzy się okno, w którym możesz wpisać cenę. Wpisz 10 PLN, a potem kliknij Zastosuj.
  9. 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:

  1. 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")
    }
    
  2. 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();
    }
    
  3. 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.");
          }
        });
    }
    
  4. 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.
    private 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);
          }
        });
    }
    
    Pobieranie 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": []
            }
        ]
    }
    
  5. 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);
    }
    
  6. wykrywać i przetwarzać zakupy, W ramach tego kroku musisz:
    1. Weryfikowanie zakupu
    2. Przyznawanie uprawnień użytkownikowi
    3. Powiadomienie użytkownika
    4. Powiadamianie Google o procesie zakupu
    Kroki a, b i c należy wykonać w backendzie, dlatego nie są one objęte tym samouczkiem.Poniższy fragment kodu pokazuje, jak powiadomić Google o produkcie jednorazowym, który można wykorzystać:
    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, OKITEM_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_CANCELLEDBILLING_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ąć?

  • Może to wskazywać na użytkowników o niskim zamiarze zakupu, którzy są wrażliwi na ceny.
  • Zakup oczekuje na realizację lub płatność została odrzucona.

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ąć?

  • Aplikacja Sklep Play na urządzeniu użytkownika jest nieaktualna.
  • Użytkownik znajduje się w kraju, w którym usługa Google Play nie jest obsługiwana.
  • Użytkownik jest użytkownikiem firmowym, a administrator firmowy wyłączył możliwość dokonywania zakupów przez użytkowników.
  • Nie udało się obciążyć formy płatności użytkownika. Na przykład ważność karty kredytowej użytkownika mogła wygasnąć.
  • Śledzenie trendów dotyczących problemów z systemem i w określonych regionach
  • Zastanów się nad przejściem na PBL 8, ponieważ obsługuje on bardziej szczegółowy kod odpowiedzi PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS. Jeśli otrzymasz ten kod odpowiedzi, możesz powiadomić użytkowników o niepowodzeniu lub zaproponować im alternatywne formy płatności.
  • Ten kod odpowiedzi jest przeznaczony do ponawiania prób, co pozwala wdrażać odpowiednie strategie ponawiania.
    Automatyczne ponawianie prób w tym przypadku prawdopodobnie nie pomoże. Jeśli jednak użytkownik rozwiąże problem, który spowodował błąd, ręczna próba ponowienia może pomóc. Jeśli na przykład użytkownik zaktualizuje wersję Sklepu Play do obsługiwanej wersji, ręczne ponowienie próby wykonania pierwotnej operacji może zadziałać.

    Jeśli otrzymasz ten kod odpowiedzi, gdy użytkownik nie jest w sesji, ponawianie próby może nie mieć sensu. Gdy w wyniku procesu zakupu otrzymasz odpowiedź „BILLING_UNAVAILABLE”, jest bardzo prawdopodobne, że użytkownik otrzymał informację zwrotną z Google Play podczas procesu zakupu i może wiedzieć, co poszło nie tak. W takim przypadku możesz wyświetlić komunikat o błędzie z informacją, że coś poszło nie tak, i udostępnić przycisk „Spróbuj ponownie”, aby umożliwić użytkownikowi ręczne ponowienie próby po rozwiązaniu problemu.

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

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.