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
- Zugriff auf die Google Play Console mit einem Entwicklerkonto. Wenn Sie noch kein Entwicklerkonto haben, müssen Sie eines erstellen.
- Eine Beispiel-App für dieses Codelab, die Sie von GitHub herunterladen können.
- Android Studio
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:
- Erstellen Sie ein Google Play Console-Entwicklerkonto. Wenn Sie bereits ein Entwicklerkonto haben, überspringen Sie diesen Schritt.
- Erstellen Sie eine neue App in der Play Console. Beim Erstellen einer App können Sie einen beliebigen App-Namen für die Beispiel-App angeben.
- Installiere Android Studio.
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:
- Laden Sie die Beispiel-App von GitHub herunter.
- 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. - Generieren Sie ein signiertes Android App Bundle.
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:
- Melden Sie sich mit Ihrem Entwicklerkonto in der Google Play Console an.
- Klicken Sie auf App erstellen. Die Seite App erstellen wird geöffnet.
- Geben Sie einen App-Namen, die Standardsprache und andere app-bezogene Details ein.
- 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
- 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.
- Klicken Sie auf Testen und veröffentlichen > Testen > Interner Release > Neuen Release erstellen.
- Geben Sie einen Releasenamen ein und laden Sie die signierte App-Bundle-Datei hoch.
- 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:
- Rufen Sie in der Google Play Console im linken Navigationsmenü Mit Google Play monetarisieren > Produkte > Einmalkaufprodukte auf.
- Klicken Sie auf Einmalkaufprodukt erstellen.
- 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.
- Produkt-ID:Geben Sie eine eindeutige Produkt-ID ein. Geben Sie
- Klicken Sie auf Weiter.
- 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.
- Kaufoptions-ID:Geben Sie eine Kaufoptions-ID ein. Beispiel:
- Klicken Sie im Bereich Verfügbarkeit und Preisgestaltung auf Preise festlegen > Preise im Bulk-Verfahren bearbeiten.
- Wählen Sie die Option Land / Region aus. Damit werden alle Regionen ausgewählt.
- Klicken Sie auf Weiter. Dadurch wird ein Dialogfeld zum Eingeben eines Preises geöffnet. Geben Sie 10 $ ein und klicken Sie auf Übernehmen.
- 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:
- 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") }
- 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(); }
- 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."); } }); }
- 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.
Wenn Sieprivate 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
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": [] } ] }
- 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); }
- Käufe erkennen und verarbeiten In diesem Schritt müssen Sie Folgendes tun:
- Kauf bestätigen
- Dem Nutzer ein Recht gewähren
- Nutzer benachrichtigen
- Google über den Kaufvorgang informieren
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? |
|
|
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? |
|
|
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
- Weitere Informationen
- Denken Sie daran, die Best Practices für die Bestätigung und Verarbeitung von Käufen in Ihrem sicheren Backend zu befolgen, sobald Nutzer diese Produkte kaufen.
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.