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.
- Zeigen Sie den Nutzern, was sie kaufen können.
- Starte den Kaufvorgang, damit der Nutzer den Kauf akzeptieren kann.
- Bestätige den Kauf auf deinem Server.
- Stellen Sie dem Nutzer Inhalte zur Verfügung.
- 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:
Cool
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" 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:
Cool
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" 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:
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">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.
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:
- Bestätigen Sie den Kauf.
- Ü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:
getQuantity()
aus der Google Play Billing Library.Purchases.products.quantity
von der Google Play Developer API.
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
}
}
});