Mehrere Kaufoptionen und Angebote für Einmalkaufprodukte

In diesem Dokument wird die Einbindung Ihrer Einmalkaufprodukte 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 mehrere Kaufoptionen und Angebote für Ihre Einmalkaufprodukte konfigurieren. Sie können beispielsweise eine Kaufoption und ein Vorbestellungsangebot für dasselbe Einmalprodukt konfigurieren.

Voraussetzungen

Wenn Sie mehrere Angebote für Einmalkaufprodukte 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 verwendet, finden Sie unter Migrationsschritte.

Produktdetails abfragen

Wenn Sie mehrere Angebote oder Kaufoptionen für Ihr Einmalkaufprodukt konfiguriert haben, kann das von der queryProductDetailsAsync()-Methode zurückgegebene ProductDetails-Objekt mehr als eine verfügbare Kauf- und/oder Leihkaufoption pro Einmalkaufprodukt enthalten. Mit der Methode getOneTimePurchaseOfferDetailsList() können Sie die Liste aller infrage kommenden Angebote für jedes ProductDetails-Objekt abrufen. In dieser Liste werden nur Angebote und Kaufoptionen zurückgegeben, für die der Nutzer infrage kommt. Ihr Code in der Methode onProductDetailsResponse() sollte die zurückgegebenen Angebote verarbeiten.

Abrechnungsablauf starten

Rufen Sie die Methode launchBillingFlow() im Hauptthread Ihrer App auf, um eine Kaufanfrage zu starten. Diese Methode akzeptiert einen Verweis auf ein BillingFlowParams-Objekt, 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: Sie müssen das Angebotstoken entsprechend dem vom Nutzer ausgewählten Angebot festlegen, wenn Sie das BillingFlowParams-Objekt erstellen.

Das folgende Beispiel zeigt, wie der Kaufvorgang für ein Einmalkaufprodukt 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 &quot;productDetails&quot; 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);
    
    

Die offerToken ist Teil der OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter des Abrechnungsablaufs mit dem richtigen Angebotstoken konfigurieren, das Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken() abrufen können.

Kaufoptionen und Angebote

Mit einer Kaufoption können Sie festlegen, wie die Berechtigung einem Nutzer gewährt wird, welchen Preis sie hat und in welcher Region das Produkt verfügbar ist. Ein einzelnes Produkt kann mehrere Kaufoptionen haben, die angeben, wo und wie Sie Ihr Produkt verkaufen.

Google Play unterstützt die folgenden Kaufoptionen für Einmalkaufprodukte:

  • Kaufoption kaufen
  • Option zum Ausleihen und Kaufen

Angebote beziehen sich auf ein Preisschema, das Sie für Ihre Einmalkaufprodukte erstellen können. Sie können beispielsweise ein Rabattangebot für Ihr Einmalkaufprodukt erstellen.

