Várias opções de compra e ofertas para produtos únicos

Este documento detalha a integração dos seus produtos únicos (OTPs, na sigla em inglês) com a Biblioteca Play Faturamento. Ele também explica como integrar várias opções de compra e ofertas relacionadas aos seus produtos únicos.

É possível configurar várias opções de compra e ofertas para seus produtos únicos. Por exemplo, você pode configurar uma opção de compra e uma oferta de pré-encomenda para o mesmo produto único.

Pré-requisitos

Para configurar várias ofertas de produtos únicos, use a queryProductDetailsAsync() API. A API querySkuDetailsAsync() obsoleta não tem suporte. Para informações sobre como usar queryProductDetailsAsync() e a versão de launchBillingFlow() que usa ProductDetailsParams como entrada, consulte as etapas de migração.

Consultar os detalhes do produto

Se você configurou várias ofertas ou opções de compra para seu produto único, o ProductDetails retornado pelo queryProductDetailsAsync() pode ter mais de uma opção de compra disponível e (ou) de aluguel por produto único. Para receber a lista de todas as ofertas qualificadas para cada ProductDetails objeto, use o getOneTimePurchaseOfferDetailsList() método. Somente as ofertas e opções de compra para as quais o usuário se qualifica serão retornadas como parte dessa lista. Seu código no onProductDetailsResponse() método precisa processar as ofertas retornadas.

Iniciar o fluxo de faturamento

Para iniciar um pedido de aprovação de compra no seu app, chame o launchBillingFlow() método na linha de execução principal do app. Esse método usa uma referência a um BillingFlowParams objeto que contém o objeto ProductDetails relevante recebido ao chamar queryProductDetailsAsync(). Para criar um BillingFlowParams objeto, use a BillingFlowParams.Builder classe. Defina o token de oferta correspondente à oferta selecionada pelo usuário ao criar o BillingFlowParams objeto.

O exemplo a seguir mostra como iniciar o fluxo de compra de um produto único com várias 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 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);
    
    

O offerToken pode ser encontrado como parte do OneTimePurchaseOfferDetails. Ao mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento com o token de oferta correto, que pode ser acessado pelo método oneTimePurchaseOfferDetails.getOfferToken().

Opções de compra e ofertas

Uma opção de compra permite definir como o direito de acesso é concedido a um usuário, o preço e em qual região o produto está disponível. Um único produto pode ter várias opções de compra, que podem representar onde e como você vende o produto.

O Google Play oferece suporte às seguintes opções de compra para produtos únicos:

  • Opção de compra
  • Opção de compra "Alugar"

As ofertas se referem a um esquema de preços que você pode criar para seus produtos únicos. Por exemplo, você pode criar uma oferta de desconto para seu produto único.

O Google Play oferece suporte às seguintes ofertas de compra para produtos únicos:

  • Oferta de pré-encomenda (com suporte apenas para a opção de compra)
  • Oferta de desconto (com suporte para as opções de compra e aluguel)

Opção de compra

Uma opção de compra representa uma compra padrão e direta do produto único. Ela tem um campo legacyCompatible opcional, que indica se essa opção de compra estará disponível em fluxos mais antigos da Biblioteca Play Faturamento (versão 7 ou mais antiga) que não oferecem suporte ao novo modelo. Para compatibilidade com versões anteriores, pelo menos uma opção de compra precisa ser marcada como compatível com versões anteriores.

As etapas para integrar as opções de compra e aluguel com a PBL são as mesmas. Para entender como integrar a opção de compra com a PBL, consulte Integrar a opção de compra de aluguel com a PBL.

Opção de compra "Alugar"

A opção de compra de aluguel permite que os usuários acessem os produtos únicos por um período especificado. É possível especificar o período de locação e a expiração dele. Este documento descreve as etapas para integrar a opção de compra de aluguel com a Biblioteca Play Faturamento (PBL).

Integrar a opção de compra de aluguel com a PBL

Esta seção descreve como integrar a opção de compra de aluguel com a Biblioteca Play Faturamento (PBL). Ela pressupõe que você esteja familiarizado com as etapas iniciais de integração da PBL , como adicionar a dependência da PBL ao seu app, inicializar o BillingClient e se conectar ao Google Play. Esta seção se concentra nos aspectos de integração da PBL que são específicos da opção de compra de aluguel.

Para configurar produtos disponíveis para aluguel, use o novo serviço monetization.onetimeproducts da API Google Play Developer ou a interface do console do Google Play. Para usar o serviço, chame a API REST diretamente ou use a biblioteca de cliente Java.

Iniciar um fluxo de compra para a opção de aluguel

