Plusieurs options et offres d'achat pour les produits uniques

Ce document détaille l'intégration de vos produits ponctuels (OTP) à la bibliothèque Play Billing. Il explique également comment intégrer différentes options d'achat et offres liées à vos produits ponctuels.

Vous pouvez configurer plusieurs options et offres d'achat pour vos produits à usage unique. Par exemple, vous pouvez configurer une option d'achat et une offre de précommande pour le même produit à achat unique.

Prérequis

Pour configurer plusieurs offres pour des produits ponctuels, vous devez utiliser l'API queryProductDetailsAsync(). L'API querySkuDetailsAsync() obsolète n'est pas compatible. Pour savoir comment utiliser queryProductDetailsAsync() et la version de launchBillingFlow() qui utilise ProductDetailsParams comme entrée, consultez la section Étapes de migration.

Interroger les informations détaillées sur le produit

Si vous avez configuré plusieurs offres ou options d'achat pour votre produit à achat unique, l'objet ProductDetails renvoyé par la méthode queryProductDetailsAsync() peut comporter plusieurs options d'achat et/ou de location disponibles par produit à achat unique. Pour obtenir la liste de toutes les offres éligibles pour chaque objet ProductDetails, utilisez la méthode getOneTimePurchaseOfferDetailsList(). Seules les offres et les options d'achat pour lesquelles l'utilisateur est éligible sont renvoyées dans cette liste. Votre code dans la méthode onProductDetailsResponse() doit gérer les offres renvoyées.

Lancer le parcours de facturation

Pour démarrer une demande d'achat depuis votre application, appelez la méthode launchBillingFlow() à partir du thread principal de votre application. Cette méthode transmet une référence à un objet BillingFlowParams contenant l'objet ProductDetails approprié obtenu lors de l'appel de queryProductDetailsAsync(). Pour créer un objet BillingFlowParams, utilisez la classe BillingFlowParams.Builder. Notez que vous devez définir le jeton d'offre correspondant à l'offre sélectionnée par l'utilisateur lors de la création de l'objet BillingFlowParams.

L'exemple suivant montre comment lancer le parcours d'achat d'un produit unique avec plusieurs offres :

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

Le offerToken se trouve dans le OneTimePurchaseOfferDetails. Lorsque vous présentez l'offre à l'utilisateur, veillez à configurer les paramètres du flux de facturation avec le jeton d'offre approprié, que vous pouvez obtenir à partir de la méthode oneTimePurchaseOfferDetails.getOfferToken().

Options d'achat et offres

Une option d'achat vous permet de définir comment le droit d'accès est accordé à un utilisateur, son prix et la région dans laquelle le produit est disponible. Un même produit peut être associé à plusieurs options d'achat, qui peuvent indiquer où et comment vous vendez votre produit.

Google Play accepte les options d'achat suivantes pour les produits ponctuels :

  • Option d'achat "Acheter"
  • Option d'achat en location

Les offres font référence à un système de tarification que vous pouvez créer pour vos produits uniques. Par exemple, vous pouvez créer une offre de remise pour votre produit à usage unique.

