Store — различия между версиями

Материал из wiki.appsalutecreator.com
Перейти к: навигация, поиск
(Дополнительные сведения)
(Состояния)
 
(не показано 30 промежуточных версий 7 участников)
Строка 1: Строка 1:
Необходим для описания InApp покупок(позволяют продавать отдельные бонусы, паки и т.п.) в игре.
+
{{TOC right}}
 +
 
 +
[[Object|Объект]] '''Store''' необходим для описания InApp покупок(позволяют продавать отдельные бонусы, паки и т.п.) в игре.
  
 
== Параметры объекта Store ==
 
== Параметры объекта Store ==
Строка 5: Строка 7:
 
*'''service id''' - Идентификатор сервиса для Fortumo
 
*'''service id''' - Идентификатор сервиса для Fortumo
 
*'''app secret''' - Секретный ключ для Fortumo
 
*'''app secret''' - Секретный ключ для Fortumo
*'''group id ID''' - группы для Samsung
+
*'''group id''' - ID группы для Samsung
*'''public key''' - лицензионный ключ приложения на Google Play
+
*'''wallet''' - Объект типа [[Wallet|Wallet]]
 +
 
 +
'''Группа adjust'''
 +
*'''включить adjust''' - нет=0, да=1;
 +
*'''событие первой покупки для iOS'''
 +
*'''событие первой покупки для Ansroid'''
 +
*'''событие покупки для iOS'''
 +
*'''событие покупки для Android'''
  
 +
В store setup для покупки можно установить следующие параметры:
 +
*'''id покупки''' - внутриигровой id. По этому id в опциях хранится информация о покупке, и по этому id она совершается при совершении in-app покупки из [[Machine#buy|машины]] или по кнопке;
 +
*'''числовой id''' - уникальный идентификатор, который не должен повторяться в покупках;
 +
*'''цена''' - стоимость покупки;
 +
*'''consumable''' - флаг, сообщающий о том, одноразовая покупка (покупается навсегда) или многоразовая (расходник);
 +
*'''Subscription''' - распространяется ли покупка по подписке (работает для Google Play);
 +
*'''Обьект и состояние (успех)''' - перевести заданную машину в заданное состояние, если покупка завершилась успешно;
 +
*'''Обьект и состояние (провал)''' - перевести заданную машину в заданное состояние, если покупка по какой-то причине не завершилась;
 +
*'''Обьект и состояние (restore)''' - перевести заданную машину в заданное состояние, если покупка успешно восстановлена;
 +
*'''/platfrom/ id''' - id заведенных покупок из всевозможных сторов.
  
*'''id покупки''' - внутренний id покупки
+
==Состояния==
*'''iOS id покупки''' - id покупки в магазине Apple для iOS версии приложения
 
*'''Amazon id покупки''' - id покупки для Amazon версии приложения
 
*'''Fortumo id покупки''' - id Fortumo покупки для Android версии приложения
 
*'''Описание покупки Fortumo''' - отбражаемое описание покупки для Frotumo под Android
 
*'''Fortumo service Id''' - берутся с сайта фортумо (их видно в свойствах покупки)
 
*'''Fortumo appSecret''' - берутся с сайта фортумо (их видно в свойствах покупки)
 
*'''Samsung Item ID''' - id покупки в самсунговском маркете
 
*'''Wild Tangent Product Name''' - имя продукта в маркете Wild Tangent(берётся из сайта Wild Tangent)
 
*'''Wild Tangent Partner Name''' - имя партнера в маркете Wild Tangent(берётся из сайта Wild Tangent)
 
*'''Wild Tangent Site Name''' - имя сайта в маркете Wild Tangent(берётся из сайта Wild Tangent)
 
*'''Wild Tangent Game Name''' - имя игры в маркете Wild Tangent(берётся из сайта Wild Tangent)
 
*'''Google Product ID''' - ID покупки на Google Play [[http://ge.absolutist.com/index.php/Store#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D1.8F]]
 
*'''Расходуемая''' - 1 - покупка расходуемая, 0 - покупка раз и навсегда
 
*'''объект (restore)''' - объект - Слушатель восстановления покупки. Этому объекту будет сообщено об успехе восстановления этой покупки покупки.
 
*'''состояние (restore)''' - Это состояние будет установлено объекту при успешном восстановлении этой покуки
 
  
 +
*'''purchase''' - совершить покупку, взяв ее идентификатор (внутренний id) из параметра ''productBundle''
  
*'''успех restore''' - Выполняется когда хотя бы одна покупка успешно восстановлена.
+
==Создание, совершение и восстановление покупок==
:'''объект''' - Объект  - состояние которого меняем. Этому объекту будет сообщено о завершении восстановления покупок.
 
:'''состояние''' - Это состояние будет установлено объекту при завершении восстановления покупок.
 
  
*'''ошибка restore''' - выполняется, когда произошла ошибка при восстановлении покупок
+
===Создание===
:'''объект''' - Объект  - состояние которого меняем. Этому объекту будет сообщено об ошибке восстановления покупок.
 
:'''состояние''' - Это состояние будет установлено объекту при ошибке восстановления покупок.
 
  
*'''пусто restore''' - выполняется когда нет покупок для восстановления
+
'''Шаг 1.''' Создание объекта Store.
:'''объект''' - Объект  - состояние которого меняем. Этому объекту будет сообщено об отсутствии покупок для восстановления.
+
На глобальном экране (например, там, где находятся [[options]]) создать объект [[store]]. Для этого на сцене ПКМ (правой кнопкой мыши), из выпадающего меня выбрать "создать объект сцены в текущем объекте". У созданного объекта изменить тип объекта на [[store]]. В поле ''имя'' вводим уникальное имя (приучаем себя к порядку в проекте).
:'''состояние''' - Это состояние будет установлено объекту при отсутствии покупок для восстановления.
+
<center>
 +
[[Файл:store_new.png]]
 +
</center>
  
== Задание in-app идентификаторов ==
+
'''Шаг 2.''' Создание покупки.
 +
* Нажимаем дважды на обьект '''Store''' в дереве обьектов. Перед нами появляется окно с настройками покупок. Чтобы добавить новую покупку, нажмите на кнопку-плюсик в верхней части экрана рядом с выпадающим списком. Появится чистая незаполненная покупка.
  
Прежде всего необходимо определить in-app идентификаторы.
+
'''!!! Обязательным параметром является ''внутренний id покупки'' - это уникальный идентификатор покупки в проекте.!!!'''
Для этого необходимо:
+
* В первом поле "'''id покупки'''" записываем строковый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки. '''!!!Недопустимо начинать внутренний id покупки с числа!!!'''
* поместить на глобальное окно (например, там, где находятся [[options]]) объект [[store]]. Для этого, на сцену этого окна перетаскивается любая картинка или создаётся новый объект в сцене и у него меняется тип объекта на [[store]].
+
* В следующем поле идет числовой id покупки, обычно он заполняется порядковым числом покупки.
* в настройках свойств этого объекта нажимаем правую кнопку мыши и добавляем раздел "'''in-app покупка'''", кликая на который, в окне помечаем галочку у "внутренний id покупки" и необходимых полей(для ios - ios id покупки, для amazon - amazon id покупки и другие). Можно выбирать сразу несколько систем in-app покупок - при сборке в зависимости от платформы и целевого маркета на устройстве будут использованы соответствующие покупки.
+
* В поле "Цена" мы заносим цену покупки.
* В первом поле "'''id покупки'''" записываем текстовый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки.
+
* В поле "Consumable" мы укзываем, является наша покупка расходуемым предметом или же она покупается на всю игру.
* Во втором поле, в примере "'''iOS id покупки'''", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем.
+
* После идут обработчики событий типа "машина-состояние". События всего 3: успех покупки, ошибка при покупке, восстановление покупки. При одном из этих событий обьект Store установит указанную машину в указанное состояние. Это можно использовать, например, чтобы в состоянии начислить игроук предметы, открыть какое-то окно и т.д.
* Далее, таким же образом, добавляется следующий инап.  
+
* Далее, в примере "'''iOS id покупки'''", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем. Эти идентификаторы можно получить у маркетологов, или узнать в сторе, если вы сами делаете игру. Чтобы тестировать покупку во вьювере, пока идентификатора у вас нет, можно заполнить поля другими значениями, неавжно какими, но они должны быть уникальны для покупки, например, скопировать айдишник покупки в поля, на которые вы ориентируетесь.
В результате, окно настроек объекта будет выглядеть примерно таким образом:
+
* Далее, таким же образом, добавляется следующий инап. '''!!!Недопустимо использовать одинаковый идентификатор инапа из стора в разных внутренних покупках!!!'''
 
<center>
 
<center>
[[Файл:store1.png]]
+
[[Файл:StoreNew.jpg]].
 
</center>
 
</center>
  
Для IOS также используется восстановление покупок. В полях "объект (restore)" и "состояние (restore)" in-app покупки указывается машина и состояние в которое её надо перевести, если придёт сообщение, о том, что данная покупка должна быть восстановлена.
+
===Совершение покупки===
 +
 
 +
Для инициации процесса покупки существует несколько способов.
 +
 
 +
'''Способ 1.''' По нажатию на кнопку.
 +
В кнопке добавляется свойство "'''совершить in-app покупку'''" (как обычно, ПКМ). В нем отмечается галкой поле ''внутренний id покупки'' - тот же, что и "id покупки" в объекте [[store]]. По нажатию на эту кнопку произойдет обращение к магазину.
 +
 
 +
'''Способ 2.''' Из машины состояний.
 +
В машине состояний выбрать команду '''in-app совершить in-app покупку''', в ней отметить галкой поле ''внутренний id покупки'' по аналогии с кнопкой. При вызове нужного состояния машине будет произведено обращение к магазину.
  
Параметры "успех restore", "ошибка restore" и "пусто restore" используются в общем по приходу сообщений о восстановлении. Тесть если пришло сообщение в восстановлении 2-х покупок, то переведутся в указанные состояние 2 машины в покупках, которые необходимо восстановить, и переведётся машина в "успех restore" в указанное состояние. Если придёт сообщение о ошибке восстановления или о том что нет покупок для восстановления , то машины в "ошибка restore" и "пусто restore" переведутся в указанные состояние соответственно.
+
===Обработчики покупки===
 +
Перед вызовом обработчика успеха объект пишет в шапку опций параметры:
 +
*'''store_last_purchase_id''' - внутренний id совершённой покупки
 +
*'''store_last_purchase_date''' - дата последней покупки
  
== Использование InApp идентификаторов ==
 
  
Если из игры необходимо инициировать процесс покупки, в результате нажатия на кнопку,
+
'''Обработка успеха'''
этой кнопки добавляется раздел "'''совершить in-app покупку'''" (как обычно, правой кнопкой мыши).
+
Если игрок произвел покупку, то объект, заданный в поле этой покупки объекта Store ''объект (успех)'' будет переведен в состояние ''состояние (успех)''. В этом объекте (обычно [[Machine|машина состояний]]) может быть активированы некоторые действия (например, спрятаны замочки, блокирующие продаваемый бонус). Одновременно с этим, в раздел опций который соответствует полю "внутренний id покупки" будет записано значение "1" (покупка совершена). Это поле может в дальнейшем вычитываться различными игровыми объектами.
В нем отмечаются галочками поля:
+
Если в объекте Store указан объект Wallet, и начисление ресурсов покупки происходит через него, то начисление произойдет автоматически при успехе покупки.
* внутренний id покупки - тот же, что и "id покупки" в объекте [[store]]
 
* объект - слушатель успеха
 
* состояние успеха
 
* объект - слушатель неудачи
 
* состояние неудачи
 
После нажатия на эту кнопку произойдет обращение к магазину. В этот момент поверх экрана игры будет рисоваться клип прогресса, определяемый в [[options]] (такой же, как и при переходах между экранами).
 
  
Если игрок произвел покупку, объект, заданный в поле "'''объект (успех)'''" будет переведен в состояние "'''состояние (успех)'''" (третье поле). В этом объекте (обычно [[Machine|машина состояний]]) может быть активированы некоторые действия (например, спрятаны замочки, блокирующие продаваемый бонус). Одновременно с этим, в раздел опций который соответствует полю "внутренний id покупки" будет записана 1 (покупка совершена). Это поле может в дальнейшем вычитываться различными игровыми объектами.
+
'''Обработка ошибки'''
 +
Если покупка не была совершена (нет интернета, игрок не стал её делать и т.п.), то спустя некоторое время  ''объект (провал)'' будет переведен в ''состояние (провал)''. В этом объекте можно, например, открыть окно, сообщающее, что покупка не может быть произведена и инап не активирован.
 +
В основном для обработки ошибок используется объект [[Errormanager|Errormanager]].
  
Если покупка не была совершена (нет интернета, игрок не стал её делать и т.п.) спустя некоторое время  "'''объект (провал)'''" будет переведен в "'''состояние (провал)'''". В этом объекте можно, например, открыть окно, сообщающее, что покупка не может быть произведена и инап не активирован.
+
===Типы ошибок при совершении покупки===
 +
 
 +
0 - Unknown error
 +
 
 +
1 - Client is not allowed to make the payment
 +
 
 +
2 - Client canceled purchase
 +
 
 +
3 - Invalid parameter/purchase ID
 +
 
 +
4 - Device is not allowed to make the payment
 +
 
 +
5 - No internet connection ( нет сети )
 +
 
 +
6 - No internet connection ( нет интернета )
 +
 
 +
7 - The service is not available for some reason (Услуга временно не доступна)
 +
 
 +
8 - Purchase restore failed (Восстановить покупку не возможно)
 +
 
 +
код ошибки находится в объекте типа options в параметре store.lastError
 +
 
 +
В данный момент для IOS работает возврат всех ошибок, для других платформ "неизвестная ошибка" и "отсутствие интернета".
 +
 
 +
 
 +
===Восстановление покупок===
 +
 
 +
В некоторых магазинах используется восстановление покупок автоматически. В Apple Store для восстановления нерасходуемых покупок нужно вызвать состояние ''restore''.
 +
 
 +
В полях "объект (restore)" и "состояние (restore)"  in-app покупки указывается машина и состояние в которое её надо перевести, если придёт сообщение, о том, что данная покупка должна быть восстановлена.
 +
 
 +
Обработчики "успех restore", "ошибка restore" и "пусто restore" используются в общем по приходу сообщений о восстановлении. Т.е. если пришло сообщение в восстановлении 2-х покупок, то переведутся в указанные состояние 2 машины в покупках, которые необходимо восстановить, и переведётся машина в "успех restore" в указанное состояние. Если придёт сообщение о ошибке восстановления или о том что нет покупок для восстановления , то машины в "ошибка restore" и "пусто restore" переведутся в указанные состояние соответственно.
 +
 
 +
===Восстановление покупки через патч опций===
 +
 
 +
Если возникла необходимость восстановить покупку методом патча опций, то процедура следующая:
 +
* патчем записываем в опции в некий параметр строку ''внутренний id покупки'';
 +
* машиной состояний вычитываем эту строку и записываем в параметр ''productBundle'' и вызываем состояние ''purchase''.
 +
 
 +
В итоге получаем успех совершенной покупки.
  
 
== Пример InApp-a==
 
== Пример InApp-a==
Строка 119: Строка 168:
 
== Дополнительные сведения ==
 
== Дополнительные сведения ==
  
* Для работы покупок на Google Play необходимо добавить разрешение
+
===Покупки Google Play===
 +
 
 +
* Для работы покупок на Google Play необходимо добавить разрешения:
 
<pre>
 
<pre>
  
Строка 125: Строка 176:
  
 
</pre>
 
</pre>
 +
  
 
* Для получения ID покупки на Google Play необходимо сначала загрузить apk с разрешением покупок
 
* Для получения ID покупки на Google Play необходимо сначала загрузить apk с разрешением покупок
  
* Разрешения записываются в AndroidManifest.xml, который находится обычно в каталоге %s3e_dir%\deploy\plugins\android. Также можно вместо AndroidManifest.xml вносить соответствующие настройки в android-extra-application-manifest.xml и android-extra-manifest.xml, которые находятся в каталоге %каталог_редактора%\system\marmalade\conf\%марект%(к примеру android)
+
* Разрешения записываются в AndroidManifest.xml, который находится обычно в каталоге %s3e_dir%\deploy\plugins\android. Также можно вместо AndroidManifest.xml вносить соответствующие настройки в android-extra-manifest.xml, который находится в каталоге %каталог_редактора%\system\marmalade\conf\%марект%(к примеру android)
 +
 
 +
* Для приложения с покупками на google play надо добавить лицензионный ключ приложения в app.icf в группу [AndroidLVL] и разбить его на 4 части длинной не более 100 знаков. Также добавить для бесплатного приложения параметр ''free_app=1''
 +
<pre>
 +
[AndroidLVL]
 +
base64_public_key_1=""
 +
base64_public_key_2=""
 +
base64_public_key_3=""
 +
base64_public_key_4=""
 +
free_app=1
 +
</pre>
 +
 
 +
* Для корректной обработки покупок в случае неожиданного закрытия приложения(например во время открытого системного окна с процессом покупки пользователь сворачивает всё и закрывает приложение), необходимо добавить восстановление покупок для всех типов покупок. Таким образом если покупка произошла успешно, но в приложение не попали, при следующем запуске пользователю зачислится то что он купил.
 +
 
 +
===Настройка маркета действующих покупок===
 +
 
 +
* Для работы соостветствующего маркета на устройстве недобходимо в [[app.icf]] в секцию [Game] добавить параметр Market с значением для маркета.
 +
 
 +
магазин - значение в [[app.icf]]<br>
 +
Fortumo - fortumo<br>
 +
Samsung - samsung<br>
 +
Amazon market - amazon<br>
 +
Apple store - ios<br>
 +
Wildtangent - wildtangent<br>
 +
Windows Store - wp8<br>
 +
Blackberry - blackberry<br>
 +
Google Play - android<br>
 +
 
 +
Пример:
 +
<pre>
 +
[Game]
 +
Market="ios"
 +
</pre>
 +
 
 +
 
 +
 
 +
===Trial период в Windows Phone 8===
 +
* Для windows phone 8 есть возможность работы в пробном режиме. То есть пользователь может пользоваться платным приложением или некоторое время или с ограниченными возможностями.
 +
 
 +
 
 +
"The trial/full state of a user’s execution rights for an app are maintained in a license. When a user tries your app, it is installed on their phone along with a license that grants them the right to try the app. Trial licenses do not expire but when a user purchases an app they have been trying a full license is downloaded. The full license replaces the trial license and grants full rights to the app."
 +
 
 +
[http://msdn.microsoft.com/library/windowsphone/develop/ff967558%28v=vs.105%29.aspx Creating trial apps for Windows Phone]
 +
 
 +
Данный функционал связан с объектом типа store - недоступный функционал находится за внутриигровой покупкой. Когда пользователь покупает полную версию все покупки помечаются автоматически как "купленные".
 +
 
 +
Для работы данного функционала в [[app.icf]] или [[platform.icf]] необходимо в группу <nowiki>[Game]</nowiki> поместить параметр '''''trial'''''
 +
 
 +
'''trial=0''' - без триала
 +
 
 +
'''trial=1''' - с триалом
 +
 
 +
Также что приложение имеет триальный функционал необходимо отметить в соответствующих настройках приложения при создании в магазине страницы приложения.
 +
 
 +
===Тестирование покупок для Blackberry===
 +
Для тестирования покупок на Blackberry устройствах в app.icf сборки необходимо добавить следующие строки:
 +
<pre>
 +
[Game]
 +
inappTest=1
 +
</pre>
 +
inappTest=1 - all in-app in test mode, 0 - default
 +
 
 +
 
 +
===Тестирование покупок из редактора на Viewer===
 +
Для тестирования покупок на Viewer-е в app.icf необходимо добавить следующие строки:
 +
<pre>
 +
[Game]
 +
purchaseEverything=1
 +
</pre>
 +
 
 +
 
 +
[[Category:Options]]

Текущая версия на 07:16, 24 сентября 2019

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

Параметры объекта Store

  • service id - Идентификатор сервиса для Fortumo
  • app secret - Секретный ключ для Fortumo
  • group id - ID группы для Samsung
  • wallet - Объект типа Wallet

Группа adjust

  • включить adjust - нет=0, да=1;
  • событие первой покупки для iOS
  • событие первой покупки для Ansroid
  • событие покупки для iOS
  • событие покупки для Android

В store setup для покупки можно установить следующие параметры:

  • id покупки - внутриигровой id. По этому id в опциях хранится информация о покупке, и по этому id она совершается при совершении in-app покупки из машины или по кнопке;
  • числовой id - уникальный идентификатор, который не должен повторяться в покупках;
  • цена - стоимость покупки;
  • consumable - флаг, сообщающий о том, одноразовая покупка (покупается навсегда) или многоразовая (расходник);
  • Subscription - распространяется ли покупка по подписке (работает для Google Play);
  • Обьект и состояние (успех) - перевести заданную машину в заданное состояние, если покупка завершилась успешно;
  • Обьект и состояние (провал) - перевести заданную машину в заданное состояние, если покупка по какой-то причине не завершилась;
  • Обьект и состояние (restore) - перевести заданную машину в заданное состояние, если покупка успешно восстановлена;
  • /platfrom/ id - id заведенных покупок из всевозможных сторов.

Состояния

  • purchase - совершить покупку, взяв ее идентификатор (внутренний id) из параметра productBundle

Создание, совершение и восстановление покупок

Создание

Шаг 1. Создание объекта Store. На глобальном экране (например, там, где находятся options) создать объект store. Для этого на сцене ПКМ (правой кнопкой мыши), из выпадающего меня выбрать "создать объект сцены в текущем объекте". У созданного объекта изменить тип объекта на store. В поле имя вводим уникальное имя (приучаем себя к порядку в проекте).

Store new.png

Шаг 2. Создание покупки.

  • Нажимаем дважды на обьект Store в дереве обьектов. Перед нами появляется окно с настройками покупок. Чтобы добавить новую покупку, нажмите на кнопку-плюсик в верхней части экрана рядом с выпадающим списком. Появится чистая незаполненная покупка.

!!! Обязательным параметром является внутренний id покупки - это уникальный идентификатор покупки в проекте.!!!

  • В первом поле "id покупки" записываем строковый идентификатор инапа. Это может быть любая строка, уникальная для каждого инапа. Если в строке встречаются точки, то информация о покупках будет сохранятся в поддиректориях опций. Эта строка будет использоваться в игре объектами для выяснения того, была ли уже проведена покупка или нет и для совершения покупки. !!!Недопустимо начинать внутренний id покупки с числа!!!
  • В следующем поле идет числовой id покупки, обычно он заполняется порядковым числом покупки.
  • В поле "Цена" мы заносим цену покупки.
  • В поле "Consumable" мы укзываем, является наша покупка расходуемым предметом или же она покупается на всю игру.
  • После идут обработчики событий типа "машина-состояние". События всего 3: успех покупки, ошибка при покупке, восстановление покупки. При одном из этих событий обьект Store установит указанную машину в указанное состояние. Это можно использовать, например, чтобы в состоянии начислить игроук предметы, открыть какое-то окно и т.д.
  • Далее, в примере "iOS id покупки", записывается идентификатор этого инапа, в нашем случае на Apple Store. Аналогично для других систем. Эти идентификаторы можно получить у маркетологов, или узнать в сторе, если вы сами делаете игру. Чтобы тестировать покупку во вьювере, пока идентификатора у вас нет, можно заполнить поля другими значениями, неавжно какими, но они должны быть уникальны для покупки, например, скопировать айдишник покупки в поля, на которые вы ориентируетесь.
  • Далее, таким же образом, добавляется следующий инап. !!!Недопустимо использовать одинаковый идентификатор инапа из стора в разных внутренних покупках!!!

StoreNew.jpg.

Совершение покупки

Для инициации процесса покупки существует несколько способов.

Способ 1. По нажатию на кнопку. В кнопке добавляется свойство "совершить in-app покупку" (как обычно, ПКМ). В нем отмечается галкой поле внутренний id покупки - тот же, что и "id покупки" в объекте store. По нажатию на эту кнопку произойдет обращение к магазину.

Способ 2. Из машины состояний. В машине состояний выбрать команду in-app совершить in-app покупку, в ней отметить галкой поле внутренний id покупки по аналогии с кнопкой. При вызове нужного состояния машине будет произведено обращение к магазину.

Обработчики покупки

Перед вызовом обработчика успеха объект пишет в шапку опций параметры:

  • store_last_purchase_id - внутренний id совершённой покупки
  • store_last_purchase_date - дата последней покупки


Обработка успеха Если игрок произвел покупку, то объект, заданный в поле этой покупки объекта Store объект (успех) будет переведен в состояние состояние (успех). В этом объекте (обычно машина состояний) может быть активированы некоторые действия (например, спрятаны замочки, блокирующие продаваемый бонус). Одновременно с этим, в раздел опций который соответствует полю "внутренний id покупки" будет записано значение "1" (покупка совершена). Это поле может в дальнейшем вычитываться различными игровыми объектами. Если в объекте Store указан объект Wallet, и начисление ресурсов покупки происходит через него, то начисление произойдет автоматически при успехе покупки.

Обработка ошибки Если покупка не была совершена (нет интернета, игрок не стал её делать и т.п.), то спустя некоторое время объект (провал) будет переведен в состояние (провал). В этом объекте можно, например, открыть окно, сообщающее, что покупка не может быть произведена и инап не активирован. В основном для обработки ошибок используется объект Errormanager.

Типы ошибок при совершении покупки

0 - Unknown error

1 - Client is not allowed to make the payment

2 - Client canceled purchase

3 - Invalid parameter/purchase ID

4 - Device is not allowed to make the payment

5 - No internet connection ( нет сети )

6 - No internet connection ( нет интернета )

7 - The service is not available for some reason (Услуга временно не доступна)

8 - Purchase restore failed (Восстановить покупку не возможно)

код ошибки находится в объекте типа options в параметре store.lastError

В данный момент для IOS работает возврат всех ошибок, для других платформ "неизвестная ошибка" и "отсутствие интернета".


Восстановление покупок

В некоторых магазинах используется восстановление покупок автоматически. В Apple Store для восстановления нерасходуемых покупок нужно вызвать состояние restore.

В полях "объект (restore)" и "состояние (restore)" in-app покупки указывается машина и состояние в которое её надо перевести, если придёт сообщение, о том, что данная покупка должна быть восстановлена.

Обработчики "успех restore", "ошибка restore" и "пусто restore" используются в общем по приходу сообщений о восстановлении. Т.е. если пришло сообщение в восстановлении 2-х покупок, то переведутся в указанные состояние 2 машины в покупках, которые необходимо восстановить, и переведётся машина в "успех restore" в указанное состояние. Если придёт сообщение о ошибке восстановления или о том что нет покупок для восстановления , то машины в "ошибка restore" и "пусто restore" переведутся в указанные состояние соответственно.

Восстановление покупки через патч опций

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

  • патчем записываем в опции в некий параметр строку внутренний id покупки;
  • машиной состояний вычитываем эту строку и записываем в параметр productBundle и вызываем состояние purchase.

В итоге получаем успех совершенной покупки.

Пример InApp-a

Предположим, что в игре puzzle есть бонус, ставящий ячейку на своё место. Игроку дается возможность использовать этот бонус 3 раза за игровую сессию, после чего появляется окно на подобное этому:

Store2.png

При нажатии на крестик окно закрывается, а при нажатии на замок активируется процесс покупки.

Голубая кнопка с белым ноликом является кнопкой запуска хинта. В ней есть раздел

  • изменить состояние объекта
    • объект = puzzle (идентификатор миниигры puzzle)
    • состояние = swap (состояние котором одна из ячеек становится на свое место).

Белая цифра поверх кнопки - это счетчик counter. Его идентификатор cnt_hnt сообщается пазле (она уменьшает его значение при выполнении этого хинта). Диапазон изменения счетчика задан в пределах min=0, max=3. Начальное значение val=3. Кроме этого в счетчик правой кнопкой мыши добавлены разделы:

  • min: изменить объект
    • объект = win_buy_hint
    • состояние = open
  • minIf: условие изменения min
    • куплено = buy.hint
    • not = 1

Эти разделы означают, что при достижении счетчиком минимальной границы будет открыто окно win_buy_hint если в опциях не (поле not) отмечена покупка "buy.hint".

Заметим, что пазла puzzle выполняет этот хинт (получив состояние от кнопки), если счетчика этих хинтов нет, или он не достиг минимума, или достиг, но в нем нет выполнившегося раздела "min: изменить объект".

Само окно win_buy_hint (желтый прямоугольник) является машиной состояний в которой может быть выключен счётчик, открывается окно, закрывается окно.

У машины состояний есть 2 подобъекта - кнопки с замочком и крестиком. Крестик имеет добавленный раздел, который закрывает окно. Замок запускает процесс покупки и также закрывает окно:

  • изменить состояние объекта
    • объект = win_buy_hint
    • состояние = close
  • совершить in-app покупку
    • id покупки = buy.hint
    • объект (успех) = win_buy_hint
    • состояние (успех) = hide
    • объект (провал) = win_error
    • состояние (провал) = open

В случае успешной покупки счетчик становится невидимым (состояние hide окна). При неудаче открывается окно win_error, аналогичное win_buy_hint сообщающее об ошибке покупки хинта.

Обратим внимание, что выполнение состояний "успех" и "провал" является отложенными во времени. Они вызываются магазином, когда соответствующие события (покупка или отказ от неё) возникнут.

Дополнительные сведения

Покупки Google Play

  • Для работы покупок на Google Play необходимо добавить разрешения:

<uses-permission android:name="com.android.vending.BILLING" />


  • Для получения ID покупки на Google Play необходимо сначала загрузить apk с разрешением покупок
  • Разрешения записываются в AndroidManifest.xml, который находится обычно в каталоге %s3e_dir%\deploy\plugins\android. Также можно вместо AndroidManifest.xml вносить соответствующие настройки в android-extra-manifest.xml, который находится в каталоге %каталог_редактора%\system\marmalade\conf\%марект%(к примеру android)
  • Для приложения с покупками на google play надо добавить лицензионный ключ приложения в app.icf в группу [AndroidLVL] и разбить его на 4 части длинной не более 100 знаков. Также добавить для бесплатного приложения параметр free_app=1
[AndroidLVL]
base64_public_key_1=""
base64_public_key_2=""
base64_public_key_3=""
base64_public_key_4=""
free_app=1
  • Для корректной обработки покупок в случае неожиданного закрытия приложения(например во время открытого системного окна с процессом покупки пользователь сворачивает всё и закрывает приложение), необходимо добавить восстановление покупок для всех типов покупок. Таким образом если покупка произошла успешно, но в приложение не попали, при следующем запуске пользователю зачислится то что он купил.

Настройка маркета действующих покупок

  • Для работы соостветствующего маркета на устройстве недобходимо в app.icf в секцию [Game] добавить параметр Market с значением для маркета.

магазин - значение в app.icf
Fortumo - fortumo
Samsung - samsung
Amazon market - amazon
Apple store - ios
Wildtangent - wildtangent
Windows Store - wp8
Blackberry - blackberry
Google Play - android

Пример:

[Game]
Market="ios"


Trial период в Windows Phone 8

  • Для windows phone 8 есть возможность работы в пробном режиме. То есть пользователь может пользоваться платным приложением или некоторое время или с ограниченными возможностями.


"The trial/full state of a user’s execution rights for an app are maintained in a license. When a user tries your app, it is installed on their phone along with a license that grants them the right to try the app. Trial licenses do not expire but when a user purchases an app they have been trying a full license is downloaded. The full license replaces the trial license and grants full rights to the app."

Creating trial apps for Windows Phone

Данный функционал связан с объектом типа store - недоступный функционал находится за внутриигровой покупкой. Когда пользователь покупает полную версию все покупки помечаются автоматически как "купленные".

Для работы данного функционала в app.icf или platform.icf необходимо в группу [Game] поместить параметр trial

trial=0 - без триала

trial=1 - с триалом

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

Тестирование покупок для Blackberry

Для тестирования покупок на Blackberry устройствах в app.icf сборки необходимо добавить следующие строки:

[Game]
inappTest=1

inappTest=1 - all in-app in test mode, 0 - default


Тестирование покупок из редактора на Viewer

Для тестирования покупок на Viewer-е в app.icf необходимо добавить следующие строки:

[Game]
purchaseEverything=1