In App Purchase с помощью Soomla. Быстро и просто

от автора

В последнее время пришлось интегрировать внутриигровые покупки в свою игру и встал вопрос, а какой же плагин для этого использовать под 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’е.

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

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<string, string> 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:

ссылка на оригинал статьи http://habrahabr.ru/post/263899/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *