Google Play Billing Library in deine App integrieren

In diesem Thema wird beschrieben, wie du die Google Play Billing Library in um mit dem Verkauf von Produkten zu beginnen.

Laufzeit eines Kaufs

Hier sehen Sie einen typischen Kaufvorgang für einen einmaligen Kauf oder ein Abonnement.

  1. Zeigen Sie den Nutzern, was sie kaufen können.
  2. Starte den Kaufvorgang, damit der Nutzer den Kauf akzeptieren kann.
  3. Bestätige den Kauf auf deinem Server.
  4. Stellen Sie dem Nutzer Inhalte zur Verfügung.
  5. Die Übermittlung der Inhalte bestätigen. Verbrauchsprodukte: Verbrauche die damit der Nutzer den Artikel erneut kaufen kann.

Abos werden so lange automatisch verlängert, bis sie gekündigt werden. Ein Abo kann über die folgenden Bundesstaaten:

  • Aktiv:Der Nutzer ist in einwandfreiem Zustand und hat Zugriff auf das Abo.
  • Abgebrochen:Der Nutzer hat die Mitgliedschaft beendet, hat aber noch bis zum Ablauf Zugriff.
  • Im Kulanzzeitraum:Der Nutzer hat ein Zahlungsproblem, hat aber weiterhin Zugriff während Google die Zahlungsmethode noch einmal versucht.
  • Ausgesetzt: Der Nutzer hat ein Zahlungsproblem und hat während des folgenden Zeitraums keinen Zugriff mehr: Google versucht noch einmal, die Zahlungsmethode zu verwenden.
  • Pausiert:Der Nutzer hat seinen Zugriff pausiert und hat keinen Zugriff, bis er Fortsetzen.
  • Abgelaufen:Der Nutzer hat das Abo gekündigt und kann nicht mehr darauf zugreifen. Die Nutzer nach Ablauf der Frist als abgewandert angesehen wird.

Verbindung mit Google Play initialisieren

Der erste Schritt zur Integration in das Abrechnungssystem von Google Play besteht darin, Google Play Billing Library zu deiner App hinzu und stelle eine Verbindung her.

Google Play Billing Library-Abhängigkeit hinzufügen

Füge der build.gradle deiner App die Google Play Billing Library-Abhängigkeit hinzu wie hier gezeigt:

Groovy

dependencies {
    def billing_version = "7.1.1"

    implementation "com.android.billingclient:billing:$billing_version"
}

Kotlin

dependencies {
    val billing_version = "7.1.1"

    implementation("com.android.billingclient:billing:$billing_version")
}

Wenn du Kotlin verwendest, enthält das KTX-Modul der Google Play Billing Library Unterstützung von Kotlin-Erweiterungen und -Koroutinen, mit denen Sie idiomatische Texte schreiben können Kotlin bei Verwendung der Google Play Billing Library Um diese hinzuzufügen in Ihrem Projekt verwenden, fügen Sie die folgende Abhängigkeit zur build.gradle-Datei wie gezeigt:

Groovy

dependencies {
    def billing_version = "7.1.1"

    implementation "com.android.billingclient:billing-ktx:$billing_version"
}

Kotlin

dependencies {
    val billing_version = "7.1.1"

    implementation("com.android.billingclient:billing-ktx:$billing_version")
}

BillingClient initialisieren

Nachdem du eine Abhängigkeit von der Google Play Billing Library hinzugefügt hast, musst du zum Initialisieren einer BillingClient-Instanz. BillingClient ist die Hauptnummer Schnittstelle für die Kommunikation zwischen der Google Play Billing Library und dem Ihrer App zu optimieren. BillingClient bietet praktische Methoden, beide synchron. und asynchron, für viele gängige Abrechnungsvorgänge. Es wird dringend empfohlen, ob eine BillingClient-Verbindung gleichzeitig aktiv ist, Vermeiden mehrfacher PurchasesUpdatedListener-Callbacks für ein einzelnes Ereignis

