10.1.0
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Пример реализации
Ознакомьтесь с приложением-примером, чтобы узнать, как правильно интегрировать SDK платежей.
Подключение в проект
Установка плагинов
- Установка через Package Manager
- Установка через .unitypackage
- Клонирование репозитория
Для подключения скачайте со страницы релизов пакеты:
ru.rustore.core-version.tgzru.rustore.pay-version.tgz
Импортируйте пакеты в проект через Package Manager (Window → Package Manager → + → Add package from tarball...).
Если вы используете операционную систему macOS, измените настройки утилиты архивации. В настройках Archive Utility снимите флажок Keep expanding if possible. В противном случае архив проекта будет скачан некорректно.
Для подключения скачайте файл RuStoreUnityPaySDK-version.unitypackage со страницы релизов и импортируйте его в проект (Assets → Import Package → Custom Package). Зависимости подключаются автоматически с помощью External Dependency Manager (включен в .unitypackage).
Если вы используете операционную систему MacOS, измените настройки утилиты архивации. В настройках Archive Utility снимите флажок Keep expanding if possible. В противном случае архив проекта будет скачан некорректно.
Репозиторий содержит исходный код плагина и демонстрационный проект, содержащий представление работы всех методов SDK.
Не используйте кнопку "Код → Скачать" на сайте GitFlic – этот метод не загружает файлы из Git LFS.
Перед клонированием репозитория скачайте и установите инструменты:
После установки выполните в командной строке:
git lfs install
Для клонирования репозитория воспользуйтесь набором команд:
git clone https://gitflic.ru/project/rustore/unity-rustore-pay-sdk.git
cd unity-rustore-pay-sdk
git lfs pull
Для корректной обработки зависимостей SDK выполните следующие настройки.
-
Откройте настройки проекта: Edit → Project Settings → Player → Android Settings.
-
В pазделе Publishing Settings включите следующие настройки.
- Custom Main Manifest.
- Custom Main Gradle Template.
- Custom Gradle Properties Template.
-
В разделе Other Settings настройте:
- package name.
- Minimum API Level = 24.
- Target API Level = 34.
Подключение зависимостей
- Автоматическое подключение зависимостей
- Ручное подключение зависимостей
Зависимости Android-сборки подключаются автоматически с помощью инструмента External Dependency Manager.
Для автоматического решения зависимостей воспользуйтесь командой: Assets → External Dependency Manager → Android Resolver → Force Resolve. Эту операцию следует выполнять каждый раз при добавлении новых версий плагинов или пересоздании файлов Assets / Plugins / Android / mainTemplate.gradle и Assets / Plugins / Android / settingsTemplate.gradle.
-
При установке плагинов RuStore через *.unitypackage External Dependency Manager не требует специальной установки.
-
При установке плагинов RuStore через Package Manager выполните следующие действия:
- Откройте вкладку плагина RuStore Core в окне менеджера пакетов: Window → Package Manager → Packages RuStore → RuStore Core.
- Перейдите на вкладку Samples.
- Импортируйте сэмпл External Dependency Manager.
-
Последнюю версию External Dependency Manager также можно получить из репозитория разработчика на GitHub:
- Откройте окно менеджера пакетов: Window → Package Manager → + → Add package from git URL....
- Используйте ссылку https://github.com/googlesamples/unity-jar-resolver.git?path=/upm для подключения пакета.
- Для устранения ошибки "Google.IOSResolver.dll will not be loaded" установите модуль сборки iOS для вашей версии Unity: UnityHub → Installs → Ваша версия Unity → Add modules → iOS Build Support.
Assembly 'Packages/com.google.external-dependency-manager/ExternalDependencyManager/Editor/1.2.182/Google.IOSResolver.dll' will not be loaded due to errors:
Unable to resolve reference 'UnityEditor.iOS.Extensions.Xcode'. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.
- Откройте файл mainTemplate.gradle: Assets / Plugins / Android / mainTemplate.gradle. В секции dependencies добавьте строки:
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'ru.rustore.sdk:pay:x.y.z'
Пример оформления секции dependencies:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'ru.rustore.sdk:pay:x.y.z'
}
где x.y.z – номер версии пакета SDK.
- Откройте файл settingsTemplate.gradle: Assets / Plugins / Android / settingsTemplate.gradle. В секции dependencyResolutionManagement repositories добавьте строки:
maven {
url "https://artifactory-external.vkpartner.ru/artifactory/maven"
}
Пример оформления секции dependencyResolutionManagement repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
google()
mavenCentral()
def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/")
maven {
url "https://artifactory-external.vkpartner.ru/artifactory/maven"
}
mavenLocal()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
}
}
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию. Сама инициализация происходит автоматически, но для работы SDK в вашем файле Manifest.xml необходимо прописать console_app_id_value и internal_config_key. Оба значения должны располагаться внутри тега <application>
<!-- Initializing sdk -->
<meta-data android:name="console_app_id_value" android:value="@string/rustore_PayClientSettings_consoleApplicationId" />
<meta-data android:name="internal_config_key" android:value="@string/rustore_PayClientSettings_internalConfigKey" />
console_app_id_value — идентификатор приложения из RuStore консоли.
Где в RuStore Консоль отображаются идентификаторы приложений?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между
apps/и/versions. Например, для URL-адресаhttps://console.rustore.ru/apps/123456/versionsID прилож ения —123456.