Para iniciar um fluxo de compra de uma oferta de aluguel, siga estas etapas:

  1. Busque os metadados da opção de compra de aluguel usando o ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() método.

    O exemplo a seguir mostra como receber os metadados de compra de aluguel:

    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. Inicie o fluxo de faturamento.

    Para iniciar um pedido de aprovação de compra no seu app, chame o launchBillingFlow() método na linha de execução principal do app. Esse método usa uma referência a um BillingFlowParams objeto que contém o objeto ProductDetails relevante recebido ao chamar queryProductDetailsAsync(). Para criar um BillingFlowParams objeto, use a BillingFlowParams.Builder classe. Defina o token de oferta correspondente à oferta selecionada pelo usuário ao criar o BillingFlowParams objeto. Se um usuário se qualificar para a opção de compra de aluguel, ele vai receber uma oferta com RentalDetails e offerId em queryProductDetailsAsync().

    O exemplo a seguir mostra como iniciar o fluxo de faturamento:

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

    O offerToken pode ser encontrado como parte do OneTimePurchaseOfferDetails. Ao mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento com o token de oferta correto, que pode ser acessado pelo método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de pré-encomenda

A pré-encomenda permite configurar produtos únicos para serem comprados antes do lançamento do item. Quando um usuário faz a pré-encomenda do seu produto, ele concorda em pagar pelo item quando o produto for lançado, a menos que ele cancele a pré-encomenda antes da data de lançamento. Na data de lançamento, o comprador recebe uma cobrança e uma notificação por e-mail do Google Play avisando que o item está disponível.

Este documento descreve as etapas para integrar a oferta de compra na pré-encomenda com a Biblioteca Play Faturamento (PBL).

Integrar a oferta de pré-encomenda com a PBL

Esta seção descreve como integrar a oferta de pré-encomenda com a Biblioteca Play Faturamento (PBL). Ela pressupõe que você esteja familiarizado com as etapas iniciais de integração da PBL , como adicionar a dependência da PBL ao seu app, inicializar o BillingClient e se conectar ao Google Play. Esta seção se concentra nos aspectos de integração da PBL que são específicos da oferta de pré-encomenda.

Iniciar um fluxo de compra para uma oferta de pré-encomenda

Para iniciar um fluxo de compra de uma oferta de pré-encomenda, siga estas etapas:

  1. Busque os metadados da oferta de pré-encomenda usando o ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() método. O exemplo a seguir mostra como receber os metadados da oferta de pré-encomenda:

    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. Inicie o fluxo de faturamento.

    Para iniciar um pedido de aprovação de compra no seu app, chame o método launchBillingFlow() na linha de execução principal do app. Esse método usa uma referência a um BillingFlowParams objeto que contém o ProductDetails objeto relevante recebido ao chamar queryProductDetailsAsync(). Para criar um objeto BillingFlowParams, use a BillingFlowParams.Builder class. Defina o token de oferta correspondente à oferta selecionada pelo usuário ao criar o BillingFlowParams objeto. Se um usuário se qualificar para a oferta de pré-encomenda, ele vai receber uma oferta com PreorderDetails e offerId no método queryProductDetailsAsync().

    O exemplo a seguir mostra como iniciar o fluxo de faturamento:

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

    O offerToken pode ser encontrado como parte do OneTimePurchaseOfferDetails. Ao mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento com o token de oferta correto, que pode ser acessado pelo método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de desconto

Esta seção descreve como configurar ofertas de desconto para seus produtos únicos.

Há quatro parâmetros diferentes que podem ser configurados em uma oferta de desconto de produto único:

  • Preço da oferta com desconto: especifica detalhes sobre a porcentagem de desconto ou o preço absoluto do preço original.

  • Qualificação de países ou regiões: especifica a disponibilidade de ofertas de produtos únicos em um país ou região.

  • Limite de compra (opcional): permite determinar quantas vezes um usuário pode resgatar a mesma oferta. Se um usuário exceder o limite de compra, ele não poderá receber a oferta.

  • Tempo limitado (opcional): especifica o período em que a oferta está disponível. Fora do período, a oferta não está qualificada para compra.

Recuperar informações de preço da oferta com desconto

Para uma oferta com desconto, é possível recuperar a porcentagem de desconto ou o desconto absoluto oferecido.

Exemplo 1: recuperar a porcentagem de desconto da oferta

O exemplo a seguir mostra como receber o preço total original da oferta com desconto e a porcentagem de desconto. As informações de porcentagem de desconto só são retornadas para ofertas com desconto.

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();
            }
            // …
          }
        }
      }
    });
    
Exemplo 2: recuperar o desconto absoluto da oferta

O exemplo a seguir mostra como receber o preço total original da oferta com desconto e o desconto absoluto em micros. As informações de desconto absoluto em micros só são retornadas para ofertas com desconto. O desconto absoluto ou a porcentagem de desconto precisam ser especificados para uma oferta de desconto.

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

