Добавить предложения по предварительному заказу для разовых продуктов

1. Введение

В этой лабораторной работе вы сосредоточитесь на создании одноразового продукта (OTP) и добавите предложение по предварительному заказу на продукт.

Примечание : перед началом работы над этой практической работой вам необходимо запросить доступ к функции предварительного заказа, заполнив форму одноразового запроса EAP на продукты .

Аудитория

Эта лабораторная работа предназначена для разработчиков приложений для Android, которые знакомы с одноразовыми продуктами и хотят понять, как добавлять предложения по предзаказу к своим одноразовым продуктам.

Предварительное условие

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

Чему вы научитесь...

  • Как использовать Google Play Console для создания предложений по предзаказу ваших разовых продуктов.
  • Как использовать API библиотеки Play Billing для запроса информации о разовых продуктах и ​​соответствующих предложениях по предзаказу.

Что вам понадобится...

2. Создайте пример приложения

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

  • Интеграция приложения с PBL.
  • Получение разовых продуктов и связанных с ними предложений по предзаказу.
  • Осуществление потоков закупок с учетом регионального ценообразования.

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

Если вы уже знакомы с одноразовыми продуктами и Play Billing Library (PBL), вы можете загрузить пример приложения и поэкспериментировать с ним.

Предварительные условия

Перед сборкой и развертыванием примера приложения выполните следующие действия:

Строить

Целью этого этапа сборки является создание подписанного файла пакета приложения Android для примера приложения.

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

  1. Загрузите пример приложения с GitHub .
  2. Соберите пример приложения . Перед сборкой измените имя пакета примера приложения, а затем выполните сборку. Если в Play Console есть пакеты других приложений, убедитесь, что имя пакета, указанное для примера приложения, уникально.

    Примечание : при сборке примера приложения создаётся только APK-файл, который можно использовать для локального тестирования. Однако при запуске приложения не отображаются товары и цены, поскольку они не настроены в Play Console.
  3. Создайте подписанный пакет приложений для Android.
    1. Сгенерируйте ключ загрузки и хранилище ключей
    2. Подпишите свое приложение с помощью ключа загрузки
    3. Настроить подписание приложения Play

Следующий шаг — загрузить пакет приложения Android в Google Play Console.

3. Создайте одноразовый пароль с предварительным заказом в Play Console.

Для создания одноразовых продуктов (OTP) в Google Play Console необходимо иметь приложение в Play Console. Создайте приложение в Play Console, а затем загрузите ранее созданный подписанный пакет приложений.

Создать приложение

Чтобы создать приложение:

  1. Войдите в Google Play Console , используя свою учетную запись разработчика.
  2. Нажмите «Создать приложение» . Откроется страница «Создать приложение» .
  3. Введите название приложения, выберите язык по умолчанию и другие сведения, связанные с приложением.
  4. Нажмите «Создать приложение» . Это создаст приложение в Google Play Console.

Теперь вы можете загрузить подписанный пакет примера приложения.

Загрузите подписанный пакет приложения

  1. Загрузите подписанный комплект приложений во внутреннюю тестовую версию Google Play Console . Только после загрузки вы сможете настроить функции монетизации в Play Console.
    1. Нажмите Тестирование и выпуск > Тестирование > Внутренний выпуск > Создать новый выпуск .
    2. Введите название релиза и загрузите подписанный APK-файл.
    3. Нажмите кнопку «Далее» , а затем нажмите кнопку «Сохранить и опубликовать» .

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

Создать одноразовый продукт

