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. Beispielsweise können Sie für dasselbe Einmalkaufprodukt eine Kaufoption vom Typ „Kaufen“ und ein Vorbesteller-Angebot konfigurieren.

Vorbereitung

Wenn Sie mehrere Angebote für Einmalkaufprodukte konfigurieren möchten, müssen Sie die queryProductDetailsAsync() API verwenden. Die eingestellte API querySkuDetailsAsync() wird nicht unterstützt. Informationen zur Verwendung von queryProductDetailsAsync() und der Version von launchBillingFlow() , die ProductDetailsParams als Eingabe akzeptiert, finden Sie unter Migrationsschritte.

Produktdetails abfragen

Wenn Sie mehrere Angebote oder Kaufoptionen für Ihr Einmalkauf produkt konfiguriert haben, kann das ProductDetails-Objekt, das von der queryProductDetailsAsync()-Methode zurückgegeben wird, mehr als eine verfügbare Kaufoption vom Typ „Kaufen“ und/oder „Ausleihen“ pro Einmalkaufprodukt enthalten. Verwenden Sie die getOneTimePurchaseOfferDetailsList() Methode, um die Liste aller infrage kommenden Angebote für jedes ProductDetails Objekt abzurufen. In dieser Liste werden nur Angebote und Kaufoptionen zurückgegeben, für die der Nutzer infrage kommt. Ihr Code in der onProductDetailsResponse() Methode muss die zurückgegebenen Angebote verarbeiten.

Abrechnungsvorgang starten

Wenn Sie eine Kaufanfrage über Ihre App starten möchten, rufen Sie die launchBillingFlow() Methode im Hauptthread Ihrer App auf. Diese Methode verwendet einen Verweis auf ein BillingFlowParams-Objekt, das das relevante ProductDetails -Objekt enthält, das durch Aufrufen von queryProductDetailsAsync() abgerufen wurde. Verwenden Sie die BillingFlowParams.Builder Klasse, um ein BillingFlowParams-Objekt zu erstellen. Beachten Sie, dass Sie beim Erstellen des BillingFlowParams-Objekts das Angebotstoken für das vom Nutzer ausgewählte Angebot festlegen müssen.

Das folgende Beispiel zeigt, wie Sie den Kaufvorgang für ein Einmalkaufprodukt mit mehreren Angeboten starten:

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);
    
    

Das offerToken finden Sie in den OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses erhalten Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken().

Kaufoptionen und Angebote

Mit einer Kaufoption können Sie definieren, wie dem Nutzer die Berechtigung gewährt wird, außerdem den Preis und in welcher Region das Produkt verfügbar ist. Für ein einzelnes Produkt können mehrere Kaufoptionen gelten, die darstellen, wo und wie Sie Ihr Produkt verkaufen.

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

  • Kaufoption „Kaufen“
  • Kaufoption „Ausleihen“

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 für die Kaufoptionen „Kaufen“ und „Ausleihen“ unterstützt)

Kaufoption „Kaufen“

Die Kaufoption „Kaufen“ steht für den Standardkauf des Einmalkaufprodukts. Sie hat 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. Aus Gründen der Abwärtskompatibilität sollte mindestens eine Kaufoption vom Typ „Kaufen“ als mit alten Versionen kompatibel gekennzeichnet sein.

Die Schritte zum Einbinden der Kaufoptionen „Kaufen“ und „Ausleihen“ in die PBL sind identisch. Informationen zum Einbinden der Kaufoption „Kaufen“ in die PBL finden Sie unter siehe Kaufoption „Ausleihen“ in die PBL einbinden.

Kaufoption „Ausleihen“

Mit der Kaufoption „Ausleihen“ können Nutzer für einen bestimmten Zeitraum auf die Einmalkaufprodukte zugreifen. Sie können die Leihdauer und das Ablaufdatum angeben. In diesem Dokument werden die Schritte zum Einbinden der Kaufoption „Ausleihen“ in die Play Billing Library (PBL) beschrieben.

Kaufoption „Ausleihen“ in die PBL einbinden

In diesem Abschnitt wird beschrieben, wie Sie die Kaufoption „Ausleihen“ in die Play Billing Library (PBL) einbinden. Dabei wird davon ausgegangen, dass Sie mit den ersten Schritten zur PBL Einbindung vertraut sind, z. B. dem Hinzufügen der PBL-Abhängigkeit zu Ihrer App, Initialisieren von BillingClient und dem Herstellen einer Verbindung zu Google Play. In diesem Abschnitt werden die Aspekte der PBL-Einbindung behandelt, die spezifisch für die Kaufoption „Ausleihen“ sind.

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

Kaufvorgang für die Option „Ausleihen“ starten

