31 July 2015

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

C#Unity3D
Sandbox


В последнее время пришлось интегрировать внутриигровые покупки в свою игру и встал вопрос, а какой же плагин для этого использовать под 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:
Tags:unity3dunitysoomlaIAPin app purchase
Hubs: C# Unity3D
+13
14.1k 69
Comments 22