Verwenden Sie newBuilder(), um ein BillingClient zu erstellen. Sie können jeden Kontext an newBuilder() und BillingClient verwendet sie, um einen Anwendungskontext abzurufen. Das bedeutet, dass Sie sich keine Gedanken über Speicherlecks machen müssen. So erhalten Sie Updates zu Käufe tätigen möchten, müssen Sie auch setListener() aufrufen und eine Referenz zu einem PurchasesUpdatedListener Dieser Listener erhält Updates für alle für Käufe in deiner App.

Kotlin

private val purchasesUpdatedListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.
   }

private var billingClient = BillingClient.newBuilder(context)
   .setListener(purchasesUpdatedListener)
   // Configure other settings.
   .build()

Java

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    // Configure other settings.
    .build();

Mit Google Play verbinden

Nachdem Sie ein BillingClient erstellt haben, müssen Sie eine Verbindung mit herstellen. Google Play

Rufen Sie startConnection() auf, um eine Verbindung zu Google Play herzustellen. Die Verbindung asynchron ist und Sie eine BillingClientStateListener, um einen Rückruf zu erhalten, sobald die Einrichtung des ist abgeschlossen und es ist bereit, weitere Anfragen zu stellen.

Sie müssen außerdem eine Wiederholungslogik implementieren, um unterbrochene Verbindungen zu Google Play zu verarbeiten. Um eine Wiederholungslogik zu implementieren, überschreiben Sie den onBillingServiceDisconnected() und achten Sie darauf, dass BillingClient die Methode startConnection(), um die Verbindung zu Google Play vor dem weitere Anträge.

Das folgende Beispiel zeigt, wie Sie eine Verbindung starten und testen, ob sie einsatzbereit:

Kotlin

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    override fun onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
})

Java

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});

Zum Kauf verfügbare Produkte anzeigen

Nachdem Sie eine Verbindung zu Google Play hergestellt haben, können Sie für Ihre verfügbaren Produkte und präsentieren Sie sie Ihren Nutzern.

Das Abfragen von Produktdetails ist ein wichtiger Schritt, bevor Ihre die Produkte an Ihre Nutzer, da es lokalisierte Produktinformationen zurückgibt. Für achten Sie darauf, dass die Produktpräsentation allen Google Play-Richtlinien entspricht.

Rufen Sie queryProductDetailsAsync() auf, um Details zu In-App-Produkten abzufragen.

Um das Ergebnis des asynchronen Vorgangs zu verarbeiten, müssen Sie auch eine Listener, der die ProductDetailsResponseListener-Schnittstelle implementiert. Sie können dann onProductDetailsResponse() überschreiben, wodurch der Listener, wenn die Abfrage abgeschlossen ist, wie im folgenden Beispiel gezeigt:

Kotlin

val queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build()

billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
    billingResult,
    productDetailsList ->
      // check billingResult
      // process returned productDetailsList
}

Java

QueryProductDetailsParams queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build();

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
        public void onProductDetailsResponse(BillingResult billingResult,
                List<ProductDetails> productDetailsList) {
            // check billingResult
            // process returned productDetailsList
        }
    }
)

Übergeben Sie bei der Abfrage von Produktdetails eine Instanz von QueryProductDetailsParams, das eine Liste von Produkt-ID-Strings angibt die in der Google Play Console erstellt wurden, zusammen mit einer ProductType. Die ProductType kann entweder ProductType.INAPP für Einmalkaufprodukte oder ProductType.SUBS für Abos.

Abfragen mit Kotlin-Erweiterungen ausführen

Wenn Sie Kotlin-Erweiterungen verwenden, können Sie In-App-Produkte abfragen. durch Aufrufen der Erweiterungsfunktion queryProductDetails().

queryProductDetails() nutzt Kotlin-Koroutinen, sodass Sie sich separaten Listener. Stattdessen wird die Funktion angehalten, bis die Abfrage abgeschlossen ist. Anschließend können Sie das Ergebnis verarbeiten:

suspend fun processPurchases() {
    val productList = listOf(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId("product_id_example")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )
    val params = QueryProductDetailsParams.newBuilder()
    params.setProductList(productList)

    // leverage queryProductDetails Kotlin extension function
    val productDetailsResult = withContext(Dispatchers.IO) {
        billingClient.queryProductDetails(params.build())
    }

    // Process the result.
}

