Abbrüche bei Produktkäufen in Play Billing analysieren

1. Einführung

In diesem Codelab konzentrieren Sie sich auf das Erstellen eines Einmalkaufprodukts, die Integration Ihrer App in die Play Billing Library (PBL) und die Analyse von Gründen für Kaufabbrüche.

Zielgruppe

Dieses Codelab richtet sich an Android-App-Entwickler, die die Play Billing Library (PBL) verwenden oder PBL zur Monetarisierung ihrer Einmalkäufe nutzen möchten.

Lerninhalte

  • So erstellen Sie Einmalkaufprodukte in der Google Play Console.
  • So binden Sie Ihre App in PBL ein.
  • So verarbeiten Sie Käufe von verbrauchbaren und nicht verbrauchbaren Einmalkaufprodukten in der PBL.
  • So analysieren Sie Kaufabbrüche.

Voraussetzungen

2. Beispiel-App erstellen

Die Beispiel-App ist als voll funktionsfähige Android-App konzipiert, deren vollständiger Quellcode die folgenden Aspekte veranschaulicht:

  • App in PBL einbinden
  • Einmalkaufprodukte abrufen
  • Kaufvorgänge für die Einmalkaufprodukte starten
  • Kaufszenarien, die zu den folgenden Abrechnungsantworten führen:
    • BILLING_UNAVAILABLE
    • USER_CANCELLED
    • OK
    • ITEM_ALREADY_OWNED

Im folgenden Demovideo sehen Sie, wie die Beispiel-App nach der Bereitstellung und Ausführung aussieht und sich verhält.

Voraussetzungen

Führen Sie vor dem Erstellen und Bereitstellen der Beispiel-App die folgenden Schritte aus:

Build

Ziel dieses Build-Schritts ist es, eine signierte Android App Bundle-Datei der Beispiel-App zu generieren.

So generieren Sie das Android-App-Bundle:

  1. Laden Sie die Beispiel-App von GitHub herunter.
  2. Beispiel-App erstellen: Ändern Sie vor dem Erstellen den Paketnamen der Beispiel-App und erstellen Sie sie dann. Wenn Sie Pakete anderer Apps in der Play Console haben, achten Sie darauf, dass der Paketname, den Sie für die Beispiel-App angeben, eindeutig ist.

    Hinweis: Beim Erstellen der Beispiel-App wird nur eine APK-Datei erstellt, die Sie für lokale Tests verwenden können. Beim Ausführen der App werden jedoch keine Produkte und Preise abgerufen, da die Produkte noch nicht in der Play Console konfiguriert wurden. Das werden Sie im weiteren Verlauf dieses Codelabs tun.
  3. Generieren Sie ein signiertes Android App Bundle.
    1. Uploadschlüssel und ‑schlüsselspeicher generieren
    2. App mit dem Uploadschlüssel signieren
    3. Play App-Signatur konfigurieren

Als Nächstes müssen Sie das Android-App-Bundle in die Google Play Console hochladen.

3. Einmalkaufprodukt in der Play Console erstellen

Wenn Sie Einmalkaufprodukte in der Google Play Console erstellen möchten, benötigen Sie eine App in der Play Console. Erstellen Sie eine App in der Play Console und laden Sie dann das zuvor erstellte signierte App-Bundle hoch.

App erstellen

So erstellen Sie eine App:

  1. Melden Sie sich mit Ihrem Entwicklerkonto in der Google Play Console an.
  2. Klicken Sie auf App erstellen. Die Seite App erstellen wird geöffnet.
  3. Geben Sie einen App-Namen, die Standardsprache und andere app-bezogene Details ein.
  4. Klicken Sie auf App erstellen. Dadurch wird eine App in der Google Play Console erstellt.

Jetzt können Sie das signierte App-Bundle der Beispiel-App hochladen.