Google Play accepte les offres d'achat suivantes pour les produits à usage unique :

  • Offre de précommande (uniquement disponible pour l'option d'achat)
  • Offre de remise (compatible avec les options d'achat et de location)

Option d'achat "Acheter"

Une option d'achat représente un achat standard et direct du produit ponctuel. Il comporte un champ facultatif "legacyCompatible", qui indique si cette option d'achat sera disponible dans les anciens flux de la bibliothèque Play Billing (version 7 ou antérieure) qui ne sont pas compatibles avec le nouveau modèle. Pour la rétrocompatibilité, au moins une option d'achat doit être marquée comme rétrocompatible.

La procédure d'intégration des options d'achat et de location avec PBL est la même. Pour savoir comment intégrer l'option d'achat avec PBL, consultez la section Intégrer l'option d'achat avec PBL.

Option d'achat en location

L'option d'achat en location permet aux utilisateurs d'accéder aux produits ponctuels pendant une durée spécifiée. Vous pouvez spécifier la période de location et son expiration. Ce document décrit la procédure à suivre pour intégrer l'option d'achat de location à la bibliothèque Play Billing (PBL).

Intégrer l'option d'achat en location avec PBL

Cette section explique comment intégrer l'option d'achat de location à la bibliothèque Play Billing (PBL). Il suppose que vous connaissez les étapes d'intégration initiales de PBL, telles que l'ajout de la dépendance PBL à votre application, l'initialisation du BillingClient et la connexion à Google Play. Cette section se concentre sur les aspects d'intégration de PBL spécifiques à l'option d'achat en location.

Pour configurer les produits disponibles à la location, vous devez utiliser le nouveau service monetization.onetimeproducts de l'API Play Developer ou l'interface utilisateur de la Play Console. Pour utiliser le service, vous pouvez appeler directement l'API REST ou utiliser la bibliothèque cliente Java.

Lancer un parcours d'achat pour l'option de location

Pour lancer un parcours d'achat pour une offre de location, procédez comme suit :

  1. Récupérez les métadonnées de l'option d'achat en location à l'aide de la méthode ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    L'exemple suivant montre comment obtenir les métadonnées d'achat de location :

    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. Lancez le parcours de facturation.

    Pour démarrer une demande d'achat depuis votre application, appelez la méthode launchBillingFlow() à partir du thread principal de votre application. Cette méthode transmet une référence à un objet BillingFlowParams contenant l'objet ProductDetails approprié obtenu lors de l'appel de queryProductDetailsAsync(). Pour créer un objet BillingFlowParams, utilisez la classe BillingFlowParams.Builder. Notez que vous devez définir le jeton d'offre correspondant à l'offre sélectionnée par l'utilisateur lors de la création de l'objet BillingFlowParams. Si un utilisateur est éligible à l'option d'achat en location, il recevra une offre avec RentalDetails et offerId dans queryProductDetailsAsync().

    L'exemple suivant montre comment lancer le flux de facturation :

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

    Le offerToken se trouve dans le OneTimePurchaseOfferDetails. Lorsque vous présentez l'offre à l'utilisateur, veillez à configurer les paramètres du flux de facturation avec le jeton d'offre approprié, que vous pouvez obtenir à partir de la méthode oneTimePurchaseOfferDetails.getOfferToken().

Offre de précommande

La précommande vous permet de configurer des produits uniques à acheter avant la sortie de l'article. Lorsqu'un utilisateur précommande votre produit, il accepte de le payer à sa sortie, sauf s'il annule la précommande avant la date de sortie. Le jour de la sortie, l'acheteur est débité et Play l'informe par e-mail que l'article est disponible.

Ce document décrit la procédure à suivre pour intégrer l'offre d'achat en précommande à la bibliothèque Play Billing (PBL).

Intégrer une offre de précommande avec PBL

Cette section explique comment intégrer l'offre de précommande à la bibliothèque Play Billing (PBL). Il suppose que vous connaissez les étapes d'intégration initiales de PBL, telles que l'ajout de la dépendance PBL à votre application, l'initialisation du BillingClient et la connexion à Google Play. Cette section se concentre sur les aspects d'intégration de la PBL spécifiques à l'offre de précommande.

Lancer un parcours d'achat pour une offre de précommande

Pour lancer un parcours d'achat pour une offre de précommande, procédez comme suit :

  1. Récupérez les métadonnées de l'offre de précommande à l'aide de la méthode ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). L'exemple suivant montre comment obtenir les métadonnées de l'offre de précommande :

    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. Lancez le parcours de facturation.

    Pour démarrer une demande d'achat depuis votre application, appelez la méthode launchBillingFlow() à partir du thread principal de votre application. Cette méthode transmet une référence à un objet BillingFlowParams contenant l'objet ProductDetails approprié obtenu lors de l'appel de queryProductDetailsAsync(). Pour créer un objet BillingFlowParams, utilisez BillingFlowParams.Builder class. Notez que vous devez définir le jeton d'offre correspondant à l'offre sélectionnée par l'utilisateur lors de la création de l'objet BillingFlowParams. Si un utilisateur est éligible à l'offre de précommande, il recevra une offre avec PreorderDetails et offerId dans la méthode queryProductDetailsAsync().

    L'exemple suivant montre comment lancer le flux de facturation :

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

    Le offerToken se trouve dans le OneTimePurchaseOfferDetails. Lorsque vous présentez l'offre à l'utilisateur, veillez à configurer les paramètres du flux de facturation avec le jeton d'offre approprié, que vous pouvez obtenir à partir de la méthode oneTimePurchaseOfferDetails.getOfferToken().

Offre de remise

Cette section explique comment configurer des offres de remise pour vos produits uniques.

Vous pouvez configurer quatre paramètres différents dans une offre de remise unique sur un produit :

  • Prix de l'offre avec remise : spécifie le pourcentage de remise ou le prix absolu par rapport au prix d'origine.

  • Éligibilité par pays ou région : indique la disponibilité des offres de produits ponctuels dans un pays ou une région.

  • Limite d'achat (facultatif) : vous permet de déterminer le nombre de fois où un utilisateur peut utiliser la même offre. Si un utilisateur dépasse la limite d'achats, il ne peut pas bénéficier de l'offre.

  • Durée limitée (facultatif) : spécifie la période pendant laquelle l'offre est disponible. En dehors de cette période, l'offre n'est pas éligible à l'achat.

Récupérer les informations sur le prix de l'offre réduite

Pour une offre avec remise, vous pouvez récupérer le pourcentage de remise ou la remise absolue proposée.

Exemple 1 : Récupérer le pourcentage de remise de l'offre avec remise

L'exemple suivant montre comment obtenir le prix d'origine et le pourcentage de remise de l'offre avec remise. Notez que les informations sur le pourcentage de remise ne sont renvoyées que pour les offres avec remise.

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();
            }
            // …
          }
        }
      }
    });
    
Exemple 2 : Récupérer la remise absolue de l'offre avec remise

L'exemple suivant montre comment obtenir le prix d'origine de l'offre avec remise et sa remise absolue en micros. Notez que la remise absolue dans les informations micros n'est renvoyée que pour les offres avec remise. Vous devez spécifier la remise absolue ou le pourcentage de remise pour une offre de remise.

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();
            }
            // …
          }
        }
      }
    });
    

Obtenir la période de validité d'une offre

Vous pouvez utiliser la méthode OneTimePurchaseOfferDetails.getValidTimeWindow() pour obtenir la période de validité d'une offre. Cet objet contient l'heure de début et de fin de la période en millisecondes.

L'exemple suivant montre comment obtenir la période de validité d'une offre :

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();
              // …
            }
          }
        }
      }
    });
    

Quantité limitée au niveau de l'offre de remise

Vous pouvez spécifier la limite de quantité maximale au niveau de l'offre de remise, qui ne s'applique qu'au niveau de l'offre. Voici un exemple pour illustrer :

  1. Super Screensavers propose deux offres pour le produit de fond d'écran : un fond d'écran avec option d'achat et un fond d'écran avec remise.
    1. Aucune quantité limitée n'est définie pour le fond d'écran des options d'achat.
    2. La quantité maximale autorisée au niveau de l'offre est définie sur trois pour l'écran de veille de la remise.
  2. Le produit d'économiseur d'écran n'a pas de quantité maximale autorisée au niveau du produit. Les utilisateurs peuvent donc acheter des quantités illimitées de ce produit.
  3. L'utilisateur possède un économiseur d'écran avec remise et prévoit d'en acheter un autre avec l'économiseur d'écran avec remise.
  4. Lors de la récupération des offres disponibles, la valeur LimitedQuantityInfo pour le fond d'écran de l'option d'achat est nulle et la valeur de la quantité restante pour le fond d'écran de la remise est 2.