In seltenen Fällen können ProductDetails und einige Geräte nicht unterstützt werden queryProductDetailsAsync(), in der Regel aufgrund veralteter Versionen von Google Play Dienste. Um eine angemessene Unterstützung für dieses Szenario sicherzustellen, sollten Sie sich mit der Verwendung von Abwärtskompatibilitätsfunktionen bei der Migration der Play Billing Library 5 .

Ergebnis verarbeiten

Die Google Play Billing Library speichert die Abfrageergebnisse in einem List von ProductDetails-Objekte. Sie können dann auf jedem Gerät eine Vielzahl von Methoden ProductDetails-Objekt in der Liste, um relevante Informationen zu einer In-App aufzurufen Produkt, wie Preis oder Beschreibung. So rufen Sie die verfügbaren Produktdetails auf: Weitere Informationen finden Sie in der Liste der Methoden in der Klasse ProductDetails.

Bevor du einen Artikel zum Verkauf anbietest, vergewissere dich, dass der Nutzer nicht bereits der Eigentümer des Artikels ist. ein. Wenn Nutzende ein Verbrauchsmaterial haben, das sich noch in ihrer Artikelbibliothek befindet, den Artikel aufbrauchen, bevor er ihn noch einmal kaufen kann.

Bevor Sie ein Abo anbieten, prüfen Sie, ob der Nutzer noch kein Abo hat. Beachten Sie außerdem Folgendes:

  • queryProductDetailsAsync() gibt Details zum Aboprodukt und einen maximal 50 Angebote pro Abo.
  • queryProductDetailsAsync() gibt nur Angebote zurück, für die der Nutzer aktiv sind. Wenn der Nutzer versucht, ein Angebot zu kaufen, nicht zulässig (z. B. wenn in der App eine veraltete Liste berechtigte Angebote), wird der Nutzer von Google Play darüber informiert, Nutzer können sich stattdessen für das Basis-Abo entscheiden.

Kaufvorgang starten

Rufe zum Starten einer Kaufanfrage über deine App die launchBillingFlow() auf. aus dem Hauptthread Ihrer App aus. Bei dieser Methode wird auf eine BillingFlowParams-Objekt, das die relevanten ProductDetails-Objekt, das durch den Aufruf von queryProductDetailsAsync() Verwenden Sie zum Erstellen eines BillingFlowParams-Objekts die Klasse BillingFlowParams.Builder.

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
        .setProductDetails(productDetails)
        // For One-time product, "setOfferToken" method shouldn't be called.
        // For subscriptions, to get an offer token, call ProductDetails.subscriptionOfferDetails()
        // for a list of offers that are available to the user
        .setOfferToken(selectedOfferToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // For one-time products, "setOfferToken" method shouldn't be called.
            // For subscriptions, to get an offer token, call
            // ProductDetails.subscriptionOfferDetails() for a list of offers
            // that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Die Methode launchBillingFlow() gibt einen von mehreren Antwortcodes zurück, die in BillingClient.BillingResponseCode Dieses Ergebnis sollten Sie prüfen, um sicherzustellen, dass beim Starten des Kaufvorgangs keine Fehler aufgetreten sind. Ein BillingResponseCode von OK steht für einen erfolgreichen Start.

Bei einem erfolgreichen Aufruf von launchBillingFlow() zeigt das System die Google Play-Kaufbildschirm. Abbildung 1 zeigt einen Kaufbildschirm für ein Abo:

<ph type="x-smartling-placeholder">
</ph> wird auf dem Google Play-Kaufbildschirm ein Abonnement angezeigt,
            zum Kauf verfügbar
Abbildung 1: Auf dem Kaufbildschirm von Google Play wird eine das zum Kauf verfügbar ist.

Google Play ruft onPurchasesUpdated() auf, um das Ergebnis des Kaufs zu übermitteln. -Vorgang an einen Listener, der PurchasesUpdatedListener implementiert, . Der Listener wird mit der Methode setListener() angegeben, wenn Sie Ihren Client initialisiert.

Sie müssen onPurchasesUpdated() implementieren, um mögliche Antwortcodes zu verarbeiten. Die Das folgende Beispiel zeigt, wie onPurchasesUpdated() überschrieben wird:

Kotlin

override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
   if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
       for (purchase in purchases) {
           handlePurchase(purchase)
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user cancelling the purchase flow.
   } else {
       // Handle any other error codes.
   }
}