Signiertes App-Bundle hochladen

  1. Laden Sie das signierte App Bundle in den internen Test-Track der Google Play Console hoch. Erst nach dem Hochladen können Sie die Monetarisierungsfunktionen in der Play Console konfigurieren.
  2. Klicken Sie auf Testen und veröffentlichen > Testen > Interner Release > Neuen Release erstellen.
  3. Geben Sie einen Releasenamen ein und laden Sie die signierte App-Bundle-Datei hoch.
  4. Klicken Sie auf Weiter und dann auf Speichern und veröffentlichen.

Jetzt können Sie Ihre Einmalkaufprodukte erstellen.

Einmalkaufprodukt erstellen

So erstellen Sie ein Einmalkaufprodukt:

  1. Rufen Sie in der Google Play Console im linken Navigationsmenü Mit Google Play monetarisieren > Produkte > Einmalkaufprodukte auf.
  2. Klicken Sie auf Einmalkaufprodukt erstellen.
  3. Geben Sie die folgenden Produktdetails ein:
    • Produkt-ID:Geben Sie eine eindeutige Produkt-ID ein. Geben Sie one_time_product_01 ein.
    • (Optional) Tags:Fügen Sie relevante Tags hinzu.
    • Name:Geben Sie einen Produktnamen ein. Beispiel: Product name.
    • Beschreibung:Geben Sie eine Produktbeschreibung ein. Beispiel: Product description.
    • (Optional) Symbolbild hinzufügen:Laden Sie ein Symbol hoch, das Ihr Produkt repräsentiert.
    Hinweis: Für dieses Codelab können Sie die Konfiguration des Abschnitts Steuern, Compliance und Programme überspringen.
  4. Klicken Sie auf Weiter.
  5. Fügen Sie eine Kaufoption hinzu und konfigurieren Sie ihre regionale Verfügbarkeit. Für ein Einmalkaufprodukt ist mindestens eine Kaufoption erforderlich, in der festgelegt wird, wie die Berechtigung gewährt wird, sowie der Preis und die regionale Verfügbarkeit. In diesem Codelab fügen wir die Standardoption Kaufen für das Produkt hinzu.Geben Sie im Abschnitt Kaufoption die folgenden Details ein:
    • Kaufoptions-ID:Geben Sie eine Kaufoptions-ID ein. Beispiel: buy.
    • Kauftyp:Wählen Sie Kaufen aus.
    • (Optional) Tags:Fügen Sie Tags hinzu, die für diese Kaufoption spezifisch sind.
    • Optional: Klicken Sie auf Erweiterte Optionen, um die erweiterten Optionen zu konfigurieren. Für dieses Codelab können Sie die Konfiguration der erweiterten Optionen überspringen.
  6. Klicken Sie im Bereich Verfügbarkeit und Preisgestaltung auf Preise festlegen > Preise im Bulk-Verfahren bearbeiten.
  7. Wählen Sie die Option Land / Region aus. Damit werden alle Regionen ausgewählt.
  8. Klicken Sie auf Weiter. Dadurch wird ein Dialogfeld zum Eingeben eines Preises geöffnet. Geben Sie 10 $ ein und klicken Sie auf Übernehmen.
  9. Klicken Sie auf Speichern und dann auf Aktivieren. Dadurch wird die Kaufoption erstellt und aktiviert.

Erstellen Sie für dieses Codelab drei zusätzliche Einmalkaufprodukte mit den folgenden Produkt-IDs:

  • consumable_product_01
  • consumable_product_02
  • consumable_product_03

Die Beispiel-App ist für die Verwendung dieser Produkt-IDs konfiguriert. Sie können verschiedene Produkt-IDs angeben. In diesem Fall müssen Sie die Beispiel-App so ändern, dass die von Ihnen angegebene Produkt-ID verwendet wird.

Öffnen Sie die Beispiel-App in der Google Play Console und rufen Sie Mit Google Play monetarisieren > Produkte > Einmalkaufprodukte auf. Klicken Sie dann auf Einmalkaufprodukt erstellen und wiederholen Sie die Schritte 3 bis 9.

Video zur Erstellung von Einmalkaufprodukten