Package Name приложения, указанный в Edit → Project Settings... → Player > Android → Other Settings → Package Name, должен совпадать с Package Name APK-файла, который вы публиковали в системе RuStore Консоль.
Значение console_app_id_value задается в файле PayClientSettings.assets. Чтобы создать файл PayClientSettings.assets, в меню редактора Unity выберите пункт: Window → RuStore SDK → Settings → PayClient.
Значение internal_config_key задается в файле PayClientSettings.assets автоматически.
Не задавайте значения console_app_id_value и internal_config_key напрямую в манифесте. Строки должны располагаться в файле ресурсов, который генерируется автоматически на основе данных PayClientSettings.assets.
Обработка deeplink
Deeplink в RuStore SDK платежей нужна для корректной работы со сторонними приложениями оплаты. Она помогает пользователям быстрее совершать покупки в стороннем приложе нии и возвращаться в ваше приложение.
Для настройки deeplink в вашем приложении выполните три основных шага:
1. Создайте и настройте класс активити для обработки deeplink.
- Создайте файл
RuStoreIntentFilterActivity.javaи разместите его внутри папкиAssetsвашего проекта. - Реализуйте логику класса
RuStoreIntentFilterActivity, используя приведённый ниже код.
- Имя класса должно совпадать с именем java-файла.
- Допускаются только символы в кодировке ASCII. Формат должен соответствовать спецификации RFC-3986.
Приведённый пример реализации RuStoreIntentFilterActivity:
- Обрабатывает входящий
intentс платежными данными. - Передает управление основной активити (например,
UnityPlayerActivity).
package ru.rustore.unitysdk;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
import ru.rustore.unitysdk.payclient.RuStoreUnityPayClient;
import ru.rustore.sdk.pay.model.SdkTheme;
public class RuStoreIntentFilterActivity extends Activity {
private final Class<?> UNITY_PLAYER_ACTIVITY_CLASS = UnityPlayerActivity.class;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
RuStoreUnityPayClient.INSTANCE.proceedIntent(getIntent());
}
if (!isTaskRoot()) {
finish();
return;
}
startGameActivity();
finish();
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
RuStoreUnityPayClient.INSTANCE.proceedIntent(intent);
}
private void startGameActivity() {
Intent intent = new Intent(this, UNITY_PLAYER_ACTIVITY_CLASS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
Параметры метода proceedIntent:
Intent intent— интент, содержащий данные о платежной операции.SdkTheme sdkTheme— цветовая тема платежной шторки. Доступны два вариантаLIGHTиDARK(светлая и темная тема соотвественно), по умолчаниюLIGHT(необязательный параметр).Long maxRetryTimeMs— максимальное время (в миллисекундах) для повторных попыток инициализации платёжного клиента, по умолчанию 5000 мс (необязательный параметр).
2. Обновите AndroidManifest.xml.
- Создайте deeplink-активити
ru.rustore.unitysdk.RuStoreIntentFilterActivityс темойTheme.NoDisplay. - Перенесите запускающий
intent-filter(MAINиLAUNCHER) из игровой активити в deeplink-активити. - Создайте тег
intent-filterвнутри deeplink-активити с указанием ссылки на вашуDeeplink Scheme. - Создайте тег
meta-dataвнутри<application>с указанием ссылки на вашуDeeplink Scheme.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!-- 1. Deeplink Activity -->
<activity android:name="ru.rustore.unitysdk.RuStoreIntentFilterActivity"
android:theme="@android:style/Theme.NoDisplay"
android:exported="true">
<!-- 2. Starting intent-filter -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 3. Deeplink intent-filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/rustore_PayClientSettings_deeplinkScheme" />
</intent-filter>
</activity>
<!-- Initializing SDK -->
<meta-data android:name="console_app_id_value" android:value="@string/rustore_PayClientSettings_consoleApplicationId" />
<meta-data android:name="internal_config_key" android:value="@string/rustore_PayClientSettings_internalConfigKey" />
<!-- 4. Deeplink Scheme -->
<meta-data android:name="sdk_pay_scheme_value" android:value="@string/rustore_PayClientSettings_deeplinkScheme" />
<!-- Game Activity -->
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:exported="true">
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<!--
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
-->
</activity>
</application>
</manifest>
3. Укажите Deeplink Scheme в настройках Unity.
- В редакторе Unity выберите пункт: Window → RuStore SDK → Settings → PayClient.
- В открывшемся инспекторе найдите поле
Deeplink Schemeи укажите в нем уникальную для вашего приложения схему (например, yourappscheme).
Не задавайте значение deeplinkScheme напрямую в манифесте. Строка должна располагаться в файле ресурсов, который генерируется автоматически на основе данных PayClientSettings.assets.
Работа с SDK
Доступные публичные методы:
GetPurchase— позволяет получить информацию о покупке по её ID.GetPurchases— позволяет получить покупки пользователя. Данный метод поддерживает опциональную фильтрацию по типу товаров (потребляемые или непотребляемые товары), а также по статусу покупки (поддерживаются статусыPAIDиCONFIRMED). По умолчанию фильтры отключены, и вернутся все покупки пользователя (независимо от типа товара) в статусахPAIDиCONFIRMED.GetPurchaseAvailability— возвращает результат доступности работы с платежами.Purchase— позволяет совершить покупку продукта с указанием желаемого типа оплаты - одностадийной (ONE_STEP) или двухстадийной (TWO_STEP). Для данного метода оплаты на платёжной шторке доступны все способы оплаты. Если параметр не задан, по умолчанию запускает ся с оплатой в одну стадию.
Если указан тип оплаты TWO_STEP, будет произведена попытка запустить двухстадийную оплату, но итоговый результат напрямую будет зависеть от того, какой способ оплаты (карта, СБП и др.) будет выбран пользователем. Двухстадийная оплата доступна только для определенного набора способов оплаты (на текущий момент — только для карт). Технологии СБП не поддерживают двухстадийную оплату. Если выбран способ оплаты, который не поддерживает холдирование, то покупка будет запущена по сценарию с одной стадией.
PurchaseTwoStep— запускает сценарий гарантированной двухстадийной покупки товара. При использовании данного метода пользователю на платёжной шторке доступен ограниченный набор способов оплаты — только те, которые поддерживают двухстадийную оплату. В про цессе платежа сначала осуществляется холдирование денежных средств покупателя, которые списываются только после подтверждения покупки методомConfirmTwoStepPurchase.ConfirmTwoStepPurchase— подтверждение покупки, совершенной по двухстадийной оплате.CancelTwoStepPurchase— отмена покупки, совершённой по двухстадийной оплате.GetProducts— позволяет получить информацию по активным продуктам, опубликованным в RuStore консоль.
Данный метод возвращает не более 1000 продуктов и работает без авторизации и наличия установленного RuStore на устройстве пользователя.
- блок
RuStoreCoreClient.Intstance— набор открытых методов, таких как:IsRuStoreInstalled— проверки наличия приложения RuStore на устройстве пользователя.OpenRuStoreDownloadInstruction— открывает веб-страницу для скачивания приложения RuStore.OpenRuStore— запускает приложение RuStore.OpenRuStoreAuthorization— запускает приложение RuStore для авторизации. После успешной авторизации пользователя приложение RuStore автоматически закроется.
Проверка доступности работы с платежами
Для проверки доступности платежей, вызовите метод GetPurchaseAvailability. При его вызове проверяются следующие условия.
- У компании подключена монетизация через консоль разработчика RuStore.
- Приложение не должно быть заблокировано в RuStore.
- Пользователь не должен быть заблокирован в RuStore.
PurchaseAvailabilityResult.isAvailable == true.
В противном случае возвращается PurchaseAvailabilityResult.isAvailable == false и PurchaseAvailabilityResult.cause, где cause — это ошибка о невыполненном условии (возможные ошибки описаны в разделе Список ошибок).
RuStorePayClient.Instance.GetPurchaseAvailability(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
if (result.isAvailable) {
// Process success
}
else {
// Process result.cause
}
});
Проверка статуса авторизации пользователя
Для проверки статуса авторизации пользователя, вызовите метод GetUserAuthorizationStatus. Результатом выполнения метода является значение перечисления UserAuthorizationStatus. Возможно только 2 значения:
AUTHORIZED— пользователь авторизован в RuStore.UNAUTHORIZED— пользователь неавторизован в RuStore. Данное значение также вернется если у пользователя нет установленного МП RuStore на девайсе.
RuStorePayClient.Instance.GetUserAuthorizationStatus(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
if (result == UserAuthorizationStatus.AUTHORIZED) {
// Process success
}
});