Java

@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

Bei einem erfolgreichen Kauf wird bei Google Play ein Bildschirm mit einer Kaufbestätigung angezeigt, ähnlich wie bei Abbildung 2.

<ph type="x-smartling-placeholder">
</ph> Bildschirm für erfolgreiche Käufe bei Google Play
Abbildung 2: Erfolgreicher Kauf bei Google Play Bildschirm.

Bei einem erfolgreichen Kauf wird auch ein Kauftoken generiert, Kennung für den Nutzer und die Produkt-ID für das In-App-Produkt die sie gekauft haben. Ihre Apps können das Kauftoken lokal speichern, empfehlen wir, das Token an Ihren sicheren Backend-Server zu übergeben. um den Kauf zu überprüfen und vor Betrug zu schützen. Dieser Vorgang wird näher beschrieben, erhalten Sie im folgenden Abschnitt.

Der Nutzer erhält außerdem per E-Mail einen Transaktionsbeleg mit einer Bestell-ID oder Eine eindeutige ID der Transaktion. Nutzer erhalten eine E-Mail mit einer eindeutigen Bestell-ID für jeden einmaligen Produktkauf und auch für das erstmalige Abonnement. und nachfolgende wiederkehrende automatische Verlängerungen. Sie können die Bestell-ID um Erstattungen in der Google Play Console zu verwalten.

Personalisierten Preis angeben

Wenn deine App für Nutzer in der Europäischen Union vertrieben werden kann, verwende die setIsOfferPersonalized()-Methode, um Nutzern mitzuteilen, dass der Preis eines Artikels durch automatisierte Entscheidungsfindung personalisiert.

<ph type="x-smartling-placeholder">
</ph> Der Google Play-Kaufbildschirm, auf dem angezeigt wird, dass der Preis an den Nutzer angepasst wurde
Abbildung 3: Auf dem Google Play-Kaufbildschirm wird angezeigt, dass der Preis an den Nutzer angepasst wurde.

Wenden Sie sich an Art. 6 (1) (ea) CRD der Verbraucherrechterichtlinie 2011/83/EU, um festzustellen, ob der Preis, den Sie Nutzern anbieten, personalisiert.

Für setIsOfferPersonalized() ist eine boolesche Eingabe erforderlich. Wenn true, wird die Google Play-Benutzeroberfläche die Offenlegung. Bei false wird die Offenlegung in der Benutzeroberfläche weggelassen. Standardeinstellung Wert ist false.

Weitere Informationen finden Sie in der Hilfe.

Käufe werden verarbeitet

Sobald ein Nutzer einen Kauf abgeschlossen hat, muss Ihre App diesen Kauf verarbeiten. In den meisten Fällen wird Ihre App über Ihre PurchasesUpdatedListener Es gibt jedoch Fälle, in denen Ihre App wurde unter BillingClient.queryPurchasesAsync() auf Käufe aufmerksam enthalten, wie unter Käufe abrufen beschrieben.

Wenn Sie einen Client für Entwicklerbenachrichtigungen in Echtzeit in in Ihrem sicheren Backend nutzen, können Sie neue Käufe registrieren, indem Sie eine subscriptionNotification oder oneTimeProductNotification, bei denen Sie benachrichtigt werden: neuen Kauf. Rufen Sie nach Erhalt dieser Benachrichtigungen Developer API, um den vollständigen Status abzurufen und Ihren eigenen Backend-Status zu aktualisieren.

So sollte ein Kauf in Ihrer App verarbeitet werden:

  1. Bestätigen Sie den Kauf.
  2. Übermitteln Sie Inhalte an den Nutzer und bestätigen Sie die Übermittlung der Inhalte. Optional können Sie den Artikel als verbraucht markieren, damit Nutzer ihn kaufen können. noch einmal.

