9.0.2
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Пример реализации
Ознакомьтесь с приложением-примером, чтобы узнать, как правильно интегрировать SDK платежей.
Подключение в проект
Установка плагинов
- Установка через Package Manager
- Установка через .unitypackage
Для подключения скачайте со страницы 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...).
Если вы используете операционную систему 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 выполните следующие настройки.
-
Откройте настройки проек та: 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.
Подключение зависимостей
- Автоматическое подключение зависимостей
- Ручное подключение зависимостей
Зависимости 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" />
Также, чтобы обеспечить правильное поведение платежной шторки при сворачивании приложения, игровому активити необходимо задать режим запуска android:launchMode="singleTop"
.
<?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>
<!-- Launch mode -->
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector"
android:launchMode="singleTop"
android:exported="true">
<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 в вашем приложении:
- Создайте тег
intent-filter
внутри игрового активити с указанием вашейDeeplink Scheme
. - Создайте тег
meta-data
внутри<application>
с указанием вашейDeeplink Scheme
. - Переопределите методы
onCreate
иonNewIntent
игрового активити.
<?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:launchMode="singleTop"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Схема deeplink -->
<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>
Значение Deeplink Scheme
задается в файле PayClientSettings.assets
. Чтобы создать файл PayClientSettings.assets
, в меню редактора Unity выберите пункт: Window → RuStore SDK → Settings → PayClient.
Далее расширьте класс UnityPlayerActivity
и добавьте обработку входящего intent
в onCreate
и 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
). По умолчанию фильтры отключены, и вернутся все покупки пользователя (независимо от типа товара) в статусах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
}
});
Получение списка продуктов
Для получения продуктов, добавленных в ваше приложение через 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-CONSUMABLE
(потребляемый/непотребляемый).amountLabel
— отформатированная цена покупки, включая валютный знак.price
— цена в минимальных единицах (в копейках).currency
— код валюты ISO 4217.title
— название продукта на языкеlanguage
.description
— описание на языкеlanguage
.imageUrl
— ссылка на картинку.
Получение списка покупок
Для получения списка покупок пользователя используйте методGetPurchases
.
RuStorePayClient.Instance.GetPurchases(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});
Данный метод поддерживает необязательную фильтрацию по типу товаров (потребляемые или непотреблямые товары), а также по статусу покупки (поддерживаются только статусы PAID
и CONFIRMED
). По умолчанию фильтр выключен и вернет все покупки пользователя (вне зависимости от типа товара) в статусах PAID
и CONFIRMED
. Статус PAID
означает успешное холдирование средств, покупка ожидает подтверждения покупки со стороны разработчика.
RuStorePayClient.Instance.GetPurchases(
productType: ProductType.CONSUMABLE_PRODUCT,
purchaseStatus: PurchaseStatus.CONFIRMED,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});
Ниже представлена модель покупки.
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; }
...
}
purchaseId
— идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).invoiceId
— идентификатор счёта. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore.orderId
- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid
).PurchaseType
— тип покупки:ONE_STEP
- одностадийная покупка;TWO_STEP
- двухстадийная покупка;UNDEFINED
- стадийность не определена.
productType
— тип продукта. (CONSUMABLE
/NON-CONSUMABLE
- потребляемый/непотребляемый.)description
- описание покупки.purchaseTime
— время покупки.price
— цена в минимальных единицах (в копейках).amountLabel
— отформатированная цена покупки, включая валютный знак.currency
— код валюты ISO 4217.quantity
— количество продукта.status
— состояние покупки:INVOICE_CREATED
— создан счёт на оплату, покупка ожидает оплаты;CANCELLED
— покупка отменена покупателем;PROCESSING
— запущена оплата;REJECTED
— покупка отклонена (например, ввиду недостатка средств);EXPIRED
— истекло время на оплату покупки;PAID
— только для двухстадийной оплаты, промежуточный статус, средства на счёте покупателя захолдированы, покупка ожидает подтверждения от разработчика;CONFIRMED
— покупка успешно оплачена;REFUNDING
— инициирован возврат, запрос отправлен в эквайер;REFUNDED
— запрос на возврат средств за покупку совершён успешно;REVERSED
— только для двухстадийной оплаты, покупка была отменена разработчиком или не было произведено подтверждение покупки в течение 6 часов, холдирование средств отменено.
-
developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации -
sandbox
— флаг тестового платежа. Значениеtrue
— тестовый платёж,false
— реальный платёж.
Получение сведений о покупке
Для получения информации о покупке, используйте методgetPurchase
.
RuStorePayClient.Instance.GetPurchase(
purchaseId: purchase.purchaseId,
onFailure: (error) => {
// Process error
},
onSuccess: (response) => {
// Process success
});
Метод возвращает информацию о конкретной покупке в любом статусе. Ниже представлена модель покупки.
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; }
...
}
purchaseId
— идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).invoiceId
— идентификатор счёта. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore.orderId
- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid
).PurchaseType
— тип покупки:ONE_STEP
- одностадийная покупка;TWO_STEP
- двухстадийная покупка;UNDEFINED
- стадийность не определена.
productType
— тип продукта. (CONSUMABLE
/NON-CONSUMABLE
- потребляемый/непотребляемый.)description
- описание покупки.purchaseTime
— время покупки.price
— цена в минимальных единицах (в копейках).amountLabel
— отформатированная цена покупки, включая валютный знак.currency
— код валюты ISO 4217.quantity
— количество продукта.status
— состояние покупки:INVOICE_CREATED
— создан счёт на оплату, покупка ожидает оплаты;CANCELLED
— покупка отменена покупателем;PROCESSING
— запущена оплата;REJECTED
— покупка отклонена (например, ввиду недостатка средств);EXPIRED
— истекло время на оплату покупки;PAID
— только для двухстадийной оплаты, промежуточный статус, средства на счёте покупателя захолдированы, покупка ожидает подтверждения от разработчика;CONFIRMED
— покупка успешно оплачена;REFUNDING
— инициирован возврат, запрос отправлен в эквайер;REFUNDED
— запрос на возврат средств за покупку совершён успешно;REVERSED
— только для двухстадийной оплаты, покупка была отменена разработчиком или не было произведено подтверждение покупки в течение 6 часов, холдирование средств отменено.
-
developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации -
sandbox
— флаг тестового платежа. Значениеtrue
— тестовый платёж,false
— реальный платёж.
Статусная модель покупки
Статусная модель одностадийного платежа.
Статусная модель двухстадийного платежа.
Покупка продукта
- При использовании одностадийного платежа покупка не требует подтверждения, денежные средства сразу списываются со счёта покупателя, а с разработчика удерживается комиссия. В таком случае, если требуется вернуть денежные средства клиенту (например, по какой-то причине нет возможности поставить продукт), возможен только возврат средств через RuStore Консоль, денежные средства возвращаются покупателю через несколько дней. Возвращается полная стоимость покупки, при этом удержанная комиссия разработчику не возмещается.
- В случае использования двухстадийного платежа сначала производится холдирование средств на счете покупателя. Комиссия в этом случае не удерживается. После холдирования покупка требует подтверждения или отмены. Комиссия с разработчика удерживается при подтверждении покупки. Отмена покупки означает снятие холда - денежные средства мгновенно снова доступны покупателю.
Двухстадийная оплата доступна только для определенного набора способов оплаты (на текущий момент — только для карт). Технологии СБП не поддерживают двухстадийную оплату. Если выбран способ оплаты, который не поддерживает холдирование, то покупка будет запущена по сценарию с одной стадией.
Оплата с выбором типа покупки
Для вызова покупки продукта с выбором стадийности оплаты используйте метод Purchase
:
var parameters = new ProductPurchaseParams(
productId: new ProductId("product_id"),
appUserEmail: null,
appUserId: null,
developerPayload: null,
orderId: null,
quantity: new Quantity(1)
);
RuStorePayClient.Instance.Purchase(
parameters: parameters,
preferredPurchaseType: PreferredPurchaseType.ONE_STEP,
onFailure: (error) => {
switch (error) {
case RuStorePaymentException.ProductPurchaseCancelled cancelled:
// Handle cancelled purchase
break;
case RuStorePaymentException.ProductPurchaseException exception:
// Handle failed purchase
break;
default:
// Handle other error
break;
}
},
onSuccess: (result) => {
// Process success
});
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).quantity
— количество продукта. Необязательный параметр со стандартным значением1
. Применим только к покупке потребляемых товаров.orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов.-
appUserId
— внутренний ID пользователя в вашем приложении (опциональный параметр). Строка с максимальной длиной в 128 символов.提示Например, данный параметр может использоваться для выявления случаев мошенничества в вашем приложении, что позволит повысить его безопасность.
appUserEmail
- это необязательный параметр, позволяющий задать адрес электронной почты пользователя в вашем приложении. Если адрес электронной почты покупателя был указан при регистрации в приложении, его можно передать для автоматического заполнения поляemail
при отправке чека — как для платежей вне RuStore, так и для случаев, когда пользователь не авторизован в RuStore. Это избавляет пользователя от необходимости вручную вводить email, сокращает путь до покупки и способствует повышению конверсии.preferredPurchaseType
— желаемый тип покупки: одностадийная (ONE_STEP
) или двухстадийная (TWO_STEP
).
Данный метод по умолчанию запускается по одностадийному сценарию оплаты (preferredPurchaseType = PreferredPurchaseType.ONE_STEP
), т.е. без холдирования средств.
Для двухстадийной оплаты нужно указать preferredPurchaseType = PreferredPurchaseType.TWO_STEP
. Двухстадийная оплата (т.е. оплата с холдированием средств) для данного метода не гарантирована и напрямую зависит от того, какой способ оплаты (карта, СПБ и др.) выбрал пользователь.
При запуске данного метода (с предпочитаемым preferredPurchaseType = twoStep
), до тех пор пока пользователь не выберет способ оплаты, стадийность покупки будет UNDEFINED
. Учитывайте данное поведение при обработке результатов отмены (ProductPurchaseCancelled
) или ошибки (ProductPurchaseException
) покупки.
Двухстадийная оплата (с холдированием средств)
Для вызова покупки продукта по двухстадийному сценарию используйте метод PurchaseTwoStep
:
При вызове данного метода пользователю будет доступен ограниченный набор способов оплаты — только те, которые поддерживают двухстадийную оплату.
var parameters = new ProductPurchaseParams(
productId: new ProductId("product_id"),
appUserEmail: null,
appUserId: null,
developerPayload: null,
orderId: null,
quantity: new Quantity(1)
);
RuStorePayClient.Instance.PurchaseTwoStep(
parameters: parameters,
onFailure: (error) => {
switch (error) {
case RuStorePaymentException.ProductPurchaseCancelled cancelled:
// Handle cancelled purchase
break;
case RuStorePaymentException.ProductPurchaseException exception:
// Handle failed purchase
break;
default:
// Handle other error
break;
}
},
onSuccess: (result) => {
// Process success
});
Структура параметров покупки
public class ProductPurchaseParams : BaseFields {
public ProductId productId { get; }
public AppUserEmail? appUserEmail { get; }
public AppUserId? appUserId { get; }
public Quantity? quantity { get; }
public OrderId? orderId { get; }
public DeveloperPayload? developerPayload { get; }
...
}
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).quantity
— количество продукта. Необязательный параметр со стандартным значением1
. Применим только к покупке потребляемых товаров.orderId
— уникальный идентификатор оплаты, сформированный приложением (оп циональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов.-
appUserId
— внутренний ID пользователя в вашем приложении (опциональный параметр). Строка с максимальной длиной в 128 символов.提示Например, данный параметр может использоваться для выявления случаев мошенничества в вашем приложении, что позволит повысить его безопасност ь.
appUserEmail
— это необязательный параметр, позволяющий задать адрес электронной почты пользователя в вашем приложении. Если адрес электронной почты покупателя был указан при регистрации в приложении, его можно передать для автоматического заполнения поляemail
при отправке чека — как для платежей вне RuStore, так и для случаев, когда пользователь не авторизован в RuStore. Это избавляет пользователя от необходимости вручную вводить email, сокращает путь до покупки и способствует повышению конверсии.
Структура результата покупки
public sealed class ProductPurchaseResult : BaseFields {
public PurchaseId purchaseId { get; }
public ProductId productId { get; }
public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public PurchaseType purchaseType { get; }
public Quantity quantity { get; }
public bool sandbox { get; }
...
}
ProductPurchaseResult
— результат успешной оплаты цифрового товара (для одностадийной оплаты) или успешного холдирования средств (для двухстадийной оплаты).purchaseId
— идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупкеproductId
— идентификатор приобретенного продукта, указанный при создании в консоли разработчика RuStore.invoiceId
— идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStoreorderId
— уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid
).purchaseType
— тип покупки (ONE_STEP
/TWO_STEP
/UNDEFINED
— одностадийная/двухстадийная/стадийность не определена).quantity
— количество купленного продукта.sandbox
— флаг, указывающий признак тестового платежа в песочнице. ЕслиTRUE
- покупка совершена в режиме тестирования.
Обработка ошибки оплаты
Если в процессе оплаты возникает ошибка или пользователь отменяет покупку, выполнение метода оплаты (как с выбором типа покупки, так и двухстадийного метода) завершается с ошибкой:
ProductPurchaseException
— ошибка покупки продукта.ProductPurchaseCancelled
— ошибка, вызванная отменой покупки продукта (пользователь закрыл платежную шторку) до получения результата покупки. В таком случае рекомендуется дополнительно проверить статус покупки методом получения информации о покупке.
Структура ошибки и отмены покупки:
public sealed class ProductPurchaseException : RuStorePaymentException {
public InvoiceId? invoiceId { get; }
public OrderId? orderId { get; }
public ProductId? productId { get; }
public PurchaseId? purchaseId { get; }
public PurchaseType? purchaseType { get; }
public Quantity? quantity { get; }
public bool? sandbox { get; }
...
}
public sealed class ProductPurchaseCancelled : RuStorePaymentException {
public PurchaseId? purchaseId { get; }
public PurchaseType? purchaseType { get; }
...
}
Серверная валидация покупки
Если вам необходимо произвести валидацию успешной покупки на сервере RuStore, вы можете использовать invoiceId
из модели SuccessProductPurchaseResult
, возвращаемой при успешной покупке продукта.
var parameters = new ProductPurchaseParams(
productId: new ProductId("product_id"));
RuStorePayClient.Instance.Purchase(
parameters: parameters,
preferredPurchaseType: PreferredPurchaseType.TWO_STEP,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
var invoiceId = result.invoiceId.value;
yourApi.validate(invoiceId);
});
Также можно получить invoiceId
в модели Purchase
. Модель Purchase
можно получить используя метод GetPurchases()
или метод GetPurchase
.
RuStorePayClient.Instance.GetPurchases(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
result.ForEach(item => {
var invoiceId = item.invoiceId.value;
yourApi.validate(invoiceId);
});
});
Подтверждение (потребление) покупки
Подтверждения требуют только покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки, после успешного холдирования будут находиться в статусе PurchaseStatus.PAID
.
Для списания средств с карты покупателя требуется подтверждение покупки. Для этого вы должны использовать метод ConfirmTwoStepPurchase
.
PurchaseId id = ...
DeveloperPayload payload = ...
RuStorePayClient.Instance.ConfirmTwoStepPurchase(
purchaseId: purchaseId,
developerPayload: payload,
onFailure: (error) => {
// Process error
},
onSuccess: () => {
// Process success
});
purchaseId
— идентификатор покупки.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициа лизации (опционально). Максимум 250 символов. Если передан, заменяет значение, записанное при старте покупки методомPurchase
/PurchaseTwoStep
.
Отмена покупки
Через SDK можно отменять только те покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки после успешного холдирования будут находиться в статусе PurchaseStatus.PAID
. После отмены покупки будут переходить в статус PurchaseStatus.REVERSED
.
Используйте отмену покупки в случаях, если после оплаты (холдирования средств) вы не можете предоставить покупателю товар.
Для отмены покупки (холда) вы должны использовать метод CancelTwoStepPurchase
.
PurchaseId id = ...
RuStoreBillingClient.Instance.CancelTwoStepPurchase(
purchaseId: id,
onFailure: (error) => {
// Process error
},
onSuccess: () => {
// Process success
}
);
purchaseId
— идентификатор покупки.
RuStoreUtils
RuStoreUtils — это блок в нативном SDK, содержащий набор публичных методов, предназначенных для взаимодействия с приложением RuStore на устройстве пользователя.
Для доступа к методам блока в среде Unity используется синглтон класса RuStoreCoreClient
.
Метод IsRuStoreInstalled
проверяет наличие приложения RuStore на устройстве пользователя.
if (RuStorePayClient.Instance.IsRuStoreInstalled()) {
// RuStore установлен на устройстве пользователя
} else {
// RuStore не установлен на устройстве пользователя
}
Метод openRuStoreDownloadInstruction
открывает веб-страницу для скачивания мобильного приложения RuStore.
RuStoreCoreClient.Instance.openRuStoreDownloadInstruction();
Метод openRuStore
запускает мобильное приложение RuStore. При вызове данного метода, в случае отсутствия установленного приложения RuStore, будет отображено Toast уведомление с сообщением "Не удалось открыть приложение".
RuStoreCoreClient.Instance.openRuStore();
Метод openRuStoreAuthorization
запускает мобильное приложение RuStore для авторизации. После успешной авторизации пользователя приложение RuStore автоматически закрывается. При вызове данного метода, в случае отсутствия установленного приложения RuStore, будет отображено Toast уведомление с сообщением "Не удалось открыть приложение".
RuStoreCoreClient.Instance.openRuStoreAuthorization();
Список ошибок
RuStoreError — базовый класс ошибки.
public class RuStoreError {
public string name;
public string description;
}
name
– имя ошибки.description
– описание ошибки.
RuStorePaymentException — ба зовый класс ошибки платёжного клиента.
public class RuStorePaymentException : RuStoreError {
public virtual RuStoreError? cause { get; }
...
}
cause
– дополнительная информация об ошибке.
Унаследованные поля:
name
– имя ошибки.description
– описание ошибки.
RuStorePaymentNetworkException — ошибка сетевого взаимодействия SDK. В модели ошибки возвращается код ошибки (поле code), по которому можно определить причину ошибки. Таблица с кодами ошибок доступна в разделе коды ошибок.
public class RuStorePaymentNetworkException : RuStorePaymentException {
public int code { get; }
...
}
code
— код ошибки.
Унаследованные поля:
name
– имя ошибки.description
– описание ошибки.cause
– дополнительная информация об ошибке.
Возможные ошибки
RuStorePaymentNetworkException
— ошибка сетевого взаимодействия SDK;RuStorePaymentCommonException
— общая ошибка SDK;RuStorePayClientAlreadyExist
— ошибка повторной инициализации SDK;RuStorePayClientNotCreated
— попытка обратиться к публичным интерфейсам SDK до момента её инициализации;RuStorePayInvalidActivePurchase
— запущен процесс оплаты неизвестного типа продукта;RuStorePayInvalidConsoleAppId
— не задан обязательный параметрconsole_application_id
для инициализации SDK;RuStorePaySignatureException
— неверная сигнатура ответа. Возникает при попытке совершить мошеннические действия;EmptyPaymentTokenException
— ошибка получения платёжного токена;InvalidCardBindingIdException
— ошибка оплаты сохранённой картой;ApplicationSchemeWasNotProvided
— не указана схема для обратного диплинка;ProductPurchaseException
- ошибка покупки продукта. Ст руктура модели представлена в разделе структура результата покупки;ProductPurchaseCancelled
- произошла отмена покупки продукта (пользователь закрыл платёжную шторку). Структура модели представлена в разделе структура результата покупки;ProductPurchaseException
— ошибка покупки продукта;RuStoreNotInstalledException
— на устройстве пользователя не установлен RuStore;RuStoreOutdatedException
— установленная на устройстве версия RuStore не поддерживает платежи;RuStoreUserUnauthorizedException
— пользователь не авторизован в RuStore;RuStoreApplicationBannedException
— приложение заблокировано в RuStore;RuStoreUserBannedException
— пользователь заблокирован в RuStore.
Коды ошибок
Код ошибки | Описание |
---|---|
4000001 | Запрос сформирован некорректно: отсутствует или неверно заполнен обязательный параметр, неверный формат данных. |
4000002 , 4000016 , 4040005 | Приложение не найдено. |
4000003 | Приложение заблокировано. |
4000004 | Подпись приложения не совпадает с зарегистрированной. |
4000005 | Компания не найдена. |
4000006 | Компания заблокирована. |
4000007 | Монетизация компании отключена или неактивна. |
4000014 | Продукт не найден. |
4000015 | Продукт не опубликован. |
4000017 | Некорректный параметр quantity . |
4000018 | Превышен лимит покупок. |
4000020 | Продукт уже приобретен. |
4000021 | Незавершенная покупка продукта. |
4000022 | Покупка не найдена. |
4000025 | Не найден подходящий способ оплаты. |
4000026 | Неверный тип покупки для подтверждения (должна быть двухстадийная оплата). |
4000027 | Неверный статус покупки для подтверждения. |
4000028 | Неверный тип покупки для отмены (должна быть двухстадийная оплата). |
4000029 | Неверный статус покупки для отмены. |
4000030 | Выписанный токен не соответствует покупаемому товару. |
4010001 | Доступ к запрашиваему ресурсу запрещен (неавторизовано). |
4010002 | Время жизни токена истекло. |
4010003 | Платежный токен невалиден. |
4030001 | Не передан платежный токен. |
4030002 | Пользователь заблокирован по требованиям безопасности. |
4040002 , 4040003 , 4040004 | Ошибка платежной системы. |
5000*** | Внутренняя ошибка. |