In diesem Dokument wird die Einbindung Ihrer Einmalkaufprodukte (OTPs) in die Play Billing Library beschrieben. Außerdem wird erläutert, wie Sie verschiedene Kaufoptionen und Angebote für Ihre Einmalkaufprodukte einbinden.
Sie können für Ihre Einmalprodukte mehrere Kaufoptionen und Angebote konfigurieren. Sie können beispielsweise eine Kaufoption und ein Vorbestellungsangebot für dasselbe einmalige Produkt konfigurieren.
Voraussetzungen
Wenn Sie mehrere Angebote für Einmalprodukte konfigurieren möchten, müssen Sie die queryProductDetailsAsync()
API verwenden. Die eingestellte querySkuDetailsAsync()
API wird nicht unterstützt. Informationen zur Verwendung von queryProductDetailsAsync()
und der Version von launchBillingFlow()
, die ProductDetailsParams
als Eingabe annimmt, finden Sie unter Migrationsschritte.
Produktdetails abfragen
Wenn du mehrere Angebote oder Kaufoptionen für dein Einmalkaufprodukt konfiguriert hast, kann das ProductDetails
-Objekt, das von der Methode queryProductDetailsAsync()
zurückgegeben wird, mehr als eine Kauf- und/oder Mietoption pro Einmalkaufprodukt haben. Mit der Methode getOneTimePurchaseOfferDetailsList()
können Sie eine Liste aller infrage kommenden Angebote für jedes ProductDetails
-Objekt abrufen. Nur Angebote und Kaufoptionen, für die der Nutzer infrage kommt, werden in dieser Liste zurückgegeben. Der Code in der Methode onProductDetailsResponse()
sollte die zurückgegebenen Angebote verarbeiten.
Abrechnungsablauf starten
Wenn Sie eine Kaufanfrage von Ihrer App aus starten möchten, rufen Sie die Methode launchBillingFlow()
aus dem Hauptthread Ihrer App auf. Diese Methode nimmt eine Referenz auf ein BillingFlowParams
-Objekt an, das das relevante ProductDetails
-Objekt enthält, das durch Aufrufen von queryProductDetailsAsync()
abgerufen wurde. Verwenden Sie die Klasse BillingFlowParams.Builder
, um ein BillingFlowParams
-Objekt zu erstellen. Hinweis: Du musst das Angebotstoken so festlegen, dass es dem vom Nutzer ausgewählten Angebot entspricht, wenn du das BillingFlowParams
-Objekt erstellst.
Im folgenden Beispiel wird gezeigt, wie der Kaufvorgang für ein einmaliges Produkt mit mehreren Angeboten gestartet wird:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() 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);
Der offerToken
ist Teil des OneTimePurchaseOfferDetails
. Wenn du dem Nutzer das Angebot zeigst, musst du die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses erhältst du über die Methode oneTimePurchaseOfferDetails.getOfferToken()
.
Kaufoptionen und Angebote
Mit einer Kaufoption können Sie festlegen, wie die Berechtigung einem Nutzer gewährt wird, wie hoch der Preis ist und in welcher Region das Produkt verfügbar ist. Ein einzelnes Produkt kann mehrere Kaufoptionen haben, die angeben können, wo und wie Sie Ihr Produkt verkaufen.
Google Play unterstützt die folgenden Kaufoptionen für Einmalkaufprodukte:
- Kaufoption kaufen
- Kaufoption für die Ausleihe
Angebote beziehen sich auf ein Preisschema, das Sie für Ihre Einmalprodukte erstellen können. Sie können beispielsweise ein Rabattangebot für Ihr Einmalprodukt erstellen.
Google Play unterstützt die folgenden Kaufangebote für Einmalkaufprodukte:
- Vorbestellerangebot (nur für die Kaufoption „Kaufen“ unterstützt)
- Rabattangebot (wird sowohl für Kauf- als auch für Leihoptionen unterstützt)
Kaufoption kaufen
Eine Kaufoption steht für einen standardmäßigen, direkten Kauf des Einmalkaufprodukts. Es gibt ein optionales Feld „legacyCompatible“, das angibt, ob diese Kaufoption in älteren Play Billing Library-Abläufen (Version 7 oder älter) verfügbar ist, die das neue Modell nicht unterstützen. Für die Abwärtskompatibilität sollte mindestens eine Kaufoption als mit der alten Version kompatibel gekennzeichnet sein.
Die Schritte zur Einbindung der Kauf- und Leihoptionen in PBL sind identisch. Informationen zur Einbindung der Kaufoption in PBL findest du unter Kaufoption in PBL einbinden.
Kaufoption für die Ausleihe
Mit der Option „Mieten“ können Nutzer für einen bestimmten Zeitraum auf die Einmalkaufprodukte zugreifen. Sie können die Leihfrist und das Ablaufdatum angeben. In diesem Dokument werden die Schritte zur Einbindung der Option zum Mieten in die Play Billing Library (PBL) beschrieben.
Option zum Ausleihen mit PBL verknüpfen
In diesem Abschnitt wird beschrieben, wie Sie die Option zum Ausleihen in die Play Billing Library (PBL) einbinden. Es wird davon ausgegangen, dass Sie mit den ersten Schritten zur PBL-Integration vertraut sind, z. B. mit dem Hinzufügen der PBL-Abhängigkeit zu Ihrer App, der Initialisierung des BillingClient und der Verbindung zu Google Play. In diesem Abschnitt geht es um die Aspekte der PBL-Integration, die speziell für die Option „Ausleihen und kaufen“ gelten.
Wenn Sie Produkte zum Ausleihen konfigurieren möchten, müssen Sie den neuen monetization.onetimeproducts
-Dienst der Play Developer API oder die Play Console-Benutzeroberfläche verwenden. Sie können den Dienst verwenden, indem Sie die REST API direkt aufrufen oder die Java-Clientbibliothek verwenden.
Kaufvorgang für die Option „Ausleihen“ starten
So startest du den Kaufvorgang für ein Leihangebot:
Rufe die Metadaten der Kaufoption für die Ausleihe mit der Methode
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
ab.Im folgenden Beispiel wird gezeigt, wie du die Metadaten für einen Mietkauf abrufen kannst:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a rent purchase option. if (oneTimePurchaseOfferDetails.getRentalDetails() != null) { // process the returned RentalDetails OneTimePurchaseOfferDetails.RentalDetails rentalDetails = oneTimePurchaseOfferDetails.getRentalDetails(); // Get rental period in ISO 8601 format. String rentalPeriod = rentalDetails.getRentalPeriod(); // Get rental expiration period in ISO 8601 format, if present. if (rentalDetails.getRentalExpirationPeriod() != null) { String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod(); } // Get offer token String offerToken = oneTimePurchaseOfferDetails.getOfferToken(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Starten Sie den Abrechnungsvorgang.
Wenn Sie eine Kaufanfrage von Ihrer App aus starten möchten, rufen Sie die Methode
launchBillingFlow()
aus dem Hauptthread Ihrer App auf. Diese Methode nimmt eine Referenz auf einBillingFlowParams
-Objekt an, das das relevanteProductDetails
-Objekt enthält, das durch Aufrufen vonqueryProductDetailsAsync()
abgerufen wurde. Verwenden Sie die KlasseBillingFlowParams.Builder
, um einBillingFlowParams
-Objekt zu erstellen. Hinweis: Beim Erstellen desBillingFlowParams
-Objekts musst du das Angebotstoken für das vom Nutzer ausgewählte Angebot festlegen. Wenn ein Nutzer die Option zum Ausleihen und Kaufen nutzen kann, erhält er ein Angebot mit RentalDetails und offerId inqueryProductDetailsAsync()
.Das folgende Beispiel zeigt, wie der Abrechnungsvorgang gestartet wird:
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) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, 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) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, 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);
Der
offerToken
ist Teil desOneTimePurchaseOfferDetails
. Wenn du dem Nutzer das Angebot zeigst, musst du die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses kannst du über die MethodeoneTimePurchaseOfferDetails.getOfferToken()
abrufen.
Vorbestellungsangebot
Mit Vorbestellungen kannst du einmalige Produkte einrichten, die vor der Veröffentlichung des Artikels gekauft werden können. Wenn ein Nutzer Ihr Produkt vorbestellt, erklärt er sich damit einverstanden, den Artikel zu bezahlen, sobald das Produkt veröffentlicht wird, es sei denn, er storniert die Vorbestellung vor dem Veröffentlichungsdatum. Am Veröffentlichungsdatum wird dem Käufer der Kaufpreis in Rechnung gestellt und er wird per E-Mail darüber informiert, dass der Artikel veröffentlicht wurde.
In diesem Dokument werden die Schritte zum Einbinden des Kaufangebots für Vorbestellungen in die Play Billing Library (PBL) beschrieben.
Vorbestellungsangebot in PBL einbinden
In diesem Abschnitt wird beschrieben, wie Sie das Angebot für Vorbestellungen in die Play Billing Library (PBL) einbinden. Es wird davon ausgegangen, dass Sie mit den ersten Schritten zur PBL-Integration vertraut sind, z. B. mit dem Hinzufügen der PBL-Abhängigkeit zu Ihrer App, der Initialisierung des BillingClient und der Verbindung zu Google Play. In diesem Abschnitt geht es um die Aspekte der PBL-Integration, die für das Vorbestellungsangebot spezifisch sind.
Kaufvorgang für ein Vorbestellungsangebot starten
So startest du den Kaufvorgang für ein Vorbestellungsangebot:
Rufe die Metadaten des Vorbestellungsangebots mit der Methode
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
ab. Im folgenden Beispiel wird gezeigt, wie die Metadaten für ein Vorbestellungsangebot abgerufen werden:Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a preorder offer. if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) { // process the returned PreorderDetails OneTimePurchaseOfferDetails.PreorderDetails preorderDetails = oneTimePurchaseOfferDetails.getPreorderDetails(); // Get preorder release time in millis. long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis(); // Get preorder presale end time in millis. long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis(); // Get offer ID String offerId = oneTimePurchaseOfferDetails.getOfferId(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Starten Sie den Abrechnungsvorgang.
Wenn Sie eine Kaufanfrage von Ihrer App aus starten möchten, rufen Sie die Methode
launchBillingFlow()
aus dem Hauptthread Ihrer App auf. Diese Methode nimmt eine Referenz auf einBillingFlowParams
-Objekt an, das das relevanteProductDetails
-Objekt enthält, das durch Aufrufen von queryProductDetailsAsync() abgerufen wurde. Verwenden SieBillingFlowParams.Builder class
, um einBillingFlowParams
-Objekt zu erstellen. Hinweis: Du musst das Angebotstoken so festlegen, dass es dem vom Nutzer ausgewählten Angebot entspricht, wenn du dasBillingFlowParams
-Objekt erstellst. Wenn ein Nutzer das Vorbestellungsangebot in Anspruch nehmen kann, erhält er ein Angebot mit PreorderDetails und offerId in derqueryProductDetailsAsync()
-Methode.Das folgende Beispiel zeigt, wie der Abrechnungsvorgang gestartet wird:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() 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);
Der
offerToken
ist Teil desOneTimePurchaseOfferDetails
. Wenn du dem Nutzer das Angebot zeigst, musst du die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses kannst du über die MethodeoneTimePurchaseOfferDetails.getOfferToken()
abrufen.
Rabattangebot
In diesem Abschnitt wird beschrieben, wie Sie Rabattangebote für Ihre Einmalprodukte konfigurieren.
Für ein einmaliges Produktrabattangebot können Sie vier verschiedene Parameter konfigurieren:
Ermäßigter Angebotspreis: Hier werden entweder der Prozentsatz des Rabatts oder der absolute Preisnachlass auf den Originalpreis angegeben.
Verfügbarkeit in Ländern oder Regionen: Gibt an, ob Einmalkaufproduktangebote in einem Land oder einer Region verfügbar sind.
Kauflimit (optional): Hiermit legen Sie fest, wie oft ein Nutzer dasselbe Angebot einlösen kann. Wenn ein Nutzer das Kauflimit überschreitet, kann er das Angebot nicht in Anspruch nehmen.
Zeitlich begrenzt (optional): Gibt den Zeitraum an, in dem das Angebot verfügbar ist. Außerhalb dieses Zeitraums kann das Angebot nicht gekauft werden.
Informationen zum ermäßigten Angebotspreis abrufen
Bei einem ermäßigten Angebot können Sie den prozentualen Rabatt oder den absoluten Rabatt abrufen.
Beispiel 1: Prozentsatz des Rabatts für ein reduziertes Angebot abrufen
Im folgenden Beispiel wird gezeigt, wie Sie den ursprünglichen Vollpreis und den prozentualen Rabatt des ermäßigten Angebots abrufen. Die Informationen zum prozentualen Rabatt werden nur für Angebote mit Rabatt zurückgegeben.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult){ // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and percentageDiscount. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long percentageDiscount = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getPercentageDiscount(); } // … } } } });
Beispiel 2: Absoluten Rabatt eines reduzierten Angebots abrufen
Im folgenden Beispiel wird gezeigt, wie Sie den ursprünglichen Vollpreis und den absoluten Rabatt des ermäßigten Angebots in Mikros abrufen. Der absolute Rabatt in den Micro-Informationen wird nur für ermäßigte Angebote zurückgegeben. Für ein Rabattangebot muss entweder der absolute Rabatt oder der prozentuale Rabatt angegeben werden.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and absolute DiscountAmountMicros. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long discountAmountMicros = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getDiscountAmount() .getDiscountAmountMicros(); } // … } } } });
Gültiges Zeitfenster eines Angebots abrufen
Mit der Methode OneTimePurchaseOfferDetails.getValidTimeWindow()
können Sie das gültige Zeitfenster für ein Angebot abrufen. Dieses Objekt enthält den Beginn und das Ende des Zeitfensters in Millisekunden.
Im folgenden Beispiel wird gezeigt, wie Sie das gültige Zeitfenster eines Angebots abrufen:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) { // process the returned startTimeMillis and endTimeMillis. ValidTimeWindow validTimeWindow = oneTimePurchaseOfferDetails.getValidTimeWindow(); long startTimeMillis = validTimeWindow.getStartTimeMillis(); long endTimeMillis = validTimeWindow.getEndTimeMillis(); // … } } } } });
Begrenzte Stückzahl auf Ebene des Rabattangebots
Sie können das maximale Stückzahllimit auf Ebene des Rabattangebots angeben. Es wird dann nur auf Angebotsebene angewendet. Hier ein Beispiel zur Veranschaulichung:
- Super Screensavers bietet zwei Angebote für das Bildschirmschonerprodukt: Kaufoption für Bildschirmschoner und Rabatt für Bildschirmschoner.
- Für den Bildschirmschoner mit Kaufoption ist keine begrenzte Stückzahl festgelegt.
- Für den Rabatt-Bildschirmschoner ist die maximal zulässige Stückzahl auf Angebotsebene auf 3 festgelegt.
- Für das Bildschirmschonerprodukt ist keine maximal zulässige Stückzahl auf Produktebene festgelegt. Nutzer können also unbegrenzt viele Einheiten dieses Produkts kaufen.
- Der Nutzer hat einen Bildschirmschoner mit Rabatt und möchte einen weiteren mit Rabatt kaufen.
- Beim Abrufen der verfügbaren Angebote ist „LimitedQuantityInfo“ für den Bildschirmschoner mit Kaufoption null und der Wert für die verbleibende Stückzahl für den Bildschirmschoner mit Rabatt ist 2.
Im folgenden Beispiel wird gezeigt, wie Sie die begrenzte Stückzahl auf Ebene des Rabattangebots abrufen:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) { // process the returned maximumQuantity and remainingQuantity. LimitedQuantityInfo limitedQuantityInfo = oneTimePurchaseOfferDetails.getLimitedQuantityInfo(); int maximumQuantity = limitedQuantityInfo.getMaximumQuantity(); int remainingQuantity = limitedQuantityInfo.getRemainingQuantity(); // … } } } } });
Wenn Nutzer die maximale Anzahl von Einlösungen für ein Angebot nutzen, wird das Angebot nicht von der Methode getOneTimePurchaseOfferDetailsList()
zurückgegeben.
Einlösungslimit berechnen
Im folgenden Beispiel wird gezeigt, wie Sie Informationen zur begrenzten Stückzahl für ein bestimmtes Rabattangebot abrufen. Sie können die maximal zulässige und die verbleibende Menge für den aktuellen Nutzer abrufen. Die Funktion „Begrenzte Stückzahl“ gilt sowohl für Verbrauchs- als auch für nicht verbrauchbare einmalige Produktangebote. Diese Funktion wird nur auf Angebotsebene unterstützt.
Google Play berechnet die verbleibende Menge, indem die Menge der vorhandenen Artikel des Nutzers von der von Ihnen festgelegten maximal zulässigen Menge abgezogen wird. Bei der Berechnung der Anzahl der Inhalte, die dem Nutzer gehören, berücksichtigt Google Play in Anspruch genommene Käufe oder ausstehende Käufe. Käufe, die storniert, erstattet oder zurückgebucht wurden, werden nicht auf die Anzahl der Artikel des Nutzers angerechnet. Beispiel:
Bei Super-Bildschirmschonern wird ein Rabattangebot mit der maximal zulässigen Stückzahl von 1 eingerichtet, sodass Nutzer einen Bildschirmschoner zum reduzierten Preis kaufen können.
Der Nutzer kauft einen der reduzierten Bildschirmschoner. Wenn der Nutzer dann versucht, den zweiten Bildschirmschoner mit Rabatt zu kaufen, tritt ein Fehler auf und die
PurchasesUpdatedListener
erhält den Antwortcode ITEM_UNAVAILABLE.Der Nutzer fordert eine Erstattung für den ursprünglich gekauften, ermäßigten Bildschirmschoner an und erhält diese auch. Der Nutzer versucht, einen der reduzierten Bildschirmschoner zu kaufen, und der Kauf ist erfolgreich.
Verfügbarkeit nach Land und Region
Sie können die Länder oder Regionen auswählen, in denen das Angebot für die Kaufoption oder das Rabattangebot für Nutzer verfügbar sein soll. Google Play prüft die Berechtigung von Nutzern basierend auf dem Play-Land. Wenn Sie die regionale Verfügbarkeit für ein Angebot konfigurieren, wird es nur dann als Teil von getOneTimePurchaseOfferDetailsList()
zurückgegeben, wenn sich der Nutzer in einem Zielland oder einer Zielregion befindet. Andernfalls ist es nicht Teil der Liste der Angebote, die bei Aufruf von queryProductDetailsAsync()
zurückgegeben werden.
Angebots-Tags
Im folgenden Beispiel wird gezeigt, wie die Angebots-Tags abgerufen werden, die mit einem Angebot verknüpft sind.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // process the returned offer tags. ImmutableList<String> offerTags = oneTimePurchaseOfferDetails.getOfferTagsList(); // … } } } });
Vererbung von Angebots-Tags
Sie können Angebots-Tags für Produkte, Kaufoptionen oder Rabattangebote festlegen. Rabattangebote übernehmen die Angebots-Tags aus dem Angebot mit Kaufoption. Wenn Angebots-Tags auf Produktebene angegeben sind, werden die Produktangebots-Tags sowohl für das Angebot der Kaufoption als auch für das Rabattangebot übernommen.
Super Screensavers bietet beispielsweise zwei Angebote für das Bildschirmschonerprodukt an: einen Bildschirmschoner mit Kaufoption und einen Bildschirmschoner mit Rabatt.
- Super Screensaver hat das Produktangebots-Tag
SSProductTag
. - Der Bildschirmschoner für die Kaufoption enthält das Angebots-Tag
SSPurchaseOptionTag
. - Der Rabatt-Bildschirmschoner enthält das Angebots-Tag
SSDiscountOfferTag
.
In diesem Beispiel gibt die Methode oneTimePurchaseOfferDetails.getOfferTagsList()
für das Angebot mit Kaufoption SSProductTag
und SSPurchaseOptionTag
zurück. Für das Rabattangebot gibt die Methode SSProductTag
, SSPurchaseOptionTag
und SSDiscountOfferTag
zurück.