Um einen Kauf zu bestätigen, überprüfen Sie zuerst, ob der Kaufstatus lautet. PURCHASED Wenn der Kaufbetrag PENDING beträgt, sollten Sie den wie unter Umgang mit ausstehenden Transaktionen beschrieben. Für Käufe von onPurchasesUpdated() oder queryPurchasesAsync() erhalten haben, sollten Sie den Kauf noch einmal überprüfen, um die Rechtmäßigkeit sicherzustellen, bevor Ihre App Berechtigung. Informationen zur ordnungsgemäßen Bestätigung eines Kaufs finden Sie unter Käufe bestätigen bevor du Berechtigungen erteilst.

Sobald du den Kauf bestätigt hast, kann über deine App eine Berechtigung für das Nutzer. Das mit dem Kauf verknüpfte Nutzerkonto kann anhand des ProductPurchase.obfuscatedExternalAccountId zurückgegeben von Purchases.products:get für In-App-Produktkäufe und die SubscriptionPurchase.obfuscatedExternalAccountId zurückgegeben von Purchases.subscriptions:get für serverseitige Abos oder die obfuscatedAccountId von Purchase.getAccountIdentifiers() auf der Clientseite, wenn ein Wert mit setObfuscatedAccountId festgelegt wurde, wenn der etwas gekauft wurde.

Nachdem die Berechtigung gewährt wurde, muss der Kauf in Ihrer App bestätigt werden. Dieses damit Google Play darüber informiert, dass du die Berechtigung gewährt hast. für den Kauf.

Wie die Berechtigung gewährt und der Kauf bestätigt wird, hängt davon ab, der Kauf ein kurzfristig nutzbares, nicht konsumierbares oder ein Abo ist.

Verbrauchsgüter

Wenn Ihre App über ein sicheres Back-End verfügt, empfehlen wir die Verwendung von Purchases.products:consume, um Käufe zuverlässig zu tätigen. Achten Sie darauf, dass die Kauf wurde nicht bereits verbraucht, indem die consumptionState von das Ergebnis des Aufrufs von Purchases.products:get. Wenn Ihre App nur für den Client bestimmt ist ohne Back-End verwenden, verwenden Sie consumeAsync() aus dem Google Play Billing Library. Beide Methoden erfüllen die Bestätigung Anforderung an und geben Sie an, dass dem Nutzer durch Ihre App die Berechtigung gewährt wurde. Mit diesen Methoden kann Ihre App auch das Einmalkaufprodukt für das eingegebene Kauftoken, das noch einmal gekauft werden kann. Mit consumeAsync() von mir muss außerdem ein Objekt übergeben, das die ConsumeResponseListener implementiert. . Dieses Objekt verarbeitet das Ergebnis des Verbrauchsvorgangs. Sie können die Methode onConsumeResponse() überschreiben, Die Google Play Billing Library wird aufgerufen, wenn der Vorgang abgeschlossen ist.

Das folgende Beispiel zeigt, wie ein Produkt mit der Google Play Billing Library mit dem verknüpften Kauftoken:

Kotlin

suspend fun handlePurchase(purchase: Purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    val purchase : Purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build()
    val consumeResult = withContext(Dispatchers.IO) {
        client.consumePurchase(consumeParams)
    }
}

Java

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    ConsumeParams consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

Nicht konsumierbare Produkte

Wenn deine App ein sicheres Backend hat, empfehlen, Purchases.products:acknowledge zu verwenden, um Käufe. Vergewissern Sie sich, dass der Kauf noch nicht durch Prüfen des acknowledgementState aus dem Ergebnis des Aufrufs Purchases.products:get

Wenn Ihre App nur Client ist, verwenden Sie BillingClient.acknowledgePurchase() von die Google Play Billing Library in deiner App. Vor der Bestätigung sollte Ihre App überprüfen, ob der Kauf bereits bestätigt wurde, indem Sie die isAcknowledged()-Methode in der Google Play Billing Library.