Google Play unterstützt die folgenden Kaufangebote für Einmalkaufprodukte:

  • Vorbesteller-Angebot (wird 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 für den Kauf stellt einen Standardkauf des Einmalkaufprodukts dar. Sie enthält das optionale 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 alter Version kompatibel“ markiert sein.

Die Schritte zum Einbinden der Kauf- und Leihoptionen mit PBL sind identisch. Informationen zur Integration der Kaufoption mit PBL finden Sie unter Kaufoption mit PBL integrieren.

Option zum Ausleihen und Kaufen

Mit der Option „Mieten“ können Nutzer für einen bestimmten Zeitraum auf die Einmalkaufprodukte zugreifen. Sie können den Leihzeitraum und das Ablaufdatum angeben. In diesem Dokument wird beschrieben, wie Sie die Kaufoption „Leihen“ in die Play Billing Library (PBL) einbinden.

Option zum Ausleihen von Inhalten in PBL einbinden

In diesem Abschnitt wird beschrieben, wie Sie die Option zum Leihen/Kaufen in die Play Billing Library (PBL) einbinden. Es wird davon ausgegangen, dass Sie mit den ersten Schritten der PBL-Integration vertraut sind, z. B. PBL-Abhängigkeit zu Ihrer App hinzufügen, BillingClient initialisieren und Verbindung zu Google Play herstellen. In diesem Abschnitt geht es um die PBL-Integrationsaspekte, die für die Kaufoption „Leihen“ spezifisch sind.

Wenn Sie Produkte konfigurieren möchten, die zum Verleih verfügbar sind, müssen Sie den neuen monetization.onetimeproducts-Dienst der Play Developer API oder die Benutzeroberfläche der Play Console verwenden. Um den Dienst zu verwenden, können Sie die REST API direkt aufrufen oder die Java-Clientbibliothek verwenden.

Kaufvorgang für die Leihoption starten

So starten Sie einen Kaufvorgang für ein Leihangebot:

  1. Rufen Sie die Metadaten für die Kaufoption für die Leihgebühr mit der Methode ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() ab.

    Im folgenden Beispiel wird gezeigt, wie die Metadaten für den Kauf von Leihinhalten 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 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();
              }
            }
          }
        }
      }
    });
  2. Starten Sie den Abrechnungsvorgang.

    Rufen Sie die Methode launchBillingFlow() im Hauptthread Ihrer App auf, um eine Kaufanfrage zu starten. Diese Methode verwendet eine Referenz auf ein BillingFlowParams-Objekt, 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: Sie müssen das Angebotstoken für das vom Nutzer ausgewählte Angebot beim Erstellen des BillingFlowParams-Objekts festlegen. Wenn ein Nutzer für die Option zum Ausleihen und Kaufen infrage kommt, erhält er ein Angebot mit RentalDetails und offerId in queryProductDetailsAsync().

    Das folgende Beispiel zeigt, wie der Abrechnungsablauf 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);

    Die offerToken ist Teil der OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter des Abrechnungsablaufs mit dem richtigen Angebotstoken konfigurieren, das Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken() abrufen können.

Vorbestellungsangebot

Mit der Vorbestellungsfunktion können Sie 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, für den Artikel zu bezahlen, wenn das Produkt veröffentlicht wird, es sei denn, er storniert die Vorbestellung vor dem Veröffentlichungsdatum. Am Erscheinungsdatum wird dem Käufer der Artikel in Rechnung gestellt und er wird per E-Mail von Google Play benachrichtigt, dass der Artikel veröffentlicht wurde.

In diesem Dokument wird beschrieben, wie Sie das Vorbestellungsangebot in die Play Billing Library (PBL) einbinden.

Vorbestellungsangebot in PBL einbinden

In diesem Abschnitt wird beschrieben, wie Sie das Vorbestellungsangebot in die Play Billing Library (PBL) einbinden. Es wird davon ausgegangen, dass Sie mit den ersten Schritten der PBL-Integration vertraut sind, z. B. PBL-Abhängigkeit zu Ihrer App hinzufügen, BillingClient initialisieren und Verbindung zu Google Play herstellen. In diesem Abschnitt geht es um die PBL-Integrationsaspekte, die speziell für das Vorbestellungsangebot gelten.

Kaufvorgang für ein Vorbestellungsangebot starten

So starten Sie einen Kaufvorgang für ein Vorbestellungsangebot:

  1. Rufen Sie die Metadaten des Vorbestellungsangebots mit der Methode ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() ab. Im folgenden Beispiel wird gezeigt, wie die Metadaten für das 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();
              }
            }
          }
        }
      }
    });

  2. Starten Sie den Abrechnungsvorgang.

    Rufen Sie die Methode launchBillingFlow() im Hauptthread Ihrer App auf, um eine Kaufanfrage zu starten. Diese Methode verwendet eine Referenz auf ein BillingFlowParams-Objekt, das das relevante ProductDetails-Objekt enthält, das durch Aufrufen von queryProductDetailsAsync() abgerufen wurde. Verwenden Sie BillingFlowParams.Builder class, um ein BillingFlowParams-Objekt zu erstellen. Beachte, dass du beim Erstellen des BillingFlowParams-Objekts das Angebotstoken für das vom Nutzer ausgewählte Angebot festlegen musst. Wenn ein Nutzer für das Vorbestellungsangebot infrage kommt, erhält er in der queryProductDetailsAsync()-Methode ein Angebot mit PreorderDetails und offerId.

    Das folgende Beispiel zeigt, wie der Abrechnungsablauf 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);

    Die offerToken ist Teil der OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter des Abrechnungsablaufs mit dem richtigen Angebotstoken konfigurieren, das Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken() abrufen können.

