Varias opciones de compra y ofertas para productos únicos

En este documento, se detalla la integración de tus productos únicos (OTP) con la Biblioteca de Facturación Play. Además, se explica cómo integrar varias opciones de compra y ofertas relacionadas con tus productos únicos.

Puedes configurar varias opciones de compra y ofertas para tus productos únicos. Por ejemplo, puedes configurar una opción de compra y una oferta de preventa para el mismo producto único.

Requisitos previos

Para configurar varias ofertas de productos únicos, debes usar la API de queryProductDetailsAsync(). La API de querySkuDetailsAsync() obsoleta no es compatible. Para obtener información sobre cómo usar queryProductDetailsAsync() y la versión de launchBillingFlow() que toma ProductDetailsParams como entrada, consulta los pasos de migración.

Cómo consultar los detalles del producto

Si configuraste varias ofertas o opciones de compra para tu producto único, el objeto ProductDetails que devuelve el método queryProductDetailsAsync() puede tener más de una opción de compra o alquiler disponible por producto único. Para obtener la lista de todas las ofertas aptas para cada objeto ProductDetails, usa el método getOneTimePurchaseOfferDetailsList(). Como parte de esta lista, solo se mostrarán las ofertas y las opciones de compra para las que el usuario reúne los requisitos. Tu código en el método onProductDetailsResponse() debe controlar las ofertas que se muestran.

Cómo iniciar el flujo de facturación

Para iniciar una solicitud de compra desde la app, llama al método launchBillingFlow() del subproceso principal de la app. Este método toma una referencia para un objeto BillingFlowParams que contiene el objeto ProductDetails relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear un objeto BillingFlowParams, usa la clase BillingFlowParams.Builder. Ten en cuenta que debes configurar el token de oferta correspondiente a la oferta que seleccionó el usuario cuando creas el objeto BillingFlowParams.

En el siguiente ejemplo, se muestra cómo iniciar el flujo de compra de un producto único con varias ofertas:

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

El offerToken se puede encontrar como parte de OneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del método oneTimePurchaseOfferDetails.getOfferToken().

Ofertas y opciones de compra

Una opción de compra te permite definir cómo se otorga el derecho a un usuario, su precio y en qué región está disponible el producto. Un solo producto puede tener varios tipos de opciones de compra, que pueden representar dónde y cómo se vende el producto.

Google Play admite las siguientes opciones de compra para productos únicos:

  • Comprar opción de compra
  • Opción de compra con alquiler

Las ofertas se refieren a un esquema de precios que puedes crear para tus productos únicos. Por ejemplo, puedes crear una oferta de descuento para tu producto único.

Google Play admite las siguientes ofertas de compra para productos únicos:

  • Oferta de pedido por adelantado (solo se admite para la opción de compra)
  • Oferta de descuento (se admite para las opciones de compra y alquiler)

Comprar opción de compra

Una opción de compra representa una compra directa y estándar del producto único. Tiene un campo opcional legacyCompatible, que indica si esta opción de compra estará disponible en flujos de la Biblioteca de Facturación Play (versión 7 o anterior) que no admiten el modelo nuevo. Para la retrocompatibilidad, al menos una opción de compra debe marcarse como compatible con versiones heredadas.

Los pasos para integrar las opciones de compra y alquiler con PBL son los mismos. Para comprender cómo integrar la opción de compra con PBL, consulta Cómo integrar la opción de compra con PBL.

Opción de compra con alquiler

La opción de compra de alquiler permite que los usuarios accedan a los productos únicos por un período determinado. Puedes especificar el período de alquiler y su vencimiento. En este documento, se describen los pasos para integrar la opción de compra de alquiler con la biblioteca de Facturación Play (PBL).

Integra la opción de compra de alquiler con PBL

En esta sección, se describe cómo integrar la opción de compra de alquiler con la Biblioteca de Facturación Play (PBL). Se da por sentado que conoces los pasos iniciales de integración de PBL, como agregar la dependencia de PBL a tu app, inicializar BillingClient y conectarte a Google Play. En esta sección, se enfocan los aspectos de integración de PBL específicos de la opción de compra con alquiler.

Para configurar los productos disponibles para alquilar, deberás usar el nuevo servicio monetization.onetimeproducts de la API de Play Developer o la IU de Play Console. Para usar el servicio, puedes llamar a la API de REST directamente o usar la biblioteca cliente de Java.

Cómo iniciar un flujo de compra para la opción de alquiler