Das folgende Beispiel zeigt, wie Sie einen Kauf mit dem Google Play Billing Library:

Kotlin

val client: BillingClient = ...
val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ...

suspend fun handlePurchase() {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.purchaseToken)
            val ackPurchaseResult = withContext(Dispatchers.IO) {
               client.acknowledgePurchase(acknowledgePurchaseParams.build())
            }
        }
     }
}

Java

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

Abos

Abonnements werden ähnlich gehandhabt wie andere Abonnements. Verwenden Sie nach Möglichkeit Purchases.subscriptions.acknowledge von Google Play Developer API, um den Kauf bei Ihrem sicheres Back-End. Vergewissern Sie sich, dass der Kauf noch nicht durch Prüfen Sie die acknowledgementState in der Ressource „purchase“ von Purchases.subscriptions:get Andernfalls können Sie mit BillingClient.acknowledgePurchase() aus dem Google Play Billing Library nach Prüfung von isAcknowledged(). Alle erste Abokäufe müssen bestätigt werden. Aboverlängerungen müssen nicht anerkannt werden. Weitere Informationen dazu, wann Abos bestätigt werden müssen, findest du weitere Informationen im Thema Abos verkaufen.

Käufe werden abgerufen

Das Anhören von Updates zu Käufen mit einem PurchasesUpdatedListener ist nicht Ihre App muss alle Käufe verarbeiten. Es ist möglich, dass Ihre App möglicherweise nicht alle Einkäufe eines Nutzers erkennt. Hier sind einige Szenarien, in denen Ihre App den Überblick verlieren oder Käufe nicht erkennen könnte:

  • Netzwerkprobleme während des Kaufs: Ein Nutzer tätigt einen erfolgreichen Kauf. und erhält eine Bestätigung von Google, aber ihr Gerät verliert die Netzwerkverbindung. Verbindung herstellen, bevor das Gerät eine Benachrichtigung über den Kauf erhält über PurchasesUpdatedListener.
  • Mehrere Geräte: Ein Nutzer kauft einen Artikel auf einem Gerät und erwartet dann, den Artikel sehen, wenn er das Gerät wechselt.
  • Umgang mit Käufen außerhalb Ihrer App: Einige Käufe wie können Sie außerhalb Ihrer App einlösen.

Um diesen Situationen zu begegnen, muss Ihre App BillingClient.queryPurchasesAsync() in der onResume()-Methode, um sicherzustellen, dass alle Käufe erfolgreich verarbeitet werden, wie in der Käufe.

Das folgende Beispiel zeigt, wie Abokäufe eines Nutzers abgerufen werden. Beachten Sie, dass queryPurchasesAsync() nur aktive Abos und nicht konsumierte einmalige Käufe.

Kotlin

val params = QueryPurchasesParams.newBuilder()
               .setProductType(ProductType.SUBS)

// uses queryPurchasesAsync Kotlin extension function
val purchasesResult = billingClient.queryPurchasesAsync(params.build())

// check purchasesResult.billingResult
// process returned purchasesResult.purchasesList, e.g. display the plans user owns

Java

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder()
      .setProductType(ProductType.SUBS)
      .build(),
    new PurchasesResponseListener() {
      public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) {
        // check billingResult
        // process returned purchase list, e.g. display the plans user owns

      }
    }
);

Außerhalb der App getätigte Käufe verarbeiten

Einige Käufe, z. B. das Einlösen von Angeboten, können außerhalb Ihrer App erfolgen. Wenn ein Nutzer etwas außerhalb Ihrer App kauft, erwartet er, dass Ihre App angezeigt wird eine In-App-Nachricht versenden oder eine Art Benachrichtigungsmechanismus verwenden, dass die App den Kauf ordnungsgemäß erhalten und verarbeitet hat. Zulässig Mechanismen sind:

  • Ein In-App-Pop-up anzeigen.
  • Übermitteln Sie die Nachricht in ein Nachrichtenfeld in der App und geben Sie dabei klar an, ist eine neue Nachricht im In-App-Nachrichtenfeld.
  • Verwenden Sie eine Benachrichtigung des Betriebssystems.