Rabattangebot

In diesem Abschnitt wird beschrieben, wie Sie Rabattangebote für Ihre Einmalkaufprodukte konfigurieren können.

Sie können vier verschiedene Parameter in einem Angebot für einen einmaligen Produktrabatt konfigurieren:

  • Angebotspreis mit Rabatt: Gibt Details zum prozentualen oder absoluten Rabatt auf den ursprünglichen Preis an.

  • Berechtigung für Länder oder Regionen: Gibt die Verfügbarkeit von Einmalkaufprodukt-Angeboten in einem Land oder einer Region an.

  • Kaufbegrenzung (optional): Hiermit legen Sie fest, wie oft ein Nutzer dasselbe Angebot einlösen kann. Wenn ein Nutzer das Kauflimit überschreitet, hat er keinen Anspruch auf das Angebot.

  • 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 vergünstigten Angebotspreis abrufen

Bei einem Angebot mit Rabatt können Sie den prozentualen oder absoluten Rabatt abrufen.

Beispiel 1: Prozentsatz des Rabatts eines Angebots mit Rabatt abrufen

Im folgenden Beispiel wird gezeigt, wie der ursprüngliche Vollpreis des Angebots mit Rabatt und der prozentuale Rabatt abgerufen werden. 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 Angebots mit Rabatt abrufen

Im folgenden Beispiel wird gezeigt, wie Sie den ursprünglichen Vollpreis des Angebots mit Rabatt und den absoluten Rabatt in Mikros abrufen. Der absolute Rabatt in Mikros wird nur für Angebote mit Rabatt zurückgegeben. Für ein Rabattangebot muss entweder der absolute 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ültigkeitszeitraum eines Angebots abrufen

Mit der Methode OneTimePurchaseOfferDetails.getValidTimeWindow() können Sie das gültige Zeitfenster für ein Angebot abrufen. Dieses Objekt enthält die Start- und Endzeit des Zeitfensters in Millisekunden.

Das folgende Beispiel zeigt, 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 Menge auf Rabattangebotsebene

Sie können das maximale Mengenlimit auf der Ebene des Rabattangebots festlegen. Es wird nur auf Angebotsebene angewendet. Hier ein Beispiel zur Veranschaulichung:

  1. Für das Bildschirmschoner-Produkt gibt es zwei Angebote: den Kauf eines Bildschirmschoners und einen Bildschirmschoner mit Rabatt.
    1. Für den Kaufoption-Bildschirmschoner ist keine begrenzte Menge eingerichtet.
    2. Für den Rabatt-Bildschirmschoner ist die maximal zulässige Menge auf Angebotsebene auf 3 festgelegt.
  2. Für das Screensaver-Produkt gibt es keine maximal zulässige Menge auf Produktebene. Nutzer können also eine unbegrenzte Menge dieses Produkts kaufen.
  3. Der Nutzer besitzt einen Bildschirmschoner mit Rabatt und möchte einen weiteren mit dem Rabatt kaufen.
  4. Beim Abrufen der verfügbaren Angebote ist die LimitedQuantityInfo für den Kaufoptions-Bildschirmschoner null und der Wert für die verbleibende Menge für den Rabatt-Bildschirmschoner ist 2.