Para iniciar un flujo de compra de una oferta de alquiler, sigue estos pasos:

  1. Recupera los metadatos de la opción de compra de alquiler con el método ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    En el siguiente ejemplo, se muestra cómo obtener los metadatos de la compra de alquiler:

    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. Inicia el flujo de facturación.

    Para iniciar una solicitud de compra desde la app, llama al método launchBillingFlow() del subproceso principal de la app. Este método toma una referencia para un objeto BillingFlowParams que contiene el objeto ProductDetails relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear un objeto BillingFlowParams, usa la clase BillingFlowParams.Builder. Ten en cuenta que debes configurar el token de oferta correspondiente a la oferta que seleccionó el usuario cuando creas el objeto BillingFlowParams. Si un usuario es apto para la opción de compra de alquiler, recibirá una oferta con RentalDetails y offerId en queryProductDetailsAsync().

    En el siguiente ejemplo, se muestra cómo iniciar el flujo de facturación:

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

    El offerToken se puede encontrar como parte de OneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de pedido por adelantado

El pedido por adelantado te permite configurar productos únicos que se comprarán antes de que se lance el artículo. Cuando un usuario realiza un pedido anticipado de tu producto, acepta pagarlo cuando se lance, a menos que cancele el pedido anticipado antes de la fecha de lanzamiento. En la fecha de lanzamiento, se le cobra al comprador y Play le notifica por correo electrónico que el artículo está disponible.

En este documento, se describen los pasos para integrar la oferta de compra por adelantado con la Biblioteca de Facturación Play (PBL).

Integra la oferta de pedido por adelantado con PBL

En esta sección, se describe cómo integrar la oferta de preventa con la biblioteca de Play Billing (PBL). Se da por sentado que conoces los pasos iniciales de integración de PBL, como agregar la dependencia de PBL a tu app, inicializar BillingClient y conectarte a Google Play. En esta sección, se enfocan los aspectos de integración de PBL específicos de la oferta de pedidos por adelantado.

Cómo iniciar un flujo de compra para una oferta de pedido anticipado

Para iniciar un flujo de compra para una oferta de pedido por adelantado, sigue estos pasos:

  1. Recupera los metadatos de la oferta de preventa con el método ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). En el siguiente ejemplo, se muestra cómo obtener los metadatos de la oferta de preventa:

    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. Inicia el flujo de facturación.

    Para iniciar una solicitud de compra desde la app, llama al método launchBillingFlow() del subproceso principal de la app. Este método toma una referencia para un objeto BillingFlowParams que contiene el objeto ProductDetails relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear un objeto BillingFlowParams, usa BillingFlowParams.Builder class. Ten en cuenta que debes configurar el token de oferta correspondiente a la oferta que seleccionó el usuario cuando creas el objeto BillingFlowParams. Si un usuario es apto para la oferta de preorden, recibirá una oferta con PreorderDetails y offerId en el método queryProductDetailsAsync().

    En el siguiente ejemplo, se muestra cómo iniciar el flujo de facturación:

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

    El offerToken se puede encontrar como parte de OneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de descuento

En esta sección, se describe cómo puedes configurar ofertas de descuento para tus productos únicos.

Hay cuatro parámetros diferentes que puedes configurar en una oferta de descuento de producto único:

  • Precio de la oferta con descuento: Especifica detalles sobre el porcentaje de descuento o el precio absoluto del precio original.

  • Elegibilidad por países o regiones: Especifica la disponibilidad de las ofertas de productos únicos en un país o una región.

  • Límite de compras (opcional): Te permite determinar cuántas veces un usuario puede canjear la misma oferta. Si un usuario supera el límite de compras, no será apto para la oferta.

  • Por tiempo limitado (opcional): Especifica el período en el que la oferta está disponible. Fuera del período, la oferta no es apta para la compra.

Cómo recuperar información del precio de la oferta con descuento

En el caso de una oferta con descuento, puedes recuperar el porcentaje de descuento o el descuento absoluto ofrecido.

Ejemplo 1: Cómo recuperar el porcentaje de descuento de la oferta con descuento

En el siguiente ejemplo, se muestra cómo obtener el precio completo original de la oferta con descuento y su porcentaje de descuento. Ten en cuenta que la información del descuento porcentual solo se muestra para las ofertas con descuento.

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();
            }
            // …
          }
        }
      }
    });
    
Ejemplo 2: Cómo recuperar el descuento absoluto de la oferta con descuento

En el siguiente ejemplo, se muestra cómo obtener el precio completo original de la oferta con descuento y su descuento absoluto en micros. Ten en cuenta que el descuento absoluto en la información de micros solo se muestra para las ofertas con descuento. Se debe especificar el descuento absoluto o el descuento porcentual para una oferta de descuento.

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

Cómo obtener el período válido de una oferta

Puedes usar el método OneTimePurchaseOfferDetails.getValidTimeWindow() para obtener el período válido de una oferta. Este objeto contiene la hora de inicio y la hora de finalización del período en milisegundos.

