Abbrüche bei Produktkäufen in Google Play Billing analysieren

1. Einführung

In diesem Codelab erfahren Sie, wie Sie ein Einmalkaufprodukt erstellen, Ihre App in die Play Billing Library (PBL) einbinden und die Gründe für Kaufabbrüche analysieren.

Hinweis: Um dieses Codelab erfolgreich abzuschließen, benötigen Sie Zugriff auf die Funktion „Mehrere Kaufoptionen und Angebote für Einmalkaufprodukte“. Diese Funktion ist im Early-Access-Programm (EAP) verfügbar. Produkte und Funktionen im EAP stehen in der vorliegenden Form zur Verfügung und bieten möglicherweise nur eingeschränkten Support. Wenn Sie auf die EAP‑Funktionen zugreifen möchten, senden Sie bitte einen Antrag über das EAP-Antragsformular für Einmalkaufprodukte. Wenn Sie jedoch nur wissen möchten, wie Sie Kaufabbrüche mithilfe der Play Billing-Antwortcodes analysieren, gehen Sie direkt zum Abschnitt Kaufabbrüche analysieren in diesem Codelab.

Zielgruppe

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

Lerninhalte

  • Einmalkaufprodukte in der Google Play Console erstellen
  • App in PBL einbinden
  • Käufe von verbrauchbaren und nicht verbrauchbaren Einmalkaufprodukten in PBL verarbeiten
  • Kaufabbrüche analysieren

Voraussetzungen

2. Beispiel-App erstellen

Die Beispiel-App ist eine voll funktionsfähige Android-App mit dem vollständigen Quellcode, die folgende 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

Bevor Sie die Beispiel-App erstellen und bereitstellen, führen Sie 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. Erstellen Sie die Beispiel-App. Ändern Sie vor dem Erstellen den Paketnamen der Beispiel-App und erstellen Sie sie dann. Wenn Sie Pakete anderer Apps in Ihrer Play Console haben, muss der Paketname, den Sie für die Beispiel-App angeben, eindeutig sein.

    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 in der Play Console noch nicht 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. Google Play App-Signatur konfigurieren

Im nächsten Schritt laden Sie das Android App Bundle in die Google Play Console hoch.

3. Einmalkaufprodukt in der Play Console erstellen

Wenn Sie Einmalkaufprodukte in der Google Play Console erstellen möchten, muss eine App in der Play Console vorhanden sein. 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 Details zur App 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 > Test > Interner Release > Neuen Release erstellen.
  3. Geben Sie einen Release-Namen 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.
    • Textzeile:Geben Sie eine Produktbeschreibung ein. Beispiel: Product description.
    • (Optional) Symbolbild hinzufügen:Laden Sie ein Symbol hoch, das Ihr Produkt darstellt.
    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 die regionale Verfügbarkeit. Für ein Einmalkaufprodukt ist mindestens eine Kaufoption erforderlich, die definiert, wie die Berechtigung gewährt wird, sowie den Preis und die regionale Verfügbarkeit. Für dieses 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 Abschnitt Verfügbarkeit und Preisgestaltung auf Preise festlegen > Preise im Bulk-Verfahren bearbeiten.
  7. Wählen Sie die Option Land / Region aus. Dadurch werden alle Regionen ausgewählt.
  8. Klicken Sie auf Weiter. Ein Dialogfeld wird geöffnet, in dem Sie einen Preis eingeben können. Geben Sie 10 USD ein und klicken Sie dann 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 weitere 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 auch andere 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

Im folgenden Beispielvideo werden die Schritte zur Erstellung von Einmalkaufprodukten gezeigt, die zuvor beschrieben wurden.

4. In PBL einbinden

Jetzt 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 Einbindung beschrieben und für jeden Schritt ein Code-Snippet bereitgestellt. Sie können diese Snippets als Leitfaden für die Implementierung Ihrer tatsächlichen Einbindung verwenden.

So binden Sie Ihre App in PBL ein:

  1. Fügen Sie der Beispiel-App die Play Billing Library-Abhängigkeit hinzu.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Initialisieren Sie den BillingClient. Der BillingClient ist das Client-SDK, das sich in Ihrer App befindet und mit der Play Billing Library kommuniziert. Das folgende Code-Snippet zeigt, wie Sie den Abrechnungsclient initialisieren.
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. Stellen Sie eine Verbindung zu Google Play her.Das folgende Code-Snippet zeigt, wie Sie eine Verbindung zu Google Play herstellen.
    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. Rufen Sie die Details des Einmalkaufprodukts ab.Nachdem Sie Ihre App in PBL eingebunden haben, müssen Sie die Details des Einmalkaufprodukts in Ihre App abrufen. Das folgende Code-Snippet zeigt, wie Sie die Details des Einmalkaufprodukts 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. Dazu müssen Sie Folgendes tun:
    1. Kauf bestätigen
    2. Nutzer Berechtigung gewähren
    3. Nutzer benachrichtigen
    4. Google über den Kaufvorgang benachrichtigen
    Die Schritte a, b und c sollten in Ihrem Back-End ausgeführt werden und sind daher nicht Teil dieses Codelabs.Das folgende Snippet zeigt, wie Sie Google über ein verbrauchbares Einmalkaufprodukt benachrichtigen:
    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 konzentrierten sich die Play Billing-Antworten in diesem Codelab auf begrenzte Szenarien wie die Antworten USER_CANCELLED, BILLING_UNAVAILABLE, OK und ITEM_ALREADY_OWNED. Play Billing kann jedoch 13 verschiedene Antwortcodes zurückgeben, die durch verschiedene Faktoren in der realen Welt 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 implementieren können.