Теперь создайте одноразовый продукт, который вы хотите, чтобы пользователи приобрели.

  1. Откройте пример приложения в Google Play Console и перейдите в раздел Монетизация с Play > Продукты > Разовые продукты .
  2. Нажмите Создать одноразовый продукт .
  3. Введите следующие данные о продукте:
    • ID продукта: введите уникальный ID. Например, upcoming_movie_1 .
    • (Необязательно) Теги: добавьте соответствующие теги.
    • Имя: Введите название продукта. Например, Product Movie .
    • Описание: Введите описание товара. Например, Product Description .
    • (Необязательно) Добавьте изображение значка: загрузите значок, представляющий ваш продукт.
    Примечание: для целей данной лабораторной работы вы можете пропустить настройку раздела «Налоги, соответствие и программы» .
  4. Нажмите кнопку «Далее» .
  5. Добавьте вариант покупки и настройте его региональную доступность. Для одноразового продукта требуется как минимум один вариант покупки, который определяет способ предоставления права, его цену и региональную доступность. В этой лабораторной работе мы добавим стандартный вариант покупки для продукта. В разделе «Вариант покупки» введите следующие данные:
    • Идентификатор варианта покупки: введите уникальный идентификатор. Например, buy-movie .
    • Тип покупки: выберите «Купить» .
    • (Необязательно) Теги: добавьте теги, относящиеся к этому варианту покупки.
    • (Необязательно) Нажмите «Дополнительные параметры» , чтобы настроить дополнительные параметры. В рамках этой практической работы настройку дополнительных параметров можно пропустить.
  6. Далее необходимо настроить региональную доступность и цену для варианта покупки. В разделе региональной доступности укажите регионы, в которых доступен ваш продукт, включая регионы, в которых ваше приложение ещё не опубликовано. По умолчанию возможность покупки будет доступна во всех регионах. В разделе «Доступность и цены» нажмите «Изменить доступность и доступ» .
    1. Выберите Установить как недоступный .
    Обратите внимание, что все регионы автоматически выбраны и им присвоен статус Доступно .
    1. Снимите флажок только для страны United States и нажмите «Сделать недоступным» . Теперь одноразовый продукт будет доступен только в United States .
    2. В раскрывающемся списке « Все регионы» выберите «Доступные страны и регионы» . Должны быть видны только United States .
    3. Нажмите на значок «Цена» . Откроется диалоговое окно для установки цены.
    4. Введите 10 долларов США и нажмите « Сохранить» .
  7. Нажмите Сохранить как черновик .

Примечание : Пока не активируйте опцию покупки. Мы активируем её после настройки предложения по предзаказу. Это связано с тем, что вы не можете добавить предложение по предзаказу к активной опции покупки, доступность которой в регионе уже задана.

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

Теперь вам нужно добавить предложение по предзаказу для опции «Купить», которую вы создали ранее. Предложение по предзаказу позволяет пользователям приобрести ваш товар до его официального выпуска. Обратите внимание, что предложения по предзаказу поддерживаются только для опции «Купить » и могут быть настроены только для новых товаров в определённом регионе.

Добавление предложения по предварительному заказу включает в себя следующие 2 шага:

  1. Подготовьте опцию покупки «Купить» для предложения предварительного заказа.
  2. Добавьте предложение о предварительном заказе для возможности покупки.