En el siguiente ejemplo, se muestra cómo obtener el período válido de una oferta:

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

Cantidad limitada a nivel de la oferta de descuento

Puedes especificar el límite de cantidad máxima a nivel de la oferta de descuento, que se aplica solo a nivel de la oferta. A continuación, se muestra un ejemplo:

  1. Super screensavers tiene 2 ofertas para el producto de protector de pantalla: protector de pantalla con opción de compra y protector de pantalla con descuento.
    1. El protector de pantalla de la opción de compra no tiene configurada una cantidad limitada.
    2. El protector de pantalla de descuento tiene la cantidad máxima permitida a nivel de la oferta establecida en 3.
  2. El producto de protector de pantalla no tiene una cantidad máxima permitida a nivel del producto, por lo que los usuarios pueden comprar cantidades ilimitadas de este producto.
  3. El usuario tiene 1 protector de pantalla con descuento y planea comprar otro con el protector de pantalla con descuento.
  4. Cuando se recuperan las ofertas disponibles, LimitedQuantityInfo para el protector de pantalla de la opción de compra es nulo y el valor de la cantidad restante para el protector de pantalla con descuento es 2.

En el siguiente ejemplo, se muestra cómo obtener la cantidad limitada a nivel de la oferta de descuento:

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

Cuando los usuarios agotan la cantidad máxima de canjes de una oferta, el método getOneTimePurchaseOfferDetailsList() no la muestra.

Cómo calcular el límite de canje

En el siguiente ejemplo, se muestra cómo obtener la información de cantidad limitada de una oferta de descuento determinada. Puedes obtener la cantidad máxima permitida y la cantidad restante para el usuario actual. Ten en cuenta que la función de cantidad limitada se aplica a las ofertas de productos únicos consumibles y no consumibles. Esta función solo se admite a nivel de la oferta.

Google Play calcula la cantidad restante restando la cantidad que posee el usuario de la cantidad máxima permitida que configuraste. Cuando se cuenta la cantidad que posee el usuario, Google Play considera las compras consumidas o pendientes. Las compras que se cancelaron, reembolsaron o para las que se generó una devolución del cargo no se consideran en la cantidad que posee el usuario. Por ejemplo:

  1. Los super protectores de pantalla establecen una oferta de descuento con la cantidad máxima permitida de uno, de modo que los usuarios puedan comprar hasta un protector de pantalla con descuento.

  2. El usuario compra uno de los protectores de pantalla con descuento. Si el usuario intenta comprar el segundo protector de pantalla con descuento, se producirá un error y PurchasesUpdatedListener recibirá un código de respuesta ITEM_UNAVAILABLE.

  3. El usuario solicita un reembolso del protector de pantalla con descuento que compró originalmente y recibe el reembolso correctamente. El usuario intenta comprar uno de los protectores de pantalla con descuento, y la compra se realiza correctamente.

Elegibilidad por país y región

Puedes elegir los países o regiones en los que la oferta de la opción de compra o la oferta de descuento estarán disponibles para los usuarios. Google Play evaluará la elegibilidad de los usuarios según el país de Play. Cuando configuras la disponibilidad regional de una oferta, esta solo se muestra como parte de getOneTimePurchaseOfferDetailsList() si el usuario se encuentra en un país o región objetivo; de lo contrario, no formará parte de la lista de ofertas que se muestra cuando llamas a queryProductDetailsAsync().

Etiquetas de oferta

En el siguiente ejemplo, se muestra cómo recuperar las etiquetas de oferta asociadas con una oferta.

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

Herencia de etiquetas de oferta

Puedes establecer etiquetas de oferta para productos, opciones de compra o ofertas de descuento. Las ofertas con descuento heredan las etiquetas de oferta de su oferta de opción de compra. Del mismo modo, si se especifican etiquetas de oferta a nivel del producto, tanto la oferta de opción de compra como las ofertas de descuento heredan las etiquetas de oferta del producto.

Por ejemplo, Super screensavers tiene dos ofertas para el producto protector de pantalla: un protector de pantalla con opción de compra y un protector de pantalla con descuento.

  • Super protector de pantalla tiene la etiqueta de oferta del producto SSProductTag.
  • El protector de pantalla de la opción de compra tiene la etiqueta de oferta SSPurchaseOptionTag.
  • El protector de pantalla de descuento tiene la etiqueta de oferta SSDiscountOfferTag.

En este ejemplo, el método oneTimePurchaseOfferDetails.getOfferTagsList() para la oferta de opción de compra muestra SSProductTag y SSPurchaseOptionTag. Para la oferta de descuento, el método muestra SSProductTag, SSPurchaseOptionTag y SSDiscountOfferTag.