10.1.0 (актуальная версия)
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Пример реализации
Ознакомьтесь с проектом-примером, чтобы узнать, как правильно интегрировать SDK платежей.
Подключение в проект
Клонирование репозитория
Репозиторий содержит исходный код плагина и демонстрационный проект, содержащий представление работы всех методов SDK.
Не используйте кнопку "Код → Скачать" на сайте GitFlic – этот метод не загружает файлы из Git LFS.
Перед клонированием репозитория скачайте и установите инструменты:
После установки выполните в командной строке:
git lfs install
Для клонирования репозитория воспользуйтесь набором команд:
git clone https://gitflic.ru/project/rustore/construct-rustore-pay.git
cd construct-rustore-pay
git lfs pull
Установка плагинов
Для сборки Android-приложения и работы с нативными функциями ОС Construct использует фреймворк Cordova.
- Убедитесь, что у вас установлен фреймворк Cordova версии не ниже 12.0.0.
cordova -v
- Перейдите в корневую папку вашего Cordova-проекта и выполните команду:
cordova plugin add /путь_к_папке_плагина/ru.rustore.pay
- После установки проверьте наличие плагина с помощью команды:
cordova plugin list
В списке должен появиться плагин ru.rustore.pay.
- Плагин требует, чтобы вы разместили свои данные для инициализации в файле
rustore_pay_strings.xmlрасположенном в папкеru.rustore.pay / src / android / res / values.
Создайте или отредактируйте этот файл, поместив туда необходимые параметры инициализации плагина.
-
После установки плагин автоматически добавит теги
<meta-data>и дополнительную активитиRuStoreIntentFilterActivityвAndroidManifest.xmlв папкеваш_cordova_проект / platforms / android / app / src / main. -
В файле
AndroidManifest.xmlнайдите активитиMainActivityи удалите у неё тег<intent-filter>содержащийMAINиLAUNCHER, чтобы она больше не запускалась как стартовая. Новая активитиRuStoreIntentFilterActivity, добавленная плагином, обязательно должна быть основной.
Пример готового манифеста:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">
<!-- Game activity -->
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation" android:exported="true" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@style/Theme.App.SplashScreen" android:windowSoftInputMode="adjustResize">
<!-- Starting intent-filter
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
-->
</activity>
<provider android:authorities="${applicationId}.cdv.core.file.provider" android:exported="false" android:grantUriPermissions="true" android:name="androidx.core.content.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/cdv_core_file_provider_paths" />
</provider>
<!-- Deeplink Scheme -->
<meta-data android:name="sdk_pay_scheme_value" android:value="@string/rustore_PayClientSettings_deeplinkScheme" />
<!-- 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" />
<!-- Deeplink Activity -->
<activity android:exported="true" android:name="ru.rustore.paybridge.RuStoreIntentFilterActivity" android:theme="@android:style/Theme.NoDisplay">
<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>
</activity>
</application>
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
</manifest>
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию. Сама инициализация происходит автоматически, но для работы SDK в вашем файле AndroidManifest.xml будут автоматически добавлены console_app_id_value, internal_config_key и sdk_pay_scheme_value. Все теги плагин добавит автоматически.
<!-- 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" />
<!-- Deeplink Scheme -->
<meta-data android:name="sdk_pay_scheme_value" android:value="@string/rustore_PayClientSettings_deeplinkScheme" />
Значения тегов задаюся в файле rustore_pay_strings.xml расположенном в папке ru.rustore.pay / src / android / res / values.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="rustore_PayClientSettings_consoleApplicationId" translatable="false">1234567890</string>
<string name="rustore_PayClientSettings_internalConfigKey" translatable="false">construct</string>
<string name="rustore_PayClientSettings_deeplinkScheme" translatable="false">yourappscheme</string>
</resources>
consoleApplicationId — идентификатор приложения из RuStore консоли.
internalConfigKey — всегда должно иметь значение construct.
deeplinkScheme — уникальная схема deeplink.
Где в RuStore Консоль отображаются идентификаторы приложений?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между
apps/и/versions. Например, для URL-адресаhttps://console.rustore.ru/apps/123456/versionsID приложения —123456.