Подготовьте опцию покупки «Купить» для предложения предварительного заказа.

  1. Откройте пример приложения в Google Play Console и перейдите в раздел Монетизация с Play > Продукты > Разовые продукты .
  2. На странице «Разовые продукты » нажмите стрелку вправо для вашего продукта ( upcoming_movie_1 ). Откроется страница редактирования разового продукта .
  3. Нажмите стрелку вправо для опции покупки buy-movie , которую вы создали ранее. Откроется страница редактирования опции покупки .
  4. Нажмите «Изменить доступность и привилегии» , а затем выберите «Сделать доступным и разрешить пользователям делать предварительные заказы» .
  5. В раскрывающемся списке « Все регионы» выберите «Доступные страны и регионы» . Должны отображаться только United States , которые вы настроили ранее.
  6. Выберите страну, а затем нажмите «Сделать доступным только для предварительного заказа» .
  7. Нажмите «Сохранить ».

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

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

  1. Откройте пример приложения в Google Play Console и перейдите в раздел Монетизация с Play > Продукты > Разовые продукты .
  2. На странице «Разовые товары» нажмите «Добавить предложение» > «Предзаказ» для вашего продукта ( upcoming_movie_1 ). Откроется страница «Добавить предзаказ» .
  3. Введите данные предварительного заказа:
    • Идентификатор предварительного заказа: введите preorder-offer-1 .
    • (Необязательно) Добавьте скидку: выберите «Нет» , «Процентная» или «Абсолютная» . В рамках этой практической работы выберите «Нет» .
    • (Необязательно) Теги: добавьте соответствующие теги.
    • Дата и время начала: установите дату не ранее, чем через 3 дня.
    • Дата и время окончания: установите дату не ранее, чем через 24 часа после даты начала.
    • Доступность после предварительного заказа: выберите, станет ли товар доступен сразу после окончания периода предварительного заказа или в определенную более позднюю дату/время.
    • (Необязательно) Гарантия более низкой цены: выберите этот вариант, если хотите, чтобы пользователи получали самую низкую цену между ценой предзаказа и ценой на момент релиза. Это может стать сильным стимулом для ранних покупателей.
  4. Нажмите «Сохранить ».
  5. Откройте страницу редактирования одноразового продукта для вашего одноразового продукта (upcoming_movie_1).
  6. Нажмите Активировать для опции покупки ( buy-movie ).
  7. Нажмите «Активировать» для предложения по предзаказу ( preorder-offer-1 ) под опцией «Купить». Это активирует предложение по предзаказу и вступит в силу в дату, указанную вами ранее в информации о предзаказе.

Видео о создании предложения по предзаказу

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

4. Интеграция с PBL