L'exemple suivant montre comment obtenir la quantité limitée au niveau de l'offre de remise :

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();
              // …
            }
          }
        }
      }
    });
    

Lorsque les utilisateurs ont utilisé la quantité maximale d'offres pour une offre, celle-ci n'est pas renvoyée par la méthode getOneTimePurchaseOfferDetailsList().

Calculer la limite d'utilisation

L'exemple suivant montre comment obtenir les informations sur la quantité limitée d'une certaine offre de remise. Vous pouvez obtenir la quantité maximale autorisée et la quantité restante pour l'utilisateur actuel. Notez que la fonctionnalité de quantité limitée s'applique aux offres de produits uniques consommables et non consommables. Cette fonctionnalité n'est disponible qu'au niveau de l'offre.

Google Play calcule la quantité restante en soustrayant la quantité détenue par l'utilisateur de la quantité maximale autorisée que vous avez définie. Lorsque Google Play comptabilise la quantité détenue par l'utilisateur, il tient compte des achats consommés ou en attente. Les achats annulés, remboursés ou rejetés ne sont pas comptabilisés dans la quantité détenue par l'utilisateur. Exemple :

  1. Les super économiseurs d'écran configurent une offre de remise avec une quantité maximale autorisée de 1. Les utilisateurs peuvent donc acheter jusqu'à un économiseur d'écran à prix réduit.

  2. L'utilisateur achète l'un des économiseurs d'écran à prix réduit. Si l'utilisateur tente ensuite d'acheter le deuxième écran de veille à prix réduit, une erreur se produira et PurchasesUpdatedListener recevra un code de réponse ITEM_UNAVAILABLE.

  3. L'utilisateur demande le remboursement de l'économiseur d'écran acheté à prix réduit et reçoit le remboursement. L'utilisateur tente d'acheter l'un des écrans de veille à prix réduit, et l'achat aboutit.

Éligibilité par pays et région

Vous pouvez choisir les pays ou régions dans lesquels l'offre d'option d'achat ou de remise sera disponible pour les utilisateurs. Google Play évaluera l'éligibilité des utilisateurs en fonction du pays Play. Lorsque vous configurez la disponibilité régionale d'une offre, elle n'est renvoyée dans getOneTimePurchaseOfferDetailsList() que si l'utilisateur se trouve dans un pays ou une région ciblés. Sinon, elle ne figure pas dans la liste des offres renvoyées lorsque vous appelez queryProductDetailsAsync().

Tags d'offre

L'exemple suivant montre comment récupérer les balises d'offre associées à une offre.

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();
            // …
          }
        }
      }
    });
    
    

Héritage des tags d'offre

Vous pouvez définir des tags d'offre pour un produit, une option d'achat ou une offre de remise. Les offres de remise héritent des tags d'offre de l'offre d'option d'achat. De même, si des balises d'offre sont spécifiées au niveau du produit, les offres d'option d'achat et les offres de remise héritent des balises d'offre du produit.

Par exemple, Super Screensavers propose deux offres pour le produit de fond d'écran : un fond d'écran avec option d'achat et un fond d'écran avec remise.

  • Super Screensaver est associé à la balise d'offre de produit SSProductTag.
  • L'écran de veille de l'option d'achat comporte la balise d'offre SSPurchaseOptionTag.
  • L'économiseur d'écran de remise comporte la balise d'offre SSDiscountOfferTag.

Dans cet exemple, la méthode oneTimePurchaseOfferDetails.getOfferTagsList() de l'offre d'option d'achat renvoie SSProductTag et SSPurchaseOptionTag. Pour l'offre de remise, la méthode renvoie SSProductTag, SSPurchaseOptionTag et SSDiscountOfferTag.