Das folgende Beispiel zeigt, wie Sie die begrenzte Menge auf der 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 an Einlösungen für ein Angebot erreicht haben, wird das Angebot von der Methode getOneTimePurchaseOfferDetailsList() nicht zurückgegeben.

Einlösungslimit berechnen

Das folgende Beispiel zeigt, wie Sie Informationen zur begrenzten Menge für ein bestimmtes Rabattangebot abrufen. Sie können die maximal zulässige Menge und die verbleibende Menge für den aktuellen Nutzer abrufen. Die Funktion „Begrenzte Menge“ gilt sowohl für einmalige Produktangebote für Verbrauchsartikel als auch für einmalige Produktangebote für nicht verbrauchbare Artikel. Diese Funktion wird nur auf Angebotsebene unterstützt.

Google Play berechnet die verbleibende Menge, indem die Menge, die der Nutzer besitzt, von der von Ihnen festgelegten maximal zulässigen Menge abgezogen wird. Bei der Berechnung der Anzahl der Inhalte, die der Nutzer besitzt, berücksichtigt Google Play verbrauchte oder ausstehende Käufe. Käufe, die storniert, erstattet oder zurückgebucht wurden, werden nicht auf die Anzahl der Artikel angerechnet, die der Nutzer besitzt. Beispiel:

  1. Bei Super-Bildschirmschonern wird ein Rabattangebot mit der maximal zulässigen Menge von eins eingerichtet, sodass Nutzer bis zu einen Bildschirmschoner mit Rabatt kaufen können.

  2. Der Nutzer kauft einen der Bildschirmschoner mit Rabatt. Wenn der Nutzer dann versucht, den zweiten vergünstigten Bildschirmschoner zu kaufen, tritt ein Fehler auf und die PurchasesUpdatedListener erhält den Antwortcode ITEM_UNAVAILABLE.

  3. Der Nutzer bittet um eine Erstattung des ursprünglich gekauften, rabattierten Bildschirmschoners und erhält die Erstattung. Der Nutzer versucht, einen der reduzierten Bildschirmschoner zu kaufen, und der Kauf ist erfolgreich.

Unterstützte Länder und Regionen

Sie können die Länder oder Regionen auswählen, in denen Nutzern ein Angebot für eine Kaufoption oder ein Rabattangebot zur Verfügung gestellt wird. Google Play prüft die Berechtigung von Nutzern anhand des Play-Landes. Wenn Sie die regionale Verfügbarkeit für ein Angebot konfigurieren, wird es nur als Teil von getOneTimePurchaseOfferDetailsList() zurückgegeben, wenn sich der Nutzer in einem Zielland oder einer Zielregion befindet. Andernfalls ist es nicht in der Liste der Angebote enthalten, die zurückgegeben werden, wenn Sie queryProductDetailsAsync() aufrufen.

Angebots-Tags

Im folgenden Beispiel wird gezeigt, wie Sie die mit einem Angebot verknüpften Angebotstags 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()) {
            // 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 Angebotstags aus dem Angebot der zugehörigen Kaufoption. Wenn Angebots-Tags auf Produktebene angegeben werden, werden sie sowohl für Kaufoptionen als auch für Rabattangebote übernommen.

Super Screensavers hat beispielsweise zwei Angebote für das Bildschirmschonerprodukt: einen Bildschirmschoner mit Kaufoption und einen Bildschirmschoner mit Rabatt.

  • Der Super-Bildschirmschoner hat das Produktangebot-Tag SSProductTag.
  • Der Kaufoption-Bildschirmschoner hat das Angebotstag SSPurchaseOptionTag.
  • Der Bildschirmschoner mit Rabatt hat das Angebotstag SSDiscountOfferTag.

In diesem Beispiel gibt die oneTimePurchaseOfferDetails.getOfferTagsList()-Methode für das Kaufoptionsangebot SSProductTag und SSPurchaseOptionTag zurück. Für das Rabattangebot gibt die Methode SSProductTag, SSPurchaseOptionTag und SSDiscountOfferTag zurück.