Das folgende Beispielvideo zeigt die zuvor beschriebenen Schritte zur einmaligen Produkterstellung.

4. In PBL einbinden

Als Nächstes sehen wir uns an, wie Sie Ihre App in die Play Billing Library (PBL) einbinden. In diesem Abschnitt werden die allgemeinen Schritte für die Integration beschrieben und für jeden Schritt wird ein Code-Snippet bereitgestellt. Sie können diese Snippets als Anleitung für die Implementierung Ihrer eigentlichen Integration verwenden.

So integrieren Sie Ihre App in PBL:

  1. Fügen Sie der Beispiel-App die Abhängigkeit der Play Billing Library hinzu.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Initialisieren Sie den BillingClient. BillingClient ist das Client-SDK, das sich in Ihrer App befindet und mit der Play Billing Library kommuniziert. Das folgende Code-Snippet zeigt, wie der Abrechnungsclient initialisiert wird.
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. Verbindung zu Google Play herstellen: Das folgende Code-Snippet zeigt, wie eine Verbindung zu Google Play hergestellt wird.
    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. Details zum Einmalkaufprodukt abrufen: Nachdem Sie Ihre App in PBL eingebunden haben, müssen Sie die Details zum Einmalkaufprodukt in Ihrer App abrufen. Das folgende Code-Snippet zeigt, wie Sie die Details zum Einmalkaufprodukt in Ihrer App abrufen.
    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);
          }
        });
    }
    
    Wenn Sie ProductDetails abrufen, erhalten Sie eine Antwort ähnlich der folgenden:
    {
        "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. Starten Sie den Abrechnungsvorgang.
    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. Käufe erkennen und verarbeiten In diesem Schritt müssen Sie Folgendes tun:
    1. Kauf bestätigen
    2. Dem Nutzer ein Recht gewähren
    3. Nutzer benachrichtigen
    4. Google über den Kaufvorgang informieren
    Die Schritte a, b und c sollten in Ihrem Backend ausgeführt werden und sind daher nicht Teil dieses Codelabs.Das folgende Snippet zeigt, wie Google über ein einmaliges Verbrauchsprodukt benachrichtigt wird:
    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. Kaufabbrüche analysieren

Bisher wurden im Codelab nur Play Billing-Antworten für begrenzte Szenarien wie USER_CANCELLED, BILLING_UNAVAILABLE, OK und ITEM_ALREADY_OWNED behandelt. Die Play-Abrechnung kann jedoch 13 verschiedene Antwortcodes zurückgeben, die durch verschiedene reale Faktoren ausgelöst werden können.

In diesem Abschnitt werden die Ursachen für die Fehlerantworten USER_CANCELLED und BILLING_UNAVAILABLE erläutert und mögliche Korrekturmaßnahmen vorgeschlagen, die Sie ergreifen können.

Antwortfehlercode „USER_CANCELED“

Dieser Antwortcode gibt an, dass der Nutzer die UI des Kaufvorgangs verlassen hat, bevor er den Kauf abgeschlossen hat.

Mögliche Ursachen

Welche Maßnahmen können Sie ergreifen?

  • Dies kann auf Nutzer mit geringer Kaufabsicht hindeuten, die preissensibel sind.
  • Der Kauf wird noch verarbeitet oder die Zahlung wurde abgelehnt.

Fehlercode für die Antwort „BILLING_UNAVAILABLE“

Dieser Antwortcode bedeutet, dass der Kauf aufgrund eines Problems mit dem Zahlungsanbieter des Nutzers oder der von ihm ausgewählten Zahlungsmethode nicht abgeschlossen werden konnte. Beispiel: Die Kreditkarte des Nutzers ist abgelaufen oder der Nutzer befindet sich in einem nicht unterstützten Land. Dieser Code weist nicht auf einen Fehler im Play-Abrechnungssystem hin.

Mögliche Ursachen

Welche Maßnahmen können Sie ergreifen?

  • Die Play Store App auf dem Gerät des Nutzers ist veraltet.
  • Der Nutzer befindet sich in einem Land, in dem Google Play nicht unterstützt wird.
  • Der Nutzer ist ein Unternehmensnutzer und sein Unternehmensadministrator hat Käufe durch Nutzer deaktiviert.
  • Die Zahlungsmethode des Nutzers kann nicht über Google Play belastet werden. Die Kreditkarte des Nutzers könnte beispielsweise abgelaufen sein.
  • Trends für Systemprobleme und in bestimmten Regionen beobachten
  • Erwägen Sie eine Migration zu PBL 8, da dort der detailliertere Unterantwortcode PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS unterstützt wird. Wenn Sie diesen Antwortcode erhalten, sollten Sie die Nutzer über den Fehler informieren oder alternative Zahlungsmethoden vorschlagen.
  • Dieser Antwortcode ist für Wiederholungen vorgesehen, sodass Sie geeignete Wiederholungsstrategien implementieren können.
    Automatische Wiederholungsversuche werden in diesem Fall wahrscheinlich nicht helfen. Ein manueller Wiederholungsversuch kann jedoch hilfreich sein, wenn der Nutzer das Problem behoben hat. Wenn der Nutzer beispielsweise seine Play Store-Version auf eine unterstützte Version aktualisiert, kann ein manueller Wiederholungsversuch des ursprünglichen Vorgangs funktionieren.

    Wenn Sie diesen Antwortcode erhalten, während der Nutzer nicht in der Sitzung ist, ist ein erneuter Versuch möglicherweise nicht sinnvoll. Wenn Sie als Ergebnis des Kaufvorgangs die Antwort `BILLING_UNAVAILABLE` erhalten, hat der Nutzer sehr wahrscheinlich während des Kaufvorgangs Feedback von Google Play erhalten und weiß möglicherweise, was schiefgelaufen ist. In diesem Fall können Sie eine Fehlermeldung anzeigen, in der darauf hingewiesen wird, dass ein Fehler aufgetreten ist, und eine Schaltfläche „Erneut versuchen“ anbieten, damit der Nutzer nach Behebung des Problems einen manuellen Wiederholungsversuch starten kann.

Wiederholungsstrategien für Antwortfehlercodes

Effektive Wiederholungsstrategien für behebbare Fehler aus der Play Billing Library (PBL) variieren je nach Kontext, z. B. Interaktionen mit Nutzern in der Sitzung (z. B. während eines Kaufs) im Vergleich zu Hintergrundvorgängen (z. B. Abfragen von Käufen beim Fortsetzen der App). Es ist wichtig, diese Strategien zu implementieren, da bestimmte BillingResponseCode-Werte auf vorübergehende Probleme hinweisen, die durch erneutes Versuchen behoben werden können, während andere dauerhaft sind und keine erneuten Versuche erfordern.

Bei Fehlern, die während der Sitzung des Nutzers auftreten, ist eine einfache Wiederholungsstrategie mit einer festgelegten maximalen Anzahl von Versuchen ratsam, um Beeinträchtigungen der Nutzerfreundlichkeit zu minimieren. Bei Hintergrundvorgängen wie dem Bestätigen neuer Käufe, die nicht sofort ausgeführt werden müssen, ist exponentieller Backoff die empfohlene Methode.

Ausführliche Informationen zu bestimmten Antwortcodes und den entsprechenden empfohlenen Wiederholungsstrategien finden Sie unter BillingResult-Antwortcodes verarbeiten.

6. Nächste Schritte

Referenzdokumente

7. Glückwunsch!

Glückwunsch! Sie haben erfolgreich ein neues Einmalkaufprodukt in der Google Play Console erstellt, Abrechnungsantwortcodes getestet und Kaufabbrüche analysiert.

Umfrage

Ihr Feedback zu diesem Codelab ist uns sehr wichtig. Nehmen Sie sich ein paar Minuten Zeit, um an unserer Umfrage teilzunehmen.