Package Name и подпись Cordova-приложения, должены совпадать с Package Name и подписью приложения, которое вы публиковали в системе RuStore Консоль.
Не задавайте значения console_app_id_value и internal_config_key напрямую в манифесте. Строки должны располагаться в файле ресурсов.
Работа с SDK
Доступные публичные методы:
getPurchase— позволяет получить информацию о покупке по её ID.getPurchases— позволяет получить покупки пользователя. Данный метод поддерживает опциональную фильтрацию по типу товаров (потребляемые или непотребляемые товары), а также по статусу покупки (поддерживаются статусыPAIDиCONFIRMED). По умолчанию фильтры отключены, и вернутся все покупки пользователя (независимо от типа товара) в статусахPAIDиCONFIRMED.getPurchaseAvailability— возвращает результат доступности работы с платежами.purchase— позволяет совершить покупку продукта с указанием желаемого типа оплаты - одностадийной (ONE_STEP) или двухстадийной (TWO_STEP). Для данного метода оплаты на платёжной шторке доступны все способы оплаты. Если параметр не задан, по умолчанию запускается с оплатой в одну стадию.
Если указан тип оплаты TWO_STEP, будет произведена попытка запустить двухстадийную оплату, но итоговый результат напрямую будет зависеть от того, какой способ оплаты (карта, СБП и др.) будет выбран пользователем. Двухстадийная оплата доступна только для определенного набора способов оплаты (на текущий момент — только для карт). Технологии СБП не поддерживают двухстадийную оплату. Если выбран способ оплаты, который не поддерживает холдирование, то покупка будет запущена по сценарию с одной стадией.
purchaseTwoStep— запускает сценарий гарантированной двухстадийной покупки товара. При использовании данного метода пользователю на платёжной шторке доступен ограниченный набор способов оплаты — только те, которые поддерживают двухстадийную оплату. В процессе платежа сначала осуществляется холдирование денежных средств покупателя, которые списываются только после подтверждения покупки методомconfirmTwoStepPurchase.confirmTwoStepPurchase— подтверждение покупки, совершенной по двухстадийной оплате.cancelTwoStepPurchase— отмена покупки, совершённой по двухстадийной оплате.getProducts— позволяет получить информацию по активным продуктам, опубликованным в RuStore консоль.
Данный метод возвращает не более 1000 продуктов и работает без авторизации и наличия установленного RuStore на устройстве пользователя.
getUserAuthorizationStatus— проверяет статус авторизации пользователя.isRuStoreInstalled— проверки наличия приложения RuStore на устройстве пользователя.openRuStoreDownloadInstruction— открывает веб-страницу для скачивания приложения RuStore.openRuStore— запускает приложение RuStore.openRuStoreAuthorization— запускает приложение RuStore для авторизации. После успешной авторизации пользователя приложение RuStore автоматически закроется.
Проверка доступности работы с платежами
Для проверки доступности платежей, вызовите метод GetPurchaseAvailability. При его вызове проверяются следующие условия.
- У компании подключена монетизация через консоль разработчика RuStore.
- Приложение не должно быть заблокировано в RuStore.
- Пользователь не должен быть заблокирован в RuStore.
PurchaseAvailabilityResult.isAvailable == true.
В противном случае возвращается PurchaseAvailabilityResult.isAvailable == false и PurchaseAvailabilityResult.cause, где cause — это ошибка о невыполненном условии (возможные ошибки описаны в разделе Список ошибок).
cordova.plugins.RuStorePay.getPurchaseAvailability(
function(result) {
var data = JSON.parse(result);
if (data.isAvailable === true) {
// Process success
} else {
// Process data.cause
}
},
function(error) {
var data = JSON.parse(error);
// Process error
}
);
Проверка статуса авторизации пользователя
Для проверки статуса авторизации пользователя, вызовите метод getUserAuthorizationStatus. Результатом выполнения метода является значение перечисления UserAuthorizationStatus. Возможно только 2 значения:
AUTHORIZED— пользователь авторизован в RuStore.UNAUTHORIZED— пользователь неав торизован в RuStore. Данное значение также вернется если у пользователя нет установленного МП RuStore на девайсе.
cordova.plugins.RuStorePay.getUserAuthorizationStatus(
function(result) {
var data = JSON.parse(result);
if (data.userAuthorizationStatus == cordova.plugins.RuStorePay.UserAuthorizationStatus.AUTHORIZED) {
// Process AUTHORIZED
} else {
// Process UNAUTHORIZED
}
},
function(error) {
var data = JSON.parse(error);
// Process error
}
);
Получение списка продуктов
Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод getProducts.
var productIds = ["product_id1", "product_id2"];
cordova.plugins.RuStorePay.getProducts(
productIds,
function(result) {
var data = JSON.parse(result);
// Process success
},
function(error) {
var data = JSON.parse(error);
// Process error
}
);
productIds — список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.
Где в RuStore Консоль отображаются идентификаторы продуктов?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Выберите Монетизация в меню слева.
- Выберите тип товара: Подписки или Разовые покупки.
- Скопируйте идентификаторы нужных товаров.