Beachten Sie, dass Ihre App sich in einem beliebigen Status befinden kann, wenn Ihre App den Kauf erkennt. Es ist sogar möglich, dass eure App die beim Kauf installiert wurde. Nutzer erwarten, dass sie ihren Kauf erhalten wenn sie die App fortsetzen, unabhängig von ihrem aktuellen Status.

Sie müssen Käufe unabhängig vom Status der App erkennen, wenn der etwas gekauft wurde. Es gibt jedoch einige Ausnahmen, in denen dies akzeptabel ist. um den Nutzer nicht sofort über den Erhalt des Artikels zu informieren. Beispiel:

  • Im Actionteil eines Spiels, bei dem eine Nachricht den Nutzer ablenken könnte Nutzer. In diesem Fall müssen Sie die Nutzenden benachrichtigen, nachdem die Aktion abgeschlossen ist.
  • In Zwischensequenzen, in denen eine Nachricht den Nutzer ablenken könnte In dieser müssen Sie den Nutzer nach dem Ende der Zwischensequenz benachrichtigen.
  • Während der ersten Anleitung und der Nutzereinrichtung im Spiel Wir empfehlen, Benachrichtigen Sie neue Nutzer sofort nach dem Start des Spiels über die Prämie oder bei der Ersteinrichtung durch den Nutzer. Es ist jedoch akzeptabel, zu warten, bis der Haupt- Spielsequenz verfügbar ist, um den Nutzer zu benachrichtigen.

Behalten Sie immer die Nutzenden im Blick, wenn Sie entscheiden, wann und wie Sie Ihre Nutzenden über außerhalb deiner App getätigte Käufe. Jedes Mal, wenn ein Nutzer nicht sofort Benachrichtigung erhalten, ist er möglicherweise verwirrt und verwendet Ihre App nicht mehr, oder sich in den sozialen Medien darüber beschweren. Hinweis: PurchasesUpdatedListener ist in deiner Anwendung registriert Kontext zur Verarbeitung von Kaufaktualisierungen, einschließlich außerhalb von getätigten Käufen Ihrer App. Das bedeutet, wenn Ihr Bewerbungsprozess nicht existiert, PurchasesUpdatedListener wird nicht benachrichtigt. Deshalb sollte Ihre App BillingClient.queryPurchasesAsync() in der Methode onResume() aufrufen als wie unter Käufe abrufen erwähnt.

Ausstehende Transaktionen verarbeiten

Google Play unterstützt ausstehende Transaktionen oder Transaktionen, für die eine oder mehr zusätzliche Schritte zwischen dem Kaufabschluss und der Zahlungsmethode für den Kauf verarbeitet wurde. Ihre App sollte keine auf diese Art von Käufen angerechnet, bis Google Sie darüber informiert, Die Zahlungsmethode des Nutzers wurde belastet.

Beispielsweise kann ein Nutzer eine Transaktion initiieren, indem er ein Ladengeschäft auswählt. wo sie später bar bezahlen. Der Nutzer erhält einen Code über Benachrichtigung und E-Mail. Wenn die Nutzenden im Geschäft ankommen, können Sie den Code an der Kasse einlösen und bar bezahlen. Google benachrichtigt Sie dann sowohl für Sie als auch für den Nutzer die Zahlung eingegangen ist. Ihre App kann dann Berechtigung für den Nutzer.

Rufen Sie enablePendingPurchases() im Rahmen der Initialisierung des BillingClient, um ausstehende Transaktionen für deine App zu aktivieren. Ihre App muss ausstehende Transaktionen für Einmalkaufprodukte zu aktivieren und zu unterstützen. Vorher Support hinzufügen, sollten Sie sich mit dem Kaufvorgang für ausstehende Transaktionen.

Wenn deine App einen neuen Kauf erhält, entweder über deine PurchasesUpdatedListener oder als Folge eines Anrufs queryPurchasesAsync() verwenden Sie die Methode getPurchaseState(), um Ermittle, ob der Kaufstatus PURCHASED oder PENDING ist. Sie sollten Berechtigung nur gewähren, wenn der Status PURCHASED lautet.

Wenn Ihre App ausgeführt wird, nachdem der Nutzer den Kauf abgeschlossen hat, PurchasesUpdatedListener wird noch einmal angerufen und die PurchaseState ist jetzt PURCHASED Jetzt kann der Kauf in deiner App mit der standardmäßigen Methode zur Verarbeitung von Käufen. Ihre App sollte außerdem queryPurchasesAsync() in der onResume()-Methode deiner App, um Käufe abzuwickeln die in den Status PURCHASED gewechselt sind, während deine App nicht ausgeführt wurde.

Wenn der Kauf von PENDING auf PURCHASED, Ihr Client für Entwicklerbenachrichtigungen in Echtzeit erhält eine ONE_TIME_PRODUCT_PURCHASED oder SUBSCRIPTION_PURCHASED-Benachrichtigung. Im Falle einer Stornierung erhält ein ONE_TIME_PRODUCT_CANCELED oder SUBSCRIPTION_PENDING_PURCHASE_CANCELED Benachrichtigung. Das kann passieren, dass der Kunde die Zahlung nicht im erforderlichen Zeitraum durchführt. Beachten Sie, dass Sie können Sie jederzeit mithilfe der Google Play Developer API den aktuellen Status kaufen.

Käufe mit variabler Stückzahl abwickeln

Diese wird ab Version 4.0 der Google Play Billing Library unterstützt, Bei Google Play können Kunden mehr als einen In-App-Artikel kaufen Produkt in einer Transaktion abschließen, indem Sie eine Menge aus dem Warenkorb angeben. Ihr Es wird erwartet, dass die App Käufe in variabler Stückzahl abwickelt und berechtigungsbasiert gewährt für die angegebene Kaufmenge.

Damit Käufe in variabler Stückzahl berücksichtigt werden, muss in der Bereitstellungslogik Ihrer App Folgendes geprüft werden: für eine Artikelmenge. Sie können auf ein quantity-Feld über eine der folgenden APIs:

Nachdem Sie die Logik für die Abwicklung von Käufen mit variabler Stückzahl hinzugefügt haben, die Funktion für variable Stückzahlen für das entsprechende Produkt in der App aktivieren in der Google Play Developer Console auf der Seite zur Produktverwaltung.

Abrechnungskonfiguration des Nutzers abfragen

getBillingConfigAsync() gibt das Land an, für das der Nutzer verwendet wird Google Play

Sie können die Abrechnungskonfiguration des Nutzers danach abfragen ein BillingClient erstellen. Das folgende Code-Snippet beschreibt wie kann man getBillingConfigAsync() anrufen? Verarbeiten Sie die Antwort nach Implementierung von BillingConfigResponseListener Dieser Listener empfängt Aktualisierungen für alle Abfragen der Abrechnungskonfiguration, die über Ihre App initiiert wurden.

Wenn die zurückgegebene BillingResult keine Fehler enthält, können Sie die countryCode im BillingConfig-Objekt, um das Play-Element des Nutzers abzurufen Land.

Kotlin

// Use the default GetBillingConfigParams.
val getBillingConfigParams = GetBillingConfigParams.newBuilder().build()
billingClient.getBillingConfigAsync(getBillingConfigParams,
    object : BillingConfigResponseListener {
        override fun onBillingConfigResponse(
            billingResult: BillingResult,
            billingConfig: BillingConfig?
        ) {
            if (billingResult.responseCode == BillingResponseCode.OK
                && billingConfig != null) {
                val countryCode = billingConfig.countryCode
                ...
            } else {
                // TODO: Handle errors
            }
        }
    })

Java

// Use the default GetBillingConfigParams.
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(getBillingConfigParams,
    new BillingConfigResponseListener() {
      public void onBillingConfigResponse(
          BillingResult billingResult, BillingConfig billingConfig) {
        if (billingResult.getResponseCode() == BillingResponseCode.OK
            && billingConfig != null) {
            String countryCode = billingConfig.getCountryCode();
            ...
         } else {
            // TODO: Handle errors
        }
      }
    });