So starten Sie einen Kaufvorgang für ein Leihangebot:

  1. Rufen Sie die Metadaten der Kaufoption „Ausleihen“ mit der ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() Methode ab.

    Das folgende Beispiel zeigt, wie Sie die Metadaten der Kaufoption „Ausleihen“ 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()) {
            // 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.

    Wenn Sie eine Kaufanfrage über Ihre App starten möchten, rufen Sie die launchBillingFlow() Methode im Hauptthread Ihrer App auf. Diese Methode verwendet einen Verweis auf ein BillingFlowParams-Objekt, das das relevante ProductDetails-Objekt enthält, das durch Aufrufen von queryProductDetailsAsync() abgerufen wurde. Verwenden Sie die BillingFlowParams.Builder Klasse, um ein BillingFlowParams Objekt zu erstellen. Beachten Sie, dass Sie beim Erstellen des BillingFlowParams-Objekts das Angebotstoken für das vom Nutzer ausgewählte Angebot festlegen müssen, Wenn ein Nutzer für die Kaufoption „Ausleihen“ infrage kommt, erhält er in queryProductDetailsAsync() ein Angebot mit RentalDetails und offerId.

    Das folgende Beispiel zeigt, wie Sie den Abrechnungsvorgang starten:

    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.getSubscriptionOfferDetails()
            // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            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.getSubscriptionOfferDetails()
                // 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);

    Das offerToken finden Sie in den OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses erhalten Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken().

Vorbesteller-Angebot

Mit der Vorbestellung können Sie Einmalkaufprodukte so einrichten, dass sie vor der Veröffentlichung 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, der Nutzer storniert die Vorbestellung vor dem Datum der Veröffentlichung. Am Datum der Veröffentlichung wird dem Käufer der Betrag in Rechnung gestellt und er erhält von Google Play eine E‑Mail-Benachrichtigung über die Veröffentlichung des Artikels.

In diesem Dokument werden die Schritte zum Einbinden des Vorbesteller-Kaufangebots in die Play Billing Library (PBL) beschrieben.

Vorbesteller-Angebot in die PBL einbinden

In diesem Abschnitt wird beschrieben, wie Sie das Vorbesteller-Angebot in die Play Billing Library (PBL) einbinden. Dabei wird davon ausgegangen, dass Sie mit den ersten Schritten zur PBL Einbindung vertraut sind, z. B. dem Hinzufügen der PBL-Abhängigkeit zu Ihrer App, Initialisieren von BillingClient und dem Herstellen einer Verbindung zu Google Play. In diesem Abschnitt werden die Aspekte der PBL-Einbindung behandelt, die spezifisch für das Vorbesteller-Angebot sind.

Kaufvorgang für ein Vorbesteller-Angebot starten

So starten Sie einen Kaufvorgang für ein Vorbesteller-Angebot:

  1. Rufen Sie die Metadaten des Vorbesteller-Angebots mit der ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() Methode ab. Das folgende Beispiel zeigt, wie Sie die Metadaten des Vorbesteller-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()) {
            // 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.

    Wenn Sie eine Kaufanfrage über Ihre App starten möchten, rufen Sie die Methode launchBillingFlow() im Hauptthread Ihrer App auf. Diese Methode verwendet einen Verweis auf ein BillingFlowParams-Objekt, das das relevante ProductDetails-Objekt enthält, das durch Aufrufen von queryProductDetailsAsync() abgerufen wurde. Verwenden Sie die BillingFlowParams.Builder class, um ein BillingFlowParams-Objekt zu erstellen. Beachten Sie, dass Sie beim Erstellen des BillingFlowParams-Objekts das Angebot token für das vom Nutzer ausgewählte Angebot festlegen müssen. Wenn ein Nutzer für das Vorbesteller-Angebot infrage kommt, erhält er in der Methode queryProductDetailsAsync() ein Angebot mit PreorderDetails und offerId.

    Das folgende Beispiel zeigt, wie Sie den Abrechnungsvorgang starten:

    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);

    Das offerToken finden Sie in den OneTimePurchaseOfferDetails. Wenn Sie dem Nutzer das Angebot präsentieren, müssen Sie die Parameter für den Abrechnungsvorgang mit dem richtigen Angebotstoken konfigurieren. Dieses erhalten Sie über die Methode oneTimePurchaseOfferDetails.getOfferToken().

Rabattangebot

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

Es gibt vier verschiedene Parameter, die Sie in einem Rabattangebot für Einmalkaufprodukte konfigurieren können:

  • Preis des Rabattangebots: Gibt Details zum prozentualen oder absoluten Rabatt auf den Originalpreis an.

  • Länder oder Regionen, für die das Angebot gilt: Gibt die Verfügbarkeit von Angeboten für Einmalkaufprodukte in einem Land oder einer Region an.

  • Kauflimit (optional): Hiermit können Sie festlegen, wie oft ein Nutzer dasselbe Angebot einlösen kann. Wenn ein Nutzer das Kauflimit überschreitet, kommt er für das Angebot nicht infrage.

  • 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 Preis des Rabattangebots abrufen

