Множество вариантов покупки и предложений для одноразовых продуктов

В этом документе подробно описывается интеграция ваших одноразовых продуктов (OTP) с библиотекой Play Billing. В нем также объясняется, как интегрировать различные варианты покупки и предложения, связанные с вашими одноразовыми продуктами.

Вы можете настроить несколько вариантов покупки и предложений для ваших одноразовых продуктов. Например, вы можете настроить вариант покупки и предложение предварительного заказа для одного и того же одноразового продукта.

Предпосылки

Чтобы настроить несколько предложений для одноразовых продуктов, необходимо использовать API queryProductDetailsAsync() . Устаревший API querySkuDetailsAsync() не поддерживается. Информацию о том, как использовать queryProductDetailsAsync() и версию launchBillingFlow() , которая принимает ProductDetailsParams в качестве входных данных, см. в разделе шаги миграции .

Запросить информацию о продукте

Если вы настроили несколько предложений или вариантов покупки для вашего одноразового продукта, объект ProductDetails , возвращаемый методом queryProductDetailsAsync() может иметь более одного доступного варианта покупки и (или) аренды для каждого одноразового продукта. Чтобы получить список всех подходящих предложений для каждого объекта ProductDetails , используйте метод getOneTimePurchaseOfferDetailsList() . Только предложения и варианты покупки, на которые пользователь имеет право, будут возвращены как часть этого списка. Ваш код в методе onProductDetailsResponse() должен обрабатывать возвращенные предложения.

Запуск процесса выставления счетов

Чтобы начать запрос на покупку из вашего приложения, вызовите метод launchBillingFlow() из основного потока вашего приложения. Этот метод принимает ссылку на объект BillingFlowParams , содержащий соответствующий объект ProductDetails , полученный при вызове queryProductDetailsAsync() . Чтобы создать объект BillingFlowParams , используйте класс BillingFlowParams.Builder . Обратите внимание, что вы должны установить токен предложения, соответствующий предложению, выбранному пользователем при создании объекта BillingFlowParams .

В следующем примере показано, как запустить процесс покупки одноразового продукта с несколькими предложениями:

Ява

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

offerToken можно найти как часть OneTimePurchaseOfferDetails . Когда вы показываете предложение пользователю, убедитесь, что вы настроили параметры потока выставления счетов с правильным токеном предложения, который можно получить из метода oneTimePurchaseOfferDetails.getOfferToken() .

Варианты покупки и предложения

Вариант покупки позволяет вам определить, как право предоставляется пользователю, его цену и в каком регионе доступен продукт. Один продукт может иметь несколько вариантов покупки, которые могут представлять, где и как вы продаете свой продукт.

Google Play поддерживает следующие варианты покупки одноразовых продуктов:

  • Купить вариант покупки
  • Возможность аренды с правом выкупа

Предложения относятся к схеме ценообразования, которую вы можете создать для своих одноразовых продуктов. Например, вы можете создать предложение о скидке для своего одноразового продукта.

Google Play поддерживает следующие предложения по покупке разовых продуктов:

  • Предложение по предварительному заказу (поддерживается только для опции покупки)
  • Предложение скидки (поддерживается как для покупки, так и для аренды)

Купить вариант покупки

Вариант покупки представляет собой стандартную, прямую покупку одноразового продукта. Он имеет необязательное поле legacyCompatible, указывающее, будет ли этот вариант покупки доступен в старых потоках Play Billing Library (версии 7 или более ранней), которые не поддерживают новую модель. Для обратной совместимости по крайней мере один вариант покупки должен быть отмечен как совместимый с устаревшими версиями.

Шаги для интеграции опций покупки и аренды с PBL одинаковы. Чтобы понять, как интегрировать опцию покупки с PBL, см . Интеграция опции аренды с PBL .

Возможность аренды с правом выкупа

Опция аренды с покупкой позволяет пользователям получать доступ к одноразовым продуктам на определенный период времени. Вы можете указать период аренды и его истечение. В этом документе описываются шаги по интеграции опции аренды с Play Billing Library (PBL).

Интеграция опции аренды с правом выкупа с PBL

В этом разделе описывается, как интегрировать опцию покупки аренды с Play Billing Library (PBL). Предполагается, что вы знакомы с начальными шагами интеграции PBL, такими как добавление зависимости PBL к вашему приложению , инициализация BillingClient и подключение к Google Play . В этом разделе основное внимание уделяется аспектам интеграции PBL, которые характерны для опции покупки аренды.

Для настройки продуктов, доступных для аренды, вам нужно будет использовать новый сервис monetization.onetimeproducts API разработчика Play или UI консоли разработчика Play. Чтобы использовать сервис, вы можете вызвать API REST напрямую или использовать клиентскую библиотеку Java .

Запустить процесс покупки для варианта аренды

Чтобы запустить процесс покупки предложения аренды, выполните следующие действия:

  1. Получите метаданные варианта аренды с помощью метода ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() .

    В следующем примере показано, как получить метаданные аренды и покупки:

    Ява

    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. Запустите процесс выставления счетов.

    Чтобы начать запрос на покупку из вашего приложения, вызовите метод launchBillingFlow() из основного потока вашего приложения. Этот метод принимает ссылку на объект BillingFlowParams , который содержит соответствующий объект ProductDetails , полученный при вызове queryProductDetailsAsync() . Чтобы создать объект BillingFlowParams , используйте класс BillingFlowParams.Builder . Обратите внимание, что вы должны установить токен предложения, соответствующий предложению, выбранному пользователем при создании объекта BillingFlowParams . Если пользователь имеет право на опцию аренды с покупкой, он получит предложение с RentalDetails и offerId в queryProductDetailsAsync() .

    В следующем примере показано, как запустить процесс выставления счетов:

    Котлин

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

    Ява

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

    offerToken можно найти как часть OneTimePurchaseOfferDetails . Когда вы показываете предложение пользователю, убедитесь, что вы настроили параметры потока выставления счетов с правильным токеном предложения, который можно получить из метода oneTimePurchaseOfferDetails.getOfferToken() .

Предложение предварительного заказа

Предварительный заказ позволяет вам настроить одноразовые продукты, которые будут куплены до того, как товар будет выпущен. Когда пользователь делает предварительный заказ на ваш продукт, он соглашается заплатить за товар, когда он будет выпущен, если только пользователь не отменит предварительный заказ до даты выпуска. В дату выпуска с покупателя взимается плата, и Play уведомит его по электронной почте о выпуске товара.

В этом документе описываются шаги по интеграции предложения о покупке предварительного заказа с библиотекой Play Billing Library (PBL).

Интеграция предложения предварительного заказа с PBL

В этом разделе описывается, как интегрировать предложение предварительного заказа с Play Billing Library (PBL). Предполагается, что вы знакомы с начальными шагами интеграции PBL, такими как добавление зависимости PBL к вашему приложению , инициализация BillingClient и подключение к Google Play . В этом разделе основное внимание уделяется аспектам интеграции PBL, которые являются специфическими для предложения предварительного заказа.

Запустите процесс покупки для предложения предварительного заказа

Чтобы запустить процесс покупки по предложению предварительного заказа, выполните следующие действия:

  1. Извлеките метаданные предложения предварительного заказа с помощью метода ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() . В следующем примере показано, как получить метаданные предложения предварительного заказа:

    Ява

    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. Запустите процесс выставления счетов.

    Чтобы начать запрос на покупку из вашего приложения, вызовите метод launchBillingFlow() из основного потока вашего приложения. Этот метод принимает ссылку на объект BillingFlowParams , который содержит соответствующий объект ProductDetails , полученный при вызове queryProductDetailsAsync(). Чтобы создать объект BillingFlowParams , используйте BillingFlowParams.Builder class . Обратите внимание, что вы должны установить токен предложения, соответствующий предложению, выбранному пользователем при создании объекта BillingFlowParams . Если пользователь имеет право на предложение предварительного заказа, он получит предложение с PreorderDetails и offerId в методе queryProductDetailsAsync() .

    В следующем примере показано, как запустить процесс выставления счетов:

    Ява

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

    offerToken можно найти как часть OneTimePurchaseOfferDetails . Когда вы показываете предложение пользователю, убедитесь, что вы настроили параметры потока выставления счетов с правильным токеном предложения, который можно получить из метода oneTimePurchaseOfferDetails.getOfferToken() .

Предложение скидки

В этом разделе описывается, как настроить предложения скидок для ваших разовых продуктов.

В единовременном предложении скидки на продукт можно настроить четыре различных параметра:

  • Цена со скидкой: указывается информация о проценте скидки или абсолютной цене от первоначальной цены.

  • Право на участие в программе для стран или регионов: определяет доступность единовременных предложений по продуктам в стране или регионе.

  • Лимит покупки (необязательно): позволяет определить, сколько раз пользователь может воспользоваться одним и тем же предложением. Если пользователь превысит лимит покупки, он не сможет воспользоваться предложением.

  • Ограниченное время (необязательно): Указывает период времени, в течение которого предложение доступно. За пределами этого периода предложение не подлежит покупке.

Получить информацию о ценах со скидкой

Для предложения со скидкой вы можете получить процент скидки или абсолютную предлагаемую скидку.

Пример 1: Получить процент скидки по предложению со скидкой

Следующий пример показывает, как получить полную цену предложения со скидкой и его процентную скидку. Обратите внимание, что информация о процентной скидке возвращается только для предложений со скидкой.

Ява

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();
            }
            // …
          }
        }
      }
    });
    
Пример 2: Получить абсолютную скидку по предложению со скидкой

В следующем примере показано, как получить полную цену изначального предложения со скидкой и его абсолютную скидку в микро. Обратите внимание, что информация об абсолютной скидке в микро возвращается только для предложений со скидкой. Для предложения со скидкой необходимо указать либо абсолютную скидку, либо процентную скидку.

Ява

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

Получите действительный временной интервал предложения

Вы можете использовать метод OneTimePurchaseOfferDetails.getValidTimeWindow() , чтобы получить допустимое временное окно для предложения. Этот объект содержит время начала и окончания временного окна в миллисекундах.

В следующем примере показано, как получить допустимый временной интервал предложения:

Ява

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

Ограниченное количество на уровне предложения со скидкой

Вы можете указать максимальный предел количества на уровне предложения скидки, который применяется только на уровне предложения. Вот пример для иллюстрации:

  1. У Super screensavers есть 2 предложения на продукцию-скринсейверы: возможность покупки скринсейвера и скидка на скринсейвер.
    1. Заставка с вариантом покупки не имеет установленного ограничения по количеству.
    2. На заставке со скидками максимально допустимое количество на уровне предложения установлено на уровне 3.
  2. Продукт-заставка не имеет максимально допустимого количества на уровне продукта, поэтому пользователи могут покупать неограниченное количество этого продукта.
  3. У пользователя есть 1 заставка со скидкой, и он планирует купить еще одну со скидкой.
  4. При извлечении доступных предложений LimitedQuantityInfo для заставки с вариантами покупки имеет значение null, а оставшееся количество для заставки со скидками равно 2.

В следующем примере показано, как получить ограниченное количество на уровне предложения со скидкой:

Ява

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

Когда пользователи используют максимальное количество выкупов по предложению, предложение не возвращается методом getOneTimePurchaseOfferDetailsList() .

Рассчитать лимит выкупа

В следующем примере показано, как получить информацию об ограниченном количестве по определенному предложению со скидкой. Вы можете получить максимально допустимое количество и оставшееся количество для текущего пользователя. Обратите внимание, что функция ограниченного количества применима как для одноразовых предложений расходуемых, так и нерасходуемых продуктов. Эта функция поддерживается только на уровне предложения.

Google Play вычисляет оставшееся количество, вычитая собственное количество пользователя из максимально допустимого количества, которое вы установили. При подсчете собственного количества пользователя Google Play учитывает использованные покупки или ожидающие покупки. Покупки, которые были отменены, возвращены или отозваны, не учитываются в собственном количестве пользователя. Например:

  1. Супер-скринсейверы предлагают скидку, максимально допустимое количество — один экземпляр, поэтому пользователи могут купить до одного скринсейвера со скидкой.

  2. Пользователь покупает одну из заставок со скидкой. Если пользователь затем попытается купить вторую заставку со скидкой, произойдет ошибка, и PurchasesUpdatedListener получит код ответа ITEM_UNAVAILABLE.

  3. Пользователь запрашивает возврат первоначально купленной со скидкой заставки и успешно получает возврат. Пользователь пытается купить одну из заставок со скидкой, и покупка проходит успешно.

Право на участие в программе для стран и регионов

Вы можете выбрать страны или регионы, в которых пользователям будут доступны предложения по покупке или скидки. Google Play будет оценивать пригодность пользователя на основе страны Play. При настройке региональной доступности предложения оно будет возвращено как часть getOneTimePurchaseOfferDetailsList() только в том случае, если пользователь находится в целевой стране или регионе, в противном случае оно не будет частью списка предложений, возвращаемых при вызове queryProductDetailsAsync() .

Теги предложений

В следующем примере показано, как получить теги предложения, связанные с предложением.

Ява

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

Наследование тегов предложений

Вы можете задать теги предложения для продукта, опции покупки или предложения скидки. Предложения скидки наследуют теги предложения из предложения опции покупки. Аналогично, если теги предложения указаны на уровне продукта, то и предложение опции покупки, и предложение скидки наследуют теги предложения продукта.

Например, у Super screensavers есть два предложения на продукцию-скринсейверы: возможность покупки скринсейвера и скидка на скринсейвер.

  • Суперскринсейвер имеет тег предложения продукта SSProductTag .
  • Заставка с вариантами покупки имеет тег предложения SSPurchaseOptionTag .
  • Заставка со скидками имеет тег предложения SSDiscountOfferTag .

В этом примере метод oneTimePurchaseOfferDetails.getOfferTagsList() для предложения варианта покупки возвращает SSProductTag и SSPurchaseOptionTag . Для предложения скидки метод возвращает SSProductTag , SSPurchaseOptionTag и SSDiscountOfferTag .