Как использовать библиотеку Google Play Платежей в Unity

Плагин Google Play Платежей расширяет встроенные сервисы и ассеты Unity для покупок в приложениях, которые называются Unity IAP, чтобы предоставить вашей игре все новейшие функции библиотеки Google Play Платежей. В этом руководстве объясняется, как настроить проект для использования плагина. В этом руководстве также описано, как реализовать функции библиотеки Google Play Платежей в игре на Unity.

Как настроить плагин Google Play Платежей

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

  1. Включите уровень абстракции Unity IAP.
  2. Скачайте и импортируйте плагин.
  3. Задайте настройки сборки плагина.
  4. Включите плагин.

Включите уровень абстракции Unity IAP

Плагин Google Play Платежи основан на уровне абстракции, включенном в Unity IAP, поэтому вам нужно включить этот уровень абстракции, прежде чем скачивать и импортировать плагин. Чтобы включить уровень абстракции Unity IAP, выполните следующие действия:

  1. Выполните все шаги, описанные в руководстве по Unity Set up your project for Unity Services (Как настроить проект для сервисов Unity).
  2. Выполните все действия, описанные в руководстве Как включить сервис Unity IAP.

Как скачать и импортировать плагин

Плагин поставляется в виде пакета Unity в формате .unitypackage. Чтобы скачать и импортировать плагин, выполните следующие действия:

  1. Скачайте последнюю версию плагинов Google Play для Unity со страницы выпусков в репозитории на GitHub.
  2. В строке меню Unity выберите Assets (Объекты) > Import Package (Импортировать пакет) > Custom Package (Собственный пакет).

  3. Найдите и выберите скачанный файл .unitypackage.

  4. В диалоговом окне Import Unity Package (Импорт пакета Unity) оставьте все объекты выбранными и нажмите Import (Импортировать).

После импорта пакета в ресурсы проекта будет добавлена новая папка GooglePlayPlugins (в корне папки Assets). В этой папке содержатся все объекты библиотеки Google Play Платежей для плагина.

Настройте параметры сборки

Поскольку плагин расширяет Unity IAP, Unity столкнется с конфликтами и не сможет создать APK-файл Android, если из сборки не будут удалены некоторые старые перекрывающиеся зависимости в Unity IAP. Плагин позволяет автоматически удалить конфликтующие библиотеки из проекта. Чтобы устранить эти конфликты, выполните следующие действия:

  1. В строке меню Unity выберите Google > Play Billing > Build Settings (Google > Google Play Платежи > Настройки сборки).

  2. В окне Play Billing Build Settings (Настройки сборки Google Play Платежей) нажмите Fix (Исправить). Это устранит конфликт и переместит конфликтующие файлы Unity IAP в каталог резервных копий. После нажатия кнопки Исправить она меняется на кнопку Восстановить, с помощью которой можно восстановить исходные конфликтующие файлы.

Включите плагин

Чтобы включить плагин, замените реализацию Google Play в Unity IAP на плагин Google Play Платежей. Например, если вы используете скрипт Unity IAP Purchaser, вам нужно изменить StandardPurchaseModule, который передается в конструктор IAP, чтобы использовать Google.Play.Billing.GooglePlayStoreModule:

// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());

Если в вашей игре используется один и тот же скрипт Purchaser для нескольких платформ, добавьте проверку платформы, чтобы Unity продолжал использовать собственное решение для покупок в приложении на других платформах.

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

Если вы публикуете игру не только в Google Play, но и в других магазинах приложений для Android, то заменять стандартную реализацию Unity IAP нужно только при выборе Google Play.

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android
       && SelectedAndoidAppStore == AppStore.GooglePlay)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

Как реализовать функции библиотеки Google Play Платежей в игре

Плагин Google Play Платежей расширяет возможности сервисов Unity IAP, поэтому вы можете использовать те же API Unity для управления стандартными процессами покупки. Обратите внимание, что поведение API немного изменится, поскольку библиотека Google Play Платежей и стандартная реализация покупок в приложении Unity для других магазинов приложений различаются. Если вы раньше не работали с Unity IAP API, ознакомьтесь с разделом Making a Purchase Script (Создание скрипта для покупок) в руководстве по Unity IAP. В нем приведен пример реализации базовых процессов покупки.