Метод возвращает список продуктов. Ниже представлена модель продукта.
{
productId, // string
type, // string cordova.plugins.RuStorePay.ProductType
amountLabel, // string
price, // number (optional)
currency, // string
title, // string
description, // string (optional)
imageUrl, // string
subscriptionInfo // object (optional)
}
productId— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).type— тип продукта.CONSUMABLE/NON-CONSUMABLE/SUBSCRIPTION(потребляемый/непотребляемый/подписка).amountLabel— отформатированная цена покупки, включая валютный знак.price— цена в минимальных единицах (в копейках).currency— код валюты ISO 4217.title— название продукта на языкеlanguage.description— описание на языкеlanguage.imageUrl— ссылка на картинку.subscriptionInfo— информация о подписке (будет неnull, если тип продуктаSUBSCRIPTION).
{
periods // array
}
periods— cписок периодов подписки.
{
simpleName, // string
duration, // string
currency, // string (optional)
price // number (optional)
}
simpleName— тип периода (TrialPeriod/PromoPeriod/MainPeriod/GracePeriod/HoldPeriod).duration— длительность периода в формате ISO 8601.currency— код валюты ISO 4217.price— Цена в минимальных единицах валюты.
Получение списка покупок
Для получения списка покупок пользователя используйте методgetPurchases.
var productType = null; // cordova.plugins.RuStorePay.ProductType
var purchaseStatus = null; // cordova.plugins.RuStorePay.ProductPurchaseStatus
// or cordova.plugins.RuStorePay.SubscriptionPurchaseStatus
cordova.plugins.RuStorePay.getPurchases(
productType,
purchaseStatus,
function(result) {
var data = JSON.parse(result);
// Process success
},
function(error) {
var data = JSON.parse(error);
// Process error
}
);
Данный метод позволяет фильтровать покупки по типу товаров и статусу покупки:
productType — типы товаров:
- Потребляемые товары —
ProductType.CONSUMABLE_PRODUCT - Непотребляемые товары —
ProductType.NON_CONSUMABLE_PRODUCT - Подписки —
ProductType.SUBSCRIPTION
purchaseStatus — статусы покупок:
-
Для продуктов:
PAID: Успешное холдирование средств, покупка ожидает подтверждения со стороны разработчика.CONFIRMED: Покупка подтверждена, средства списаны.
-
Для подписок:
ACTIVE: Подписка активна.PAUSED: Подписка в Hold периоде (например, из-за недостатка средств на карте), продолжаются попытки списания в соответствии с настройками тарифа подписки.
По умолчанию фильтры выключены, если значения не заданы, метод вернёт все покупки пользователя в статусах PAID, CONFIRMED, ACTIVE и PAUSED, независимо от типа товара.
Получение сведений о покупке
Для получения информации о покупке, используйте методgetPurchase.
var purchaseId = ...
cordova.plugins.RuStorePay.getPurchase(
purchaseId,
function(result) {
var data = JSON.parse(result);
// Process success
},
function(error) {
var data = JSON.parse(error);
// Process error
}
);
Типы покупок
В SDK предусмотрено две реализации типов покупок.
- ProductPurchase: для потребляемых и непотребляемых покупок.
- SubscriptionPurchase: для подписок.
Данное разделение позволяет каждому типу покупки иметь свои уникальные свойства и поведение.
Модель разовой покупки ProductPurchase
{
amountLabel, // string
currency, // string
description, // string
developerPayload, // string (optional)
invoiceId, // string
orderId, // string (optional)
price, // number
productId, // string
productType, // string cordova.plugins.RuStorePay.ProductType
purchaseId, // string
purchaseTime, // string (optional)
purchaseType, // string cordova.plugins.RuStorePay.PurchaseType
quantity, // number
status, // string cordova.plugins.RuStorePay.ProductPurchaseStatus
sandbox // boolean
}
amountLabel— отформатированная цена покупки, включая валютный знак.currency— код валюты ISO 4217.description- описание покупки.-
developerPayload— строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации invoiceId— идентификатор счёта. Идентификатор счёта. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore.orderId- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).price— цена в минимальных единицах (в копейках).productId— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр). Идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).productType— тип продукта. (CONSUMABLE_PRODUCT/NON_CONSUMABLE_PRODUCT- потребляемый/непотребляемый.)purchaseId— идентификатор покупки. Идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.purchaseTime— время покупки.purchaseType— тип покупки:ONE_STEP- одностадийная покупка;TWO_STEP- двухстадийная покупка;UNDEFINED- стадийность не определена.
quantity— количество продукта.status— состояние покупки:INVOICE_CREATED— создан счёт на оплату, покупка ожидает оплаты;CANCELLED— покупка отменена покупателем;PROCESSING— запущена оплата;REJECTED— покупка отклонена (например, ввиду недостатка средств);EXPIRED— истекло время на оплату покупки;PAID— только для двухстадийной оплаты, промежуточный статус, средства на счёте покупателя захолдированы, покупка ожидает подтверждения от разработчика;CONFIRMED— покупка успешно оплачена;REFUNDING— инициирован возврат средств, запрос отправлен в эквайер;REFUNDED— запрос на возврат средств за покупку совершён успешно. Деньги будут возвращены пользователю в течение 10 рабочих дней.;REVERSED— только для двухстадийной оплаты, покупка была отменена разработчиком или не было произведено подтверждение покупки в течение 6 часов, холдирование средств отменено.
-
sandbox— флаг тестового платежа. Значениеtrue— тестовый платёж,false— реальный платёж.