[Из песочницы] In App Purchase с помощью Soomla. Быстро и просто

0b040d20fd16485c85cd95710aaf8eef.png

В последнее время пришлось интегрировать внутриигровые покупки в свою игру и встал вопрос, а какой же плагин для этого использовать под Unity3D? Есть такие вещи как OpenIAB, Prime31, Unibill и Soomla. Более мелкие вещи брать в расчет не будем, ибо некоторые из них либо не обновляются вообще, либо имеют какие-то критические проблемы. Кто хочет знать, почему выбор пал именно на Soomla, и как его интегрировать прошу под кат.
Итак, плагинов, как видно, много и по названию топика видно, какую систему я выбрал в итоге, но почему? Давайте рассмотрим каждую систему отдельно.

OpenIAB


Плюсы:

  • Бесплатность
  • Открытость
  • Большое сообщество
  • Простота
  • Неплохая документация
  • Поддержка iOS и Android (Позднее оказалось, что не так)


Минусы:

  • Почти нет информации о работе с iOS
  • Обновления весьма редки (Последнее было 4 месяца назад)


Мнение:
Грешу, я и ранее работал с этой системой, но только под Android, когда же я решил попробовать поработать с стороной iOS, то меня ждало разочарование, OpenIAB просто не работал, т.к. его event’ы не давали отклика, и как на инициализацию магазина, потому от этой системы пришлось отказаться, но стоит отдать ей должное, под Android работала она безупречно, но в этом и не приходилось сомневаться, ведь даже исходная версия на c++ написана только под эту ОС.

Unibill


Плюсы:

  • Поддержка множества магазинов
  • Отличная документация
  • Простота и легкость в освоении


Минусы:

  • Цена (175$)
  • Сообщество, как таковое почти отсутствует


Мнение:
С Unibill все оказалось просто. Сразу были вопросы к цене, 175$ не совсем маленькие деньги, особенно учитывая, что есть более дешевые аналоги, потому сразу нет, но если есть финансы и не хочется тратить много времени, то отличный вариант.

Prime[31]


Плюсы:

  • Отличная документация
  • Простота и легкость в освоении
  • Поддерживает множество магазинов, но с оговоркой.
  • Большое сообщество.


  • Под каждую платформу цена плагина 70 $.


Мнение:
Плагины от prime[31] славятся своим качество, но цена тоже оставляет желать лучшего, 70$ под каждую платформу отдельно совсем не предел мечтаний, но тут уже проверенная технология с огромным сообществом и отличной документацией и т.к. нужен был плагин всего под 2 платформы цена выходила ниже, чем у Unibill, но все равно был выбран не этот вариант, а нижеследующий.

Soomla


Плюсы:

  • Отличная документация
  • Простота и легкость в освоении
  • Поддерживает основные мобильные платформы.
  • Большое сообщество.
  • Бесплатность.


Минусы:

  • Работа через их личный кабинет


Мнение:
Soomla же показался просто отличным вариантом, т.к. у него есть все плюсы плагинов от prime[31], но при этом эта система полностью бесплатна, хоть и смутило то, что придется еще работать через личный кабинет на их сайте, но на самом деле, делать там почти ничего не нужно, потому выбор остановился на этом варианте.

Интеграция в проект


Первое, что нужно сделать (Внезапно!) скачать собственно плагин, можно с Asset Store, можно с официального сайта, разницы нет. И там и там плагин обновляется почти одновременно.

После импорта в проект плагина, первое наперво нужно выставить настройки в editor’е.

3cdd3089d26c4871b339edbe46d1bff6.png

В Soomla Secret вы должны указать Game Key, который вы получите при создании приложения в личном кабинете Soomla. Без этого работать ничего не будет!

38b4c43fed9040c2878f4fc23015f93b.png

Debug Native и Debug Unity это на ваш личный выбор. В Android Settings package name определяется автоматически, а дальше вы должны собственно выбрать, какие магазины на Android вы используете. Думаю, API Key понятно откуда брать. Receipt Validation так же на ваш выбор. Все, основу мы настроили, пора переходить к скриптам.

Нам нужно собственно описать в отдельном классе наши товары, для того, чтобы мы могли покупать их, к примеру так:

Инициализация покупок
using Soomla.Store;//Подключаем Soomla
using Soomla;//Подключаем Soomla

public class dataIAP : IStoreAssets  { //Наследуемся от интерфейса IStoreAssets

                public int GetVersion() { //Инициализируем функцию GetVersion, что она возвращает важно, если вы будете смотреть информацию в личном кабинете сумлы
                        return 0;
                }

                public VirtualCurrency[] GetCurrencies() { //Указываем все наши валюты, которые мы продаем за реальные деньги 
                        return new VirtualCurrency[]{ITEM_OBJECT};
                }

                public VirtualCurrencyPack[] GetCurrencyPacks(){ //Указываем все паки с нашими валютами
                        return new VirtualCurrencyPack[]{PACK_1_OBJECT, PACK_2_OBJECT};
                }

                public VirtualGood[] GetGoods() {
                        return new VirtualGood[0]; //Виртуальные блага
                }

                public VirtualCategory[] GetCategories() {
                        return new VirtualCategory[0]; //Категории виртуальных благ и реальных вещей
                }

                public const string ITEM_ID = "ITEM_ID";// указываем любой удобный ID

                public const string PACK_1 = "ID_PACK_1";// указываем id, который мы указали в магазине (App Store, Google Play) для данного пака
                public const string PACK_2= "ID_PACK_2";// указываем id, который мы указали в магазине (App Store, Google Play) для данного пака

                public static VirtualCurrency ITEM_OBJECT = new VirtualCurrency(//создаем объект нашей виртуальной валюты
                        "ITEM_ID ",//Имя валюты                                                                       
                        "ITEM_COIN", //описание валюты                                                                                
                        ITEM_ID //id виртуальной валюты
                        );