Für ein Rabattangebot können Sie den prozentualen Rabatt oder den Gesamtrabatt abrufen.

Beispiel 1: Prozentualen Rabatt des Rabattangebots abrufen

Das folgende Beispiel zeigt, wie Sie den ursprünglichen Vollpreis und den prozentualen Rabatt des Rabattangebots abrufen. Beachten Sie, dass die Informationen zum prozentualen Rabatt nur für Rabattangebote zurückgegeben 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 percentageDiscount.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long percentageDiscount =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getPercentageDiscount();
            }
            // …
          }
        }
      }
    });
    
Beispiel 2: Gesamtrabatt des Rabattangebots abrufen

Das folgende Beispiel zeigt, wie Sie den ursprünglichen Vollpreis und den Gesamtrabatt des Rabattangebots in Mikros abrufen. Beachten Sie, dass die Informationen zum absoluten Rabatt in Mikros nur für Rabattangebote zurückgegeben werden. 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ültigen Zeitraum eines Angebots abrufen

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

Das folgende Beispiel zeigt, wie Sie den gültigen Zeitraum 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 Ebene des Rabattangebots

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

  1. „Super Screensavers“ hat zwei Angebote für das Produkt „Bildschirmschoner“: die Kaufoption „Bildschirmschoner“ und das Rabattangebot „Bildschirmschoner“.
    1. Für die Kaufoption „Bildschirmschoner“ ist keine begrenzte Menge eingerichtet.
    2. Für das Rabattangebot „Bildschirmschoner“ ist die maximal zulässige Menge auf Angebotsebene auf 3 festgelegt.
  2. Für das Produkt „Bildschirmschoner“ ist keine maximal zulässige Menge auf Produktebene festgelegt, sodass Nutzer unbegrenzt viele Einheiten dieses Produkts kaufen können.
  3. Der Nutzer besitzt einen Bildschirmschoner mit Rabatt und möchte einen weiteren mit dem Rabattangebot kaufen.
  4. Beim Abrufen der verfügbaren Angebote ist `LimitedQuantityInfo` für die Kaufoption „Bildschirmschoner“ null und die verbleibende Menge für das Rabattangebot „Bildschirmschoner“ ist 2.

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

Einlöselimit berechnen

Das folgende Beispiel zeigt, wie Sie die 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. Beachten Sie, dass die Funktion für die begrenzte Menge sowohl für Angebote für verbrauchbare als auch für nicht verbrauchbare Einmalkaufprodukte gilt. 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 subtrahiert wird. Bei der Berechnung der Menge, die der Nutzer besitzt, berücksichtigt Google Play verbrauchte oder ausstehende Käufe. Stornierte, erstattete oder zurückbelastete Käufe werden nicht in die Menge einbezogen, die der Nutzer besitzt. Beispiel:

  1. „Super Screensavers“ hat ein Rabattangebot mit einer maximal zulässigen Menge von einem eingerichtet, sodass Nutzer maximal einen Bildschirmschoner mit Rabatt kaufen können.

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

  3. Der Nutzer beantragt eine Erstattung für den ursprünglich gekauften Bildschirmschoner mit Rabatt und erhält die Erstattung. Der Nutzer versucht, einen der Bildschirmschoner mit Rabatt zu kaufen, und der Kauf ist erfolgreich.

Länder und Regionen, für die das Angebot gilt

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 des Nutzers anhand des Landes, das in Google Play festgelegt ist. 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 zurückgegeben werden, wenn Sie queryProductDetailsAsync() aufrufen.

Angebotstags

Das folgende Beispiel zeigt, wie Sie die Angebotstags abrufen, 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 Angebotstags

Sie können Angebotstags für Produkte, Kaufoptionen oder Rabattangebote festlegen. Rabattangebote erben die Angebotstags vom Angebot für die Kaufoption. Wenn Angebotstags auf Produktebene angegeben werden, erben sowohl das Angebot für die Kaufoption als auch die Rabattangebote die Angebotstags des Produkts.

„Super Screensavers“ hat beispielsweise zwei Angebote für das Produkt „Bildschirmschoner“: die Kaufoption „Bildschirmschoner“ und das Rabattangebot „Bildschirmschoner“.

  • „Super Screensavers“ hat das Produkt-Angebotstag SSProductTag.
  • Die Kaufoption „Bildschirmschoner“ hat das Angebotstag SSPurchaseOptionTag.
  • Das Rabattangebot „Bildschirmschoner“ hat das Angebotstag SSDiscountOfferTag.

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