В библиотеке Google Play Платежей также есть функции, которые доступны только в Google Play. Эти функции доступны в расширенном интерфейсе. В этом разделе описывается, как реализовать эти уникальные функции библиотеки Google Play Платежей в игре.

Как включить отложенные покупки

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

Чтобы включить отложенные покупки, используйте конструктор покупок в приложении и измените конфигурацию модуля, вызвав метод EnableDeferredPurchase():

// Create a builder using a GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
// Enable deferred purchases
configurationBuilder.Configure<Google.Play.Billing.IGooglePlayConfiguration>()
    .EnableDeferredPurchase();

Затем реализуйте обратный вызов отложенных покупок с помощью расширений Google Play:

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Set the deferred purchases callback.
_playStoreExtensions.SetDeferredPurchaseListener(
    delegate(Product product)
    {
        // Do not grant the item here. Instead, record the purchase and remind
        // the user to complete the transaction in the Play Store.
    });

Передача обфусцированных идентификаторов аккаунтов в Google Play

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

Чтобы передать замаскированный идентификатор аккаунта, вызовите метод SetObfuscatedAccountId() из API расширений:

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated account ID.
_playStoreExtensions.SetObfuscatedAccountId(obfuscatedAccountId);

Передача обфусцированных идентификаторов профилей в Google Play

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

Чтобы передать замаскированный идентификатор профиля, используйте конструктор покупок в приложении, чтобы изменить конфигурацию модуля, вызвав метод SetObfuscatedProfileId():

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated profile ID.
_playStoreExtensions.SetObfuscatedProfileId(obfuscatedProfileId);

Как подтвердить изменение цены подписки

В Google Play можно изменить цену активной подписки. Пользователи должны подтвердить изменение цены, прежде чем оно вступит в силу. Чтобы предложить пользователям подтвердить изменение цены подписки, вызовите метод ConfirmSubscriptionPriceChange():

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

_playStoreExtensions.ConfirmSubscriptionPriceChange(productId,
    delegate (bool success)
    {
        // Returns whether the user has accepted the new price or not.
    });

Изменения в работе Unity API

При использовании плагина Google Play Платежей большинство API работают так же, как стандартная реализация покупок в приложении Unity для других магазинов приложений. Однако в некоторых случаях API будут вести себя по-разному. В этом разделе описываются различия в поведении.

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

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

Вы можете продолжать использовать те же интерфейсы, которые определены стандартной реализацией покупок в приложении Unity для других магазинов приложений, включая IStoreController. При инициировании покупки вы по-прежнему можете использовать IStoreController и вызывать метод InitiatePurchase():

public void InitiatePurchase(Purchasing.Product product, string payload);

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

SubscriptionManager не поддерживается.

Unity IAP предоставляет класс SubscriptionManager для управления подписками. Поскольку стандартная реализация покупок в приложении в Unity использует полезную нагрузку разработчика, этот класс не поддерживается. Вы по-прежнему можете создать этот класс, но при использовании любого из его методов получения данных вы можете получить ненадежные данные.

Небольшие изменения в API UpdateSubscription

Плагин Google Play Платежей не поддерживает использование методов SubscriptionManager.UpdateSubscription() и SubscriptionManager.UpdateSubscriptionInGooglePlayStore() для перехода на более дорогой или дешевый тарифный план. Если игра вызывает эти методы, возникает ошибка GooglePlayStoreUnsupportedException.

Библиотека Google Play Платежей предоставляет альтернативный API, который можно использовать вместо этих методов. Чтобы перейти на другую подписку, вызовите метод UpdateSubscription(), используя режим пропорционального перерасчета:

void UpdateSubscription(Product oldProduct, Product newProduct,
           GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);

Вы можете обернуть вызов этого метода проверкой платформы или блоком catch, когда перехвачено исключение GooglePlayStoreUnsupportedException.

Дополнительную информацию и примеры использования режима пропорциональной оплаты можно найти в статье Как настроить режим пропорциональной оплаты.