8.0.0 (Beta)
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Пример реализации
Ознакомьтесь с приложением-приме ром, чтобы узнать, как правильно интегрировать SDK платежей.
Подключение в проект
- Установка через .unitypackage
- Установка через Package Manager
Для подключения скачайте файл RuStoreUnityPaySDK-version.unitypackage
и импортируйте его в проект (Assets → Import Package → Custom Package). Зависимости подключаются автоматически с помощью **External Dependency Manager **(включен в .unitypackage
).
Если вы используете операционную систему MacOS, измените настройки утилиты архивации. В настройках Archive Utility снимите флажок Keep expanding if possible. В противном случае архив проекта будет скачан некорректно.
Для корректной обработки зависимостей SDK выполните следующие настройки.
Для подключения скачайте со страницы upm_tgz пакеты:
ru.rustore.core-x.y.z.tgz
ru.rustore.pay-x.y.z.tgz
Импортируйте пакеты в проект через Package Manager (Window → Package Manager → + → Add package from tarball...).
Зависимости подключаются автоматически с помощью External Dependency Manager.
- Откройте окно менеджера пакетов (Window → Package Manager → + → Add package from git URL...).
- Используйте ссылку https://github.com/googlesamples/unity-jar-resolver.git?path=/upm для подключения пакета External Dependency Manager.
- Для устранения ошибки
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.
Если вы используете операционную систему macOS, измените настройки утилиты архивации. В настройках Archive Utility снимите флажок Keep expanding if possible. В противном случае архив проекта будет скачан некорректно.
Для корректной обработки зависимостей 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.
-
Откройте настройки External Dependency Manager: Assets → External Dependency Manager → Android Resolver → Settings, включите следующие настройки.
- Use Jetifier.
- Patch mainTemplate.gradle.
- Patch gradleTemplate.properties.
-
Обновите зависимости проекта: Assets → External Dependency Manager → Android Resolver → Force Resolve.
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию. Сама инициализация происходит автоматически, но для работы SDK в вашем файле Manifest.xml
необходимо прописать console_app_id_value
и internal_config_key
.
<!-- 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" />
Оба значения должны располагаться внутри тега <application>
<?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>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</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" />
</application>
</manifest>
console_app_id_value
— идентификатор приложения из RuStore консоли.
Где в RuStore Консоль отображаются идентификаторы приложений?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между
apps/
и/versions
. Например, для URL-адресаhttps://console.rustore.ru/apps/123456/versions
ID приложения —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 в вашем приложении и RuStore SDK, укажите deeplinkScheme
внутри вашего AndroidManifest
файла и переопределите метод onNewIntent
вашего Activity
. Так же для работы SDK в вашем Manifest.xml файле необходимо прописать sdk_pay_scheme_value
.
<?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>
<activity android:name="ru.rustore.unitysdk.RuStoreUnityPayActivity"
android:theme="@style/UnityThemeSelector"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<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" />
<!-- Схема deeplink -->
<meta-data android:name="sdk_pay_scheme_value" android:value="@string/rustore_PayClientSettings_deeplinkScheme" />
</application>
</manifest>
Значение sdk_pay_scheme_value
задается в файле PayClientSettings.assets
. Чтобы создать файл PayClientSettings.assets
, в меню редактора Unity выберите пункт: Window → RuStore SDK → Settings → PayClient.
Далее расширьте класс UnityPlayerActivity
и добавьте обработку входящего intent
в onNewIntent
.
package ru.rustore.unitysdk;
import android.os.Bundle;
import android.content.Intent;
import ru.rustore.unitysdk.payclient.RuStoreUnityPayClient;
import com.unity3d.player.UnityPlayerActivity;
public class RuStoreUnityPayActivity extends UnityPlayerActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
RuStoreUnityPayClient.INSTANCE.proceedIntent(getIntent());
}
}
@Override protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
RuStoreUnityPayClient.INSTANCE.proceedIntent(intent);
}
}
Разместите Java-файл с кодом расширения UnityPlayerActivity
в папке проекта Assets
. Если у вас уже есть своё расширение UnityPlayerActivity
, перенесите в него код функций onCreate
и onNewIntent
.
Работа с SDK
Доступные публичные методы:
GetPurchase
— позволяет получить информацию о покупке по её ID.GetPurchases
— позволяет получить покупки пользователя. Данный метод поддерживает необязательную фильтрацию по типу товаров (потребляемые или непотреблямые товары). По умолчанию фильтр выключен и вернет все покупки пользователя (вне зависимости от типа товара) в статусах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.
- Пользователь и приложение не должны быть заблокированы в RuStore.
Для приложения включена возможность покупок в RuStore Консоли.
.
PurchaseAvailabilityResult.Available
.
В противном случае возвращается PurchaseAvailabilityResult.Unavailable(val cause: Throwable)
, где cause
— это ошибка о невыполненном условии. Для проверки причины возвращения такого результата нужно проверить тип ошибки на RuStoreException
(данные ошибки описаны в разделе Обработка ошибок).
RuStorePayClient.Instance.GetPurchaseAvailability(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
if (result.isAvailable) {
// Process success
}
else {
// Process result.cause
}
});
Получение списка продуктов
Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод GetProducts
.
ProductId[] ids = ...
RuStorePayClient.Instance.GetProducts(
productIds: ids,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});
ProductId[] productIds
— список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.
Где в RuStore Консоль отображаются идентификаторы продуктов?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Выберите Монетизация в меню слева.
- Выберите тип товара: Подписки или Разовые покупки.
- Скопируйте идентификаторы нужных товаров.
Метод возвращает список продуктов. Ниже представлена модель продукта.
public class Product : BaseFields {
public ProductId productId { get; }
public ProductType type { get; }
public AmountLabel amountLabel { get; }
public Price? price { get; }
public Currency currency { get; }
public Title title { get; }
public Description? description { get; }
public Url imageUrl { get; }
...
}
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).type
— тип продукта.CONSUMABLE/NON-CONSUMABE
(потребляемый/непотребляемый).amountLabel
— отформатированная цена покупки, включая валютный знак.price
— цена в минимальных единицах (в копейках).currency
— код валюты ISO 4217.title
— название продукта на языкеlanguage
.description
— описание на языкеlanguage
.imageUrl
— ссылка на картинку.
Получение списка покупок
Для получения списка покупок пользователя используйте методGetPurchases
.
RuStorePayClient.Instance.GetPurchases(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});
Метод поддерживает опциональную фильтрацию по типу товаров (потребляемые или непотребля мые товары).
RuStorePayClient.Instance.GetPurchases(
productType: ProductType.CONSUMABLE_PRODUCT,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});
По умолчанию фильтр выключен и вернет все покупки пользователя в статусах PAID и CONFIRMED. Статус PAID означает успешное холдирование средств, покупка ожидает подтверждения покупки со стороны разработчика. Ниже представлена модель покупки.
public class Purchase : BaseFields {
public PurchaseId purchaseId { get; }
public ProductId productId { get; }
public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public PurchaseType purchaseType { get; }
public ProductType productType { get; }
public Description description { get; }
public DateTime? purchaseTime { get; }
public Price price { get; }
public AmountLabel amountLabel { get; }
public Currency currency { get; }
public Quantity quantity { get; }
public PurchaseStatus status { get; }
public DeveloperPayload? developerPayload { get; }
public bool sandbox { get; }
...
}