Receber o período válido de uma oferta

É possível usar o método OneTimePurchaseOfferDetails.getValidTimeWindow() para receber o período válido de uma oferta. Esse objeto contém o horário de início e término do período em milissegundos.

O exemplo a seguir mostra como receber o período válido de uma 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();
              // …
            }
          }
        }
      }
    });
    

Quantidade limitada no nível da oferta de desconto

É possível especificar o limite máximo de quantidade no nível da oferta de desconto, que é aplicado apenas no nível da oferta. Confira um exemplo para ilustrar:

  1. O Super screensavers tem duas ofertas para o produto de protetor de tela: protetor de tela de opção de compra e protetor de tela de desconto.
    1. O protetor de tela de opção de compra não tem uma quantidade limitada definida.
    2. O protetor de tela de desconto tem a quantidade máxima permitida no nível da oferta definida como 3.
  2. O produto de protetor de tela não tem a quantidade máxima permitida no nível do produto, então os usuários podem comprar quantidades ilimitadas desse produto.
  3. O usuário tem um protetor de tela de desconto e planeja comprar outro com o protetor de tela de desconto.
  4. Ao recuperar as ofertas disponíveis, o LimitedQuantityInfo do protetor de tela de opção de compra é nulo, e o valor da quantidade restante do protetor de tela de desconto é 2.

O exemplo a seguir mostra como receber a quantidade limitada no nível da oferta de desconto:

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

Quando os usuários usam o número máximo de resgates de uma oferta, ela não é retornada pelo método getOneTimePurchaseOfferDetailsList().

Calcular o limite de resgate

O exemplo a seguir mostra como receber as informações de quantidade limitada em uma determinada oferta de desconto. É possível receber a quantidade máxima permitida e a quantidade restante para o usuário atual. Observação: o recurso de quantidade limitada é aplicável às ofertas de produtos únicos consumíveis e não consumíveis. Esse recurso tem suporte apenas no nível da oferta.

O Google Play calcula a quantidade restante subtraindo a quantidade de propriedade do usuário da quantidade máxima permitida que você configurou. Ao contar a quantidade de propriedade do usuário, o Google Play considera compras consumidas ou pendentes. Compras canceladas, reembolsadas ou estornadas não são consideradas na quantidade de propriedade do usuário. Exemplo:

  1. O Super screensavers configurou uma oferta de desconto com a quantidade máxima permitida de um, para que os usuários possam comprar até um protetor de tela com desconto.

  2. O usuário compra um dos protetores de tela com desconto. Se o usuário tentar comprar o segundo protetor de tela com desconto, ocorrerá um erro e o PurchasesUpdatedListener vai receber um código de resposta ITEM_UNAVAILABLE.

  3. O usuário pede um reembolso do protetor de tela com desconto comprado originalmente e recebe o reembolso. O usuário tenta comprar um dos protetores de tela com desconto, e a compra será bem-sucedida.

Qualificação de país e região

É possível escolher os países ou regiões em que a oferta de opção de compra ou a oferta de desconto estará disponível para os usuários. O Google Play vai avaliar a qualificação do usuário com base no país do Google Play. Ao configurar a disponibilidade regional de uma oferta, ela só será retornada como parte de getOneTimePurchaseOfferDetailsList() se o usuário estiver em um país ou região segmentado. Caso contrário, ela não fará parte da lista de ofertas retornadas quando você chamar queryProductDetailsAsync().

Tags de oferta

O exemplo a seguir mostra como recuperar as tags de oferta associadas a uma 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();
            // …
          }
        }
      }
    });
    
    

Herança de tags de oferta

É possível definir tags de oferta para produtos, opções de compra ou ofertas de desconto. As ofertas de desconto herdam as tags de oferta da opção de compra. Da mesma forma, se as tags de oferta forem especificadas no nível do produto, a opção de compra e as ofertas de desconto herdarão as tags de oferta do produto.

Por exemplo, o Super screensavers tem duas ofertas para o produto de protetor de tela: protetor de tela de opção de compra e protetor de tela de desconto.

  • O Super screensaver tem a tag de oferta de produto SSProductTag.
  • O protetor de tela de opção de compra tem a tag de oferta SSPurchaseOptionTag.
  • O protetor de tela de desconto tem a tag de oferta SSDiscountOfferTag.

Neste exemplo, o método oneTimePurchaseOfferDetails.getOfferTagsList() para a oferta de opção de compra retorna SSProductTag e SSPurchaseOptionTag. Para a oferta de desconto, o método retorna SSProductTag, SSPurchaseOptionTag e SSDiscountOfferTag.