Antwortfehlercode USER_CANCELED

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

Mögliche Ursachen

Welche Maßnahmen können Sie ergreifen?

  • Kann auf Nutzer mit geringer Kaufabsicht hindeuten, die preissensibel sind.
  • Der Kauf steht noch aus oder die Zahlung wurde abgelehnt.

Antwortfehlercode BILLING_UNAVAILABLE

Dieser Antwortcode bedeutet, dass der Kauf aufgrund eines Problems mit dem Zahlungsdienstleister des Nutzers oder der gewählten Zahlungsart nicht abgeschlossen werden konnte. Beispielsweise ist die Kreditkarte des Nutzers abgelaufen oder der Nutzer befindet sich in einem nicht unterstützten Land. Dieser Code weist nicht auf einen Fehler im Play-Abrechnungssystem selbst hin.

Mögliche Ursachen

Welche Maßnahmen können Sie ergreifen?

  • Die Google 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 der Unternehmensadministrator hat Käufe für Nutzer deaktiviert.
  • Google Play kann die Zahlungsmethode des Nutzers nicht belasten. Beispielsweise ist die Kreditkarte des Nutzers möglicherweise abgelaufen.
  • Trends für Systemprobleme und in bestimmten Regionen beobachten
  • Migrieren Sie zu PBL 8, da es den detaillierteren PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS Unterantwortcode unterstützt. Wenn Sie diesen Antwortcode erhalten, benachrichtigen Sie die Nutzer über den Fehler oder schlagen Sie alternative Zahlungsmethoden vor.
  • Dieser Antwortcode ist für Wiederholungen vorgesehen, sodass Sie geeignete Wiederholungsstrategien implementieren können.
    Automatische Wiederholungen sind in diesem Fall wahrscheinlich nicht hilfreich. Eine manuelle Wiederholung kann jedoch helfen, wenn der Nutzer die Bedingung behebt, die das Problem verursacht hat. Wenn der Nutzer beispielsweise seine Google Play Store-Version auf eine unterstützte Version aktualisiert, kann eine manuelle Wiederholung des ursprünglichen Vorgangs funktionieren.

    Wenn Sie diesen Antwortcode erhalten, wenn der Nutzer nicht in einer Sitzung ist, ist eine Wiederholung möglicherweise nicht sinnvoll. Wenn Sie als Ergebnis des Kaufvorgangs eine `BILLING_UNAVAILABLE`-Antwort 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 angegeben wird, dass ein Fehler aufgetreten ist, und eine Schaltfläche `Erneut versuchen` anbieten, damit der Nutzer nach Behebung des Problems eine manuelle Wiederholung durchführen kann.

Wiederholungsstrategien für Antwortfehlercodes

Effektive Wiederholungsstrategien für behebbare Fehler aus der Play Billing Library (PBL) variieren je nach Kontext, z. B. Interaktionen in der Sitzung (wie bei einem Kauf) 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 vorübergehende Probleme signalisieren, die durch Wiederholungen behoben werden können, während andere dauerhaft sind und keine Wiederholungen erfordern.

Bei Fehlern, die auftreten, wenn der Nutzer in einer Sitzung ist, ist eine einfache Wiederholungsstrategie mit einer festgelegten maximalen Anzahl von Versuchen ratsam, um die Unterbrechung der Nutzererfahrung zu minimieren. Bei Hintergrundvorgängen wie dem Bestätigen neuer Käufe, die keine sofortige Ausführung erfordern, ist exponentieller Backoff der empfohlene Ansatz.

Detaillierte Informationen zu bestimmten Antwortcodes und den entsprechenden empfohlenen Wiederholungsstrategien finden Sie unter Antwortcodes von BillingResult verarbeiten.

6. Nächste Schritte

Referenzdokumente

7. Glückwunsch!

Glückwunsch! Sie haben erfolgreich die Google Play Console verwendet, um ein neues Einmalkaufprodukt zu erstellen, Abrechnungsantwortcodes zu testen und Kaufabbrüche zu analysieren.

Umfrage

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