                public static VirtualCurrencyPack PACK_1_OBJECT = new VirtualCurrencyPack(//создаем объект пака с виртуальной валютой
                        "PACK_1",//имя пака                                                                           
                        "",//Описание пака                                                                                            
                        PACK_1 ,// Указываем id пака
                        100, //Количество валюты в паке
                        ITEM_ID ,//id валюты в паке
                        new PurchaseWithMarket(PACK_1 , 1.99) //Первым указываем id пака в магазине, вторым его цену(не критично, если отличается)
                        );
                public static VirtualCurrencyPack PACK_2_OBJECT = new VirtualCurrencyPack(//аналогично
                        "PACK_2",                                                                             
                        "",                                                                                           
                        PACK_2,
                        200, 
                        ITEM_ID ,
                        new PurchaseWithMarket(PACK_2, 5.99)
                        );
        }


Благодаря комментариям более или менее все понятно, но я пропустил 2 вещи это виртуальные 'блага' и категории, они в основе нужны тем, кто хочет отслеживать продажу даже простых виртуальных покупок, не за реальные деньги, а даже за ту валюту, которую вы продаете за реальные деньги через личных кабинет сумлы, о котором мы поговорим позже.

Итак, мы прописали все наши внутриигровые покупки, но как же теперь передать эти данные плагину и как же совершать покупки?

А это весьма просто:

Инициализация Soomla
using Soomla;
using Soomla.Store;

public class Test {
        
        public Test () {

                SoomlaStore.Initialize (new dataIAP ());//Передаем при инициализации наш объект с данными о паках

        #if UNITY_ANDROID
                SoomlaStore.StartIabServiceInBg (); //Обязательно для Android, без этого ничего работать не будет
                #endif
        }

        public void PayPack_1()
        {
                SoomlaStore.BuyMarketItem (StoreInfo.CurrencyPacks [0].ItemId, "");//Купить первый пак
        }

        public void PayPack_2()
        {
                SoomlaStore.BuyMarketItem (StoreInfo.CurrencyPacks [1].ItemId, "");//Купить второй пак
        }

    public void Quit()
        {
                SoomlaStore.StopIabServiceInBg ();
        }
}



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

События
using System;
using System.Collections.Generic;
using Soomla;
using Soomla.Store;

public class ExampleEventHandler {

        //Подписка на события при создании объекта класса
        public ExampleEventHandler () {
                //Вызывается, когда покупка за реальные деньги совершена
                StoreEvents.OnMarketPurchase += onMarketPurchase;
                //Вызывается, когда покупка за внутриигровую валюту совершена
                StoreEvents.OnItemPurchased += onItemPurchased;
                //Вызывается, если система покупок поддерживается
                StoreEvents.OnBillingSupported += onBillingSupported;
                //Вызывается, если система покупок не поддерживается
                StoreEvents.OnBillingNotSupported += onBillingNotSupported;
                //Вызывается, когда начата покупка за реальные деньги
                StoreEvents.OnMarketPurchaseStarted += onMarketPurchaseStarted;
                //Вызывается, когда начата покупка за внутриигровую валюту
                StoreEvents.OnItemPurchaseStarted += onItemPurchaseStarted;
                //Вызывается, когда покупка за реальные деньги отменена
                StoreEvents.OnMarketPurchaseCancelled += onMarketPurchaseCancelled;
                //Вызывается, когда магазин инициализирован
                StoreEvents.OnSoomlaStoreInitialized += onSoomlaStoreInitialized;
                //Вызывается, когда появился внутрянняя ошибка Soomla
                StoreEvents.OnUnexpectedStoreError += onUnexpectedStoreError;

                //Только для андроид
#if UNITY_ANDROID && !UNITY_EDITOR
                StoreEvents.OnIabServiceStarted += onIabServiceStarted;
                StoreEvents.OnIabServiceStopped += onIabServiceStopped;
#endif
        }
        public void onUnexpectedStoreError(int errorCode) {
                SoomlaUtils.LogError ("ExampleEventHandler", "error with code: " + errorCode);
        }
        public void onMarketPurchase(PurchasableVirtualItem pvi, string payload, Dictionary extra) {

        }
        public void onItemPurchased(PurchasableVirtualItem pvi, string payload) {

        }
        public void onBillingSupported() {

        }
        public void onBillingNotSupported() {

        }
        public void onMarketPurchaseStarted(PurchasableVirtualItem pvi) {

        }
        public void onItemPurchaseStarted(PurchasableVirtualItem pvi) {

        }
        public void onMarketPurchaseCancelled(PurchasableVirtualItem pvi) {

        }
        public void onCurrencyBalanceChanged(VirtualCurrency virtualCurrency, int balance, int amountAdded) {

        }
        public void onSoomlaStoreInitialized() {
                
        }

#if UNITY_ANDROID && !UNITY_EDITOR
        public void onIabServiceStarted() {

        }
        public void onIabServiceStopped() {

        }
#endif
}

Вот и все, система полностью готова к работе.

Но теперь немного о личном кабинете Soomla. Там вы можете отслеживать все транзакции ваших пользователей, как с реальными деньгами, так и с внутриигровой валютой, для того и нужны блага и категории, чтобы проще было все отслеживать, но для работы с этой вещью нужно еще поработать с Soomla Highway. Но эта статья не об этом.

И пару слов о тестировании. Тестировать покупки на android просто, залили билд, к примеру, для бета теста и тестируйте на здоровье, но вот на ios обязательно создайте аккаунт для sandbox:
8c5a2a654bc2401f9e9d0b6b94da0db1.png

© Habrahabr.ru