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é-venda para o mesmo produto único.

Pré-requisitos

Para configurar várias ofertas de produtos únicos, use a API queryProductDetailsAsync(). A API querySkuDetailsAsync() descontinuada não é compatível. Para informações sobre como usar queryProductDetailsAsync() e a versão de launchBillingFlow() que usa ProductDetailsParams como entrada, consulte 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 objeto ProductDetails retornado pelo método queryProductDetailsAsync() pode ter mais de uma opção de compra e/ou aluguel disponível por produto único. Para receber a lista de todas as ofertas qualificadas para cada objeto ProductDetails, use o método getOneTimePurchaseOfferDetailsList(). Somente ofertas e opções de compra para as quais o usuário está qualificado serão retornadas como parte dessa lista. O código no método onProductDetailsResponse() precisa processar as ofertas retornadas.

Iniciar 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 objeto BillingFlowParams que contém o objeto ProductDetails relevante recebido ao chamar queryProductDetailsAsync(). Para criar um objeto BillingFlowParams, use a classe BillingFlowParams.Builder. Defina o token da oferta correspondente à oferta selecionada pelo usuário ao criar o objeto BillingFlowParams.

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

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 correto, que pode ser obtido com o método oneTimePurchaseOfferDetails.getOfferToken().

Opções de compra e ofertas

Com uma opção de compra, você define como o direito é concedido a um usuário, o preço dele 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 seu produto.

O Google Play é compatível com as seguintes opções de compra para produtos de aquisição única:

  • Comprar opção de compra
  • Opção de compra de aluguel

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 é compatível com as seguintes ofertas de compra para produtos de aquisição única:

  • Oferta de compra na pré-venda (compatível apenas com a opção de compra)
  • Oferta de desconto (compatível com as opções de compra e aluguel)

Comprar opção de compra

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

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

Opção de compra de aluguel

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 à Biblioteca Play Faturamento (PBL, na sigla em inglês).

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

Esta seção descreve como integrar a opção de compra de aluguel à Biblioteca Play Faturamento (PBL, na sigla em inglês). Ele pressupõe que você conhece as etapas iniciais de integração da PBL, como adicionar a dependência da PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos de integração da PBL 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 Play Developer ou a interface do Play Developer Console. 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 locação

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

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

    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 método launchBillingFlow() na linha de execução principal do app. Esse método usa uma referência a um objeto BillingFlowParams que contém o objeto ProductDetails relevante recebido ao chamar queryProductDetailsAsync(). Para criar um objeto BillingFlowParams, use a classe BillingFlowParams.Builder. Defina o token da oferta correspondente à oferta selecionada pelo usuário ao criar o objeto BillingFlowParams. 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.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);

    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 correto, que pode ser obtido com o método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de compra na pré-venda

Com a pré-venda, é possível configurar produtos únicos para serem comprados antes do lançamento. Quando um usuário faz uma compra na pré-venda, ele concorda em pagar pelo item quando o produto for lançado, a menos que cancele a compra antes da data de lançamento. Na data de lançamento, o comprador recebe a cobrança, e o Google Play envia uma notificação por e-mail informando que o item foi lançado.

Este documento descreve as etapas para integrar a oferta de compra em pré-venda à Biblioteca Play Faturamento (PBL).

Integrar a oferta de compra na pré-venda com o PBL

Esta seção descreve como integrar a oferta de pré-venda à Biblioteca Play Faturamento (PBL, na sigla em inglês). Ele pressupõe que você conhece as etapas iniciais de integração da PBL, como adicionar a dependência da PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos da integração do PBL que são específicos da oferta de compra na pré-venda.

Iniciar um fluxo de compra para uma oferta de compra na pré-venda

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

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

    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 objeto BillingFlowParams que contém o objeto ProductDetails relevante recebido ao chamar queryProductDetailsAsync(). Para criar um objeto BillingFlowParams, use o BillingFlowParams.Builder class. Defina o token da oferta correspondente à opção selecionada pelo usuário ao criar o objeto BillingFlowParams. Se um usuário se qualificar para a oferta de pré-venda, 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 correto, que pode ser obtido com o método oneTimePurchaseOfferDetails.getOfferToken().

Oferta de desconto

Nesta seção, descrevemos como configurar ofertas de desconto para seus produtos únicos.

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

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

  • Qualificação por país ou região: 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á aproveitar a oferta.

  • Período limitado (opcional): especifica o período em que a oferta está disponível. Fora desse período, a oferta não pode ser comprada.

Recuperar informações de preços de ofertas com desconto

Para uma oferta com desconto, você pode recuperar a porcentagem ou o desconto absoluto oferecido.

Exemplo 1: recuperar o desconto percentual de uma oferta com desconto

A amostra a seguir mostra como receber o preço total original da oferta com desconto e a porcentagem de desconto. As informações de desconto percentual 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 de uma oferta com desconto

O exemplo a seguir mostra como extrair o preço total original da oferta com desconto e o desconto absoluto em micros. O desconto absoluto em micros só é retornado para ofertas com desconto. É preciso especificar o desconto absoluto ou percentual 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

Use o método OneTimePurchaseOfferDetails.getValidTimeWindow() para receber o período válido de uma oferta. Esse objeto contém o início e o fim 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 somente nesse nível. Confira um exemplo:

  1. Os protetores de tela avançados têm duas ofertas para o produto: opção de compra e protetor de tela com desconto.
    1. O protetor de tela da opção de compra não tem uma quantidade limitada configurada.
    2. O protetor de tela com desconto tem a quantidade máxima permitida no nível da oferta definida como 3.
  2. O produto de proteção de tela não tem uma quantidade máxima permitida no nível do produto. Portanto, os usuários podem comprar quantidades ilimitadas desse produto.
  3. O usuário tem um protetor de tela com desconto e planeja comprar outro com o mesmo desconto.
  4. Ao recuperar as ofertas disponíveis, o LimitedQuantityInfo do protetor de tela da opção de compra é nulo, e o valor da quantidade restante do protetor de tela com 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 de uma determinada oferta de desconto. Você pode receber a quantidade máxima permitida e a quantidade restante para o usuário atual. O recurso de quantidade limitada é aplicável às ofertas de produtos únicos consumíveis e não consumíveis. Esse recurso só é compatível 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 itens de propriedade do usuário, o Google Play considera compras consumidas ou pendentes. Compras canceladas, reembolsadas ou estornadas não contam para a quantidade de itens de propriedade do usuário. Exemplo:

  1. Os protetores de tela premium configuram 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, vai ocorrer um erro, e o PurchasesUpdatedListener vai receber um código de resposta ITEM_UNAVAILABLE.

  3. O usuário pede e recebe um reembolso da proteção de tela com desconto comprada originalmente. O usuário tenta comprar um dos protetores de tela com desconto, e a compra é concluída.

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

Você pode escolher os países ou regiões em que a oferta ou o desconto da opção de compra vão estar disponíveis para os usuários. O Google Play vai avaliar a qualificação do usuário com base no país do Play. Quando você configura a disponibilidade regional de uma oferta, ela só é retornada como parte de getOneTimePurchaseOfferDetailsList() se o usuário estiver em um país ou região segmentada. 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 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

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

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

  • O protetor de tela Super tem a tag de oferta de produto SSProductTag.
  • A proteção de tela da opção de compra tem a tag de oferta SSPurchaseOptionTag.
  • O protetor de tela com 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.