Чтобы интегрировать ваше приложение с Play Billing Library (PBL) , выполните следующие действия:

  1. Добавьте зависимость Play Billing Library к примеру приложения.
    dependencies {
    val billing_version = "8.1.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Инициализируйте BillingClient . BillingClient — это клиентский SDK, который находится в вашем приложении и взаимодействует с библиотекой Play Billing. В следующем фрагменте кода показано, как инициализировать клиент для выставления счетов.
    private BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        // For one-time products, add a listener to process and acknowledge the purchases. This will notify
        // Google the purchase was processed.
        // For client-only apps, use billingClient.acknowledgePurchase().
        // If you have a secure backend, you must acknowledge purchases on your server using the
        // server-side API.
        // See https://developer.android.com/google/play/billing/security#acknowledge
        // In this sample snippet purchases aren't processed. You must
        // implement your business logic to process and acknowledge the purchases.
        .setListener((billingResult, purchases) -> {})
        .enableAutoServiceReconnection()
        .build();
     }
    
  3. Подключитесь к Google Play. Следующий фрагмент кода показывает, как подключиться к Google Play.
    /**
    * Starts the billing connection with Google Play. This method should be called exactly once
    * before any other methods in this class.
    *
    * @param productList The list of products to query for after the connection is established.
    */
    public void startBillingConnection(List<Product> productList) {
        billingClient.startConnection(
            new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                Log.d(TAG, "Billing Client Connection Successful");
                queryProductDetails(productList);
                } else {
                Log.e(TAG, "Billing Client Connection Failed: " + billingResult.getDebugMessage());
                listener.onBillingSetupFailed(billingResult); // Propagate the error to the listener to show a message to the user.
                }
            }
    
            @Override
            public void onBillingServiceDisconnected() {
                Log.e(TAG, "Billing Client Connection Lost");
                listener.onBillingError("Billing Connection Lost");
            }
            });
    }
    
  4. Получите информацию о разовом продукте. После интеграции приложения с PBL необходимо получить информацию о разовом продукте. Следующий фрагмент кода показывает, как получить информацию о разовом продукте в вашем приложении.
    private void queryProductDetails(List<Product> productList) {
        QueryProductDetailsParams queryProductDetailsParams =
            QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    
        billingClient.queryProductDetailsAsync(
            queryProductDetailsParams,
            new ProductDetailsResponseListener() {
            @Override
            public void onProductDetailsResponse(
                BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                List<ProductDetails> productDetailsList =
                    productDetailsResponse.getProductDetailsList();
                    listener.onProductDetailsResponse(productDetailsList);
                } else {
                Log.e(TAG, "QueryProductDetailsAsync Failed: " + billingResult.getDebugMessage());
                listener.onBillingError("Query Products Failed: " + billingResult.getResponseCode());
                }
            }
            });
    }
    
    Извлечение одноразового продукта (в этом примере upcoming_movie_1 ) в ProductDetails дает ответ, аналогичный следующему:
    {
        "productId": "upcoming_movie_1",
        "type": "inapp",
        "title": "Purrfect Mayhem: The Final Playback (Movies All Day | Play Samples)",
        "name": "Purrfect Mayhem: The Final Playback",
        "description": "Yolo and Thorne must reach the original broadcasting site to initiate the \"Final Playback\" and save the timeline. Follow them through their race against the Clockinators.",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 8500000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$8.50",
                "offerIdToken": "<---offerIdToken--->",
                "offerId": "preorder",
                "purchaseOptionId": "buy-option",
                "offerTags": [],
                "validTimeWindow": {
                    "startTimeMillis": 1756771200000,
                    "endTimeMillis": 1785542400000
                },
                "preorderDetails": {
                    "preorderReleaseTimeMillis": 1785542400000,
                    "preorderPresaleEndTimeMillis": 1785542400000
                }
            }
        ]
    }
    
    Обратите внимание, что информация о предложении по предзаказу доступна в списке oneTimePurchaseOfferDetailsList . В этом списке указан один вариант покупки ( buy-option ), для которого в Play Console было настроено предложение по предзаказу. Вы можете однозначно идентифицировать каждый вариант покупки по его offerIdToken .
  5. Получите токен предложения вместе с информацией о предложении по предзаказу. Токен предложения понадобится вам для запуска процесса выставления счета на шаге 6.
    @Override
    public void onProductDetailsResponse(List<ProductDetails> productDetailsList) {
    
    if (productDetailsList != null && !productDetailsList.isEmpty()) {
    
    // 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();
          }
        }
      }
      }
      } else {
            Log.e(TAG, "No product details found for " + productId);
        }
    }
    
  6. Запустите процесс выставления счетов.
    /**
     * Launches the billing flow for the product with the given offer token.
    *
    * @param activity The activity instance from which the billing flow will be launched.
    * @param productDetails The product details of the product to purchase.
    * @param offerToken The offer token of the product to purchase.
    * @return The result of the billing flow.
    */
    public void launchPurchase(Activity activity, ProductDetails productDetails, String offerToken) {
        ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
            ImmutableList.of(
                BillingFlowParams.ProductDetailsParams.newBuilder()
                    .setProductDetails(productDetails)
                    .setOfferToken(offerToken)
                    .build());
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
        billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    

5. Тестовые варианты покупки

Прежде чем сделать ваши одноразовые продукты доступными в вашем рабочем приложении, вы можете протестировать интеграцию PBL с помощью тестеров лицензий и Play Billing Lab .

Чтобы понять, как можно протестировать варианты покупки с помощью Play Billing Lab , ознакомьтесь с практической работой «Откройте новые рынки с помощью регионального ценообразования продуктов» .

6. Дальнейшие шаги

Справочные документы

7. Поздравляем!

Поздравляем! Вы успешно создали предложение по предзаказу разового товара в Google Play Console. Теперь вы лучше понимаете гибкий каталог товаров Google Play для разовых покупок.

Опрос

Мы очень ценим ваши отзывы об этой лабораторной работе. Уделите несколько минут и пройдите наш опрос.