Платёжный плагин для Defold
Введение
Монетизация с помощью встроенных покупок распространена в мобильных играх, которые предлагают премиум- подписки, продажу внутриигровых валют, предметов и т. п.
Чтобы проводить платежи через платёжную систему RuStore непосредственно из интерфейсов мобильных приложений без перенаправлений к браузерам для открытия платёжных форм, можно использовать SDK платежей RuStore (SDK RuStore Billing).
В настоящем руководстве SDK платежей и SDK RuStore Billing означают одно и то же.
Настоящее руководство содержит сведения о создании плагина-обёртки над SDK RuStore Billing для интеграции с игровым движком Defold на платформе Android. Вы ознакомитесь с внутренним устройством плагина, а также сможете воспроизвести ключевые шаги по подготовке проекта Defold — эти сведения можно использовать, чтобы создать собственное приложение для публикации в RuStore.
Приведённые в настоящем руководстве действия выполнялись в следующем окружении.
- Операционная система: Windows 11 x64.
- SDK платежей для Defold 5.1.1.
- SDK Android:
- минимальная версия ― 24;
- целевая версия ― 33.
Особенности реализации
SDK RuStore Billing предоставляет эффективный способ работы с платежами, однако он может быть сложен в использовании в игровых движках из-за того, что написан на язы ке Kotlin.
Взаимодействие системы скриптинга Defold на языке Lua с нативным SDK предполагает использование JNI (Java Native Interface), что требует громоздкой реализации вызовов и обратных вызовов (callback) JNI на C++.
Здесь мы рассмотрим удобный и гибкий способа интеграции платежных функций RuStore в приложения на игровом движке Defold на платформе Android.
В настоящем руководстве подробно рассматриваются следующие задачи.
- Создание плагина для Defold.
- Подключение нативных Android-библиотек SDK RuStore Billing.
- Создание JNI-обертки над методами SDK и их вызов из Lua.
- Создание и настройка демо-приложение для тестирования всех методов плагина.
Стек технологий
Технология | Краткое описание |
---|---|
Defold | Игровой движок. Для интеграции с внешними библиотеками в настоящей инструкции рассматривается система нативных расширений (плагинов) Defold. Шаги по создани ю плагинов описаны в официальной документации Defold, доступна русскоязычная версия документации. |
Lua | Язык для создания скриптов, встроенный в Defold и использующийся для взаимодействия с нативным SDK. Пример использования методов плагина реализуем на Lua – языке скриптинга Defold. |
Kotlin | Для реализации функциональности платежей используется библиотека SDK RuStore Billing для Kotlin/Java. |
C++ | Язык программирования общего назначения. |
JNI | Java Native Interface — интерфейс, позволяющий вызвать нативные функции SDK. Методы Defold для работы с нативом Android описаны на странице Sdk android api documentation официального сайта. Большинство методов SDK используют асинхронные вы зовы и лямбда-выражения. В JNI нет прямой поддержки лямбда-выражений, поскольку лямбда-выражения являются частью высокоуровневых конструкций языков программирования, таких как Java или Kotlin, и не имеют прямого эквивалента в нативном коде C++. Однако чтобы реализовать аналогичное поведение можно использовать указатели на функции в блоках extern "C" . В этом случае нам понадобится создать обёртку для методов SDK, которые будут принимать указатель на функцию обратного вызова (callback function) и вызывать её внутри лямбда-выражения. |
Android Studio | Писать обёртки над SDK методами для их вызова через JNI будем на Kotlin в Android Studio. |
Gradle | Удалённая сборка Defold не поддерживает использование локально расположенных пакетов .aar , но файлы .jar работают прекрасно. Для их создания с помощью Gradle реализуем распаковку наших .aar для извлечения .jar . |
RuStore Console | Консоль разработчика RuStore. Для тестирования работы плагина необходимо зарегистрироваться в RuStore Console и создать запись о приложении и тестовых продуктах доступных для покупки. |
Инструменты разработки
Для создания платёжного решения в рамках настоящего руководства необходимы следующие инструменты разработки (см. таблицу ниже).
Инструмент | Описание |
---|---|
Скачайте движок с официального сайта в разделе Download или GitHub. Установка не требуется — для работы нужно будет только запустить исполняемый файл (для Windows это 信息 В настоящем руководстве для примера используется версия Defold 1.8.0. | |
信息 В настоящем руководстве для примера используется версия Android Studio Koala 2024.1.1. | |
Java Development Kit — набор инструментов разработчика Java. В состав Android Studio включён улучшенный набор инструментов JBR. Если по каким-то причинам при использовании JBR возникнут затруднения, скача йте JDK и установите в любое место на компьютере. Рекомендуется установить по пути по умолчанию. 备注 В настоящем руководстве используется JDK версии 11.0.2, набор инструментов установлен по пути | |
У вас должен быть доступ к консоли разработчика RuStore. |
Предварительные действия
Создание файла хранилища ключей
Android требует, чтобы все установленные приложения были подписаны. Все магазины приложений также будут проверять загружаемые приложения на наличие подписи и соответствие его ранее заявленному отпечатку.
Для выполнения подписи понадобится файл хранилища ключей в формате .keystore
.
Для создания файла хранилища ключей в рамках настоящего руководства используется утилита командной строки keytool
из состава Android Studio.
Чтобы создать файл хранилища ключей, выполните следующие действия.
-
Откройте консоль (в Windows с помощью команды
cmd
). -
Перейдите в папку с утилитой
keytool
.Для WindowsЕсли программное обеспечение Android Studio установлено в папку по умолчанию, что утилита
keytool
расположена по следующему пути:c:\Program Files\Android\Android Studio\jbr\bin\keytool.exe
. -
Выполните следующую команду.
keytool -genkeypair -v -keystore key.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias key-alias
-
Вы процессе выполнения команды заполните необходимые поля (см. таблицу ниже).
Поле | Описание |
---|---|
| Введите пароль для защиты файла хранилища ключей. |
| Повторите введённый ранее пароль. 提示 Сохраните пароль в простом файле Внимание! Это небезопасный способ хранения пароля. В настоящем руководстве он используется для примера. При реализации полноценного платёжного решения руководствуйтесь рекомендациями безопасности. |
| Введите имя и фамилию, например: |
| Введите название организационного подразделения, например: |
| Введите название организации, например: |
| Введите название или обозначение города или населённого пункта, например: |
| Введите название или обозначение региона, например: |
| Введите двухбуквенный код страны, например: |
После заполнения полей вам будет предложено проверить свой ввод.
Is CN=John Doe, OU=DEV, O=ORG, L=MSK, ST=MSK, C=RU correct?
[no]:
- Введите
yes
и подтвердите ввод.
В случае успешного создания файла хранилища ключей отобразится следующее сообщение.Generating 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10 000 days
for: CN=John Doe, OU=DEV, O=ORG, L=MSK, ST=MSK, C=RU
[Storing key.keystore] - Сохраните созданный файл хранилища ключей
key.keystore
в безопасном месте — он потребуется для настройки сборки Defold-проекта под Android.
Для целей настоящего руководства будет использоваться путьc:\Defold\keystore\key.keystore
.
Если вы потеряете этот файл, то потеряете возможность обновлять загруженные в магазин приложения.
Вы создали файл хранилища ключей, и у вас есть два сохранённых файла (см. таблицу ниже).
Файл | Описание |
---|---|
key.keystore | Файл ключевого хранилища. В настоящем руководстве для примера используется путьc:\Defold\keystore\key.keystore . |
password.txt | Файл пароля ключевого хранилища и закрытого ключа. В настоящем руководстве для примера используется путьc:\Defold\keystore\password.txt . |
Эти файлы потребуются вам позднее, чтобы настроить сборку Defold-проекта платёжного решения.
Создание эмулятора Android
Создайте виртуальный эмулятор для будущего Defold-приложения со следующими параметрами, после чего переходите к созданию расширений.
Параметр | Значение |
---|---|
Архитектура | x86 |
Версия Android | 11 (максимальная для архитектуры x86) |
OpenGL ES renderer (Extended Controls) | Desktop native OpenGL — для обеспечения наилучшего быстродействия. |
OpenGL ES API level (Extended Controls) | Renderer maximum (up to OpenGL ES 3.1) — для обеспечения наилучшего быстродействия. |
Если вы не знаете, как создать виртуальный эмулятор с указанными параметрами, ниже представлена пошаговая процедура (пропустить).
-
В Android Studio откройте менеджер виртуальных устройств — Virtual Device Manager.
Virtual Device Manager -
В окне Device Manager нажмите значок
.
Отобразится окно добавлен ия виртуального устройства.
Окно добавления виртуального устройства -
В списке Category слева выберите Phone.
-
В списке в центральной части окна выберите профиль устройства.
备注В настоящей документации для примера будет использоваться Medium Phone.
-
Нажмите Next.
Отобразится окно выбора образа системы.
Выбор образа системы -
Выберите нужную систему.
警告Архитектура эмулятора должна быть x86.
备注Максимальная версия Android доступная для x86-эмуляторов — 11.
В настоящей документации для примера используется система с именем релиза Release name: R.
-
Нажмите на значке загрузки напротив выбранной системы.
Отобразится окно загрузки и установки образа системы (SDK Component Installer).
Окно загрузки и установки образа системыПо завершении установки окно примет следующий вид.
Выбор образа системы -
Нажмите Finish.
-
В окне выбора образа системы (System Image) нажмите Next.
Отобразится окно подтверждения конфигурации виртуального устройства.
Выбор образа системы -
Нажмите Finish.
Установленный образ появится в списке Device Manager основного окна Android Studio.
По завершении установки окно примет следующий вид.
Виртуальное устройство установлено信息Дальнейшая настройка эмулятора устройства Android нужна для обеспечения наилучшего быстродействия.
-
В секции Device Manager Нажмите значок Start напротив установленного виртуального устройства.
Отобразится окно виртуального эмулятора Android.
Виртуальный эмулятор Android -
Нажмите на значок
.
Отобразится окно расширенных функций контроля (Extended Controls).
Окно Extended Controls -
В левом меню перейдите в раздел Settings.
-
В разделе Settings выберите вкладку Advanced.
Окно примет следующий вид.
Окно Extended Controls -
Задайте значения полей, руководствуясь таблицей ниже.
Поле Значение OpenGL ES renderer Desktop native OpenGL OpenGL ES API level Renderer maximum (up to OpenGL ES 3.1) -
Закройте окно Extended Controls.
Создание Defold-проекта и настройка сборки под Android
-
Запустите исполняемый файл Defold.
-
Выберите шаблон Mobile game и назовите его billing_example (см. изображение ниже).
Создание проекта Defold -
При необходимости задайте путь к проекту в поле Location или оставьте путь по умолчанию.
信息В настоящем руководстве для примера будет использоваться следующий путь:
C:\Defold\billing_example
. -
Нажмите Create New Project, чтобы создать новый проект.
- Отобразится окно приветствия Welcome to Defold созданного проекта.
- Также будут созданы папки
.gitignore
и.gitattributes
для хранения проекта в репозиториях Git.
(см. изображение ниже).
Окно приветствия проекта DefoldПроект создан. Следом настройте и создайте сборку под Android (см. далее).
提示Проекты на Defold собираются нелокально — это упрощает настройку проекта для сборки под Android.
-
Откройте для редактирования как формы файл
game.project
, который расположен в корне проекта (см. изображение ниже).
Открыть как форму -
В секции Platforms выберите раздел Android (см. изображение ниже).
Открыть как форму -
В секции настроек Android выполните задайте следующие значения полей (см. таблицу ниже).
Поле Настройка Minimum Sdk Version 24 Target Sdk Version 33 Package Задайте название пакета ru.rustore.billing.defold. Настройки должны выглядеть, как показано на изображении ниже.
Настройка проекта Defold под Android -
В меню инструментов сверху выберите Project > Bundle > Android Application…, как показано на изображении ниже.
Project > Bundle > Android Application…
Отобразится окно Bundle Application.
Bundle Application -
Укажите путь к файлам, необходимым для подписи приложения (см. таблицу ниже).
Поле Описание Keystore Укажите путь к ранее подготовленному файлу хранилища ключей
key.keystore
.Keystore Password Укажите путь к ранее подготовленному файлу пароля
password.txt
.Key Password -
Убедитесь, что в настройке Architectures установлен флажок архитектуры 32-bit (armv7).
备注Чтобы приложение могло быть запущено на архитектурах 32-bit (armv7) и 64-bit (arm64), отметьте оба флажка.
-
В раскрывающемся списке Variant выберите пункт Release.
-
Снимите флажок Generate debug symbols.
Настройки должны выглядеть следующим образом.
Настройки Bundle Application -
Нажмите Create Bundle
-
В отобразившемся окне укажите папку, в которой будет размещена сборка проекта, и подтвердите выбор.
В настоящем руководстве для примера будет использоваться папкаC:\Defold
.
Если все действия были выполнены верно, по указанному пути будет создана папка сборки для Android, в нашем примере:C:\Defold\armv7-android
.
В папку armv7-android
попадают сборки как armv7
, так и arm64
.
Создание расширений
В настоящей инструкции приведены минимально необходимые настройки.
Для работы платёжного плагина необходимо создать два расширения Defold (см. таблицу ниже).
Расширение | Описание |
---|---|
RuStoreCore | Это расширение будет содержать common-код для работы со JNI и некоторыми методами для работы с Android API. Методы этого расширения смогут использовать в том числе другие плагины на основе SDK RuStore. |
RuStoreBilling | Это расширение будет содержать все необходимые настройки, исходный код, библиотеки и ресурсы, связанные с конечным плагином. Конструктор расширений автоматически распознает структуру папок и интегрирует все исходные файлы и библиотеки. |
Каждое из расширений в файловой системе, согласно документации Defold, должно иметь структуру следующего вида.
my_extension/
│
├── ext.manifest
│
├── src/
│
├── include/
│
├── lib/
│ └── [platforms]
│
├── manifests/
│ └── [platforms]
│
└── res/
└── [platforms]
Н иже представлено описание структуры расширения.
Элемент структуры | Обязательно | Описание |
---|---|---|
my_extension/ | Да | Папка расширения в корне проекта (
|
ext.manifest | Да | Файл формата YAML, который подхватывается конструктором расширений. Минимальный файл манифеста должен содержать название расширения. |
src/ | Да | Обязательная папка папка, должна содержать все файлы исходного кода в т.ч. нативный код. |
include/ | Нет | Содержит все включаемые заголовочные файлы (header files) с расширением .h . |
lib/ | Нет | Содержит все скомпилированные библиотеки, от которых зависит расширение. Файлы библиотек должны быть помещены в подпапки с именем платформы — в зависимости от того, какие архитектуры поддерживаются вашими библиотеками. |
manifests/ | Нет | Содержит дополнительные файлы, используемые в процессе сборки или комплектации. |
res/ | Нет | Содержит любые дополнительные ресурсы, от которых зависит расширение. Не используется для целей настоящей инструкции. |
Структура расширений Defold
RuStoreCore
- В корне проекта
billing_example
создайте папкуextension_rustore_core
. - Создайте файл
extension_rustore_core/ext.manifest
, который будет содержать только строку с именем расширения.extension_rustore_core/ext.manifestname: RuStoreCore
- Создайте файл
extension_rustore_core/src/rustorecore.cpp
и пока оставьте его пустым. - Создайте папку
extension_rustore_core/include
и оставьте её пока пустой. В расширении RuStoreCore мы будем создавать заголовочные файлы для классов, которые будут использоваться в других расширениях SDK RuStore. - Создайте папку
extension_rustore_core/lib/android
— в дальнейшем в неё будут помещены файлы.jar
. - Создайте файл
extension_rustore_core/manifests/android/build.gradle
Структура расширения RuStoreCore на текущем этапе должна иметь следующий вид.
extension_rustore_core/
│
├── include/
│
├── lib/
│ └── android/
│
├── manifests/
│ └── android
│ └── build.gradle
│
├── src/
│ └── rustorecore.cpp
│
└── ext.manifest
RuStoreBilling
- В корне проекта (
billing_example
) создайте папкуextension_rustore_billing
. - Создайте файл
extension_rustore_billing/ext.manifest
со следующим содержимым, который будет содержать только строчку с именем расширения.extension_rustore_billing/ext.manifestname: RuStoreBilling
- Создайте файл
extension_rustore_billing/src/rustorebilling.cpp
— этот файл будет содержать JNI-вызовы нативных методов.
Се йчас оставьте этот файл пустым — описание его содержимого будет приведено далее. - Создайте папку
extension_rustore_billing/lib/android
— в ней впоследствии нужно будет разместить созданные в дальнейшем файлы.jar
, которые будут содержать обёртку над классами из SDK RuStore billing. Эта обёртка сделает методы SDK пригодными для вызова через JNI. - Создайте файл
extension_rustore_billing/manifests/android/build.gradle
.
Структура расширения RuStoreBilling на текущем этапе должна иметь следующий вид.
extension_rustore_billing/
│
├── lib/
│ └── android/
│
├── manifests/
│ └── android
│ └── build.gradle
│
├── src/
│ └── rustorebilling.cpp
│
└── ext.manifest
Создание точек входа в расширения
Далее займёмся настройкой точек входа в расширения. Для этого Defold SDK использует макрос DM_DECLARE_EXTENSION
.