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

В этом документе подробно описывается интеграция ваших одноразовых товаров (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 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() .

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

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

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 или пользовательский интерфейс консоли разработчика Play. Для использования сервиса вы можете вызвать REST API напрямую или использовать клиентскую библиотеку 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 для заставки варианта покупки равно нулю, а оставшееся количество для заставки скидки равно 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 оценивает доступность пользователя на основе страны. При настройке региональной доступности предложения оно будет возвращено в рамках метода 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 .