Перейти к основному содержимому

11.0.0 (актуальная версия)

RuStore позволяет интегрировать платежи в мобильное приложение.

подсказка
  • Если не знаете с чего начать, прочтите инструкцию в сценариях использования.

  • Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.

Пример реализации

Ознакомьтесь с приложением-примером, чтобы узнать, как правильно интегрировать SDK платежей.

Подключение в проект

Установка плагинов

Для подключения скачайте со страницы релизов пакеты:

  • ru.rustore.core-version.tgz
  • ru.rustore.pay-version.tgz

Импортируйте пакеты в проект через Package Manager (Window → Package Manager → + → Add package from tarball...).

Для каждого артефакта в релизе доступны файлы контрольных сумм (.sha256) и цифровой подписи (.sig), которые могут использоваться для проверки целостности и подлинности артефакта после скачивания.

подсказка

Если вы используете операционную систему macOS, измените настройки утилиты архивации. В настройках Archive Utility снимите флажок Keep expanding if possible. В противном случае архив проекта будет скачан некорректно.

Для корректной обработки зависимостей SDK выполните следующие настройки.

  1. Откройте настройки проекта: Edit → Project Settings → Player → Android Settings.

  2. В pазделе Publishing Settings включите следующие настройки.

    • Custom Main Manifest.
    • Custom Main Gradle Template.
    • Custom Gradle Properties Template.
  3. В разделе 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.
Ошибка Google.IOSResolver.dll
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.

Инициализация

Для автоматического патча AndroidManifest.xml, необходимому для работы с RuStore Pay Client:

1. Откройте настройки

В Unity выберите: Window → RuStoreSDK → Settings → PayClient. При этом будет автоматически создан и открыт файл PayClientSettings.asset в Inspector.

2. Заполните поля

consoleApplicationId — идентификатор приложения из RuStore консоли.

deeplinkScheme — уникальная схема вашего приложения (например, yourappscheme).

Где в RuStore Консоль отображаются идентификаторы приложений?
  1. Перейдите на вкладку Приложения и выберите нужное приложение.
  2. Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между apps/ и /versions. Например, для URL-адреса https://console.rustore.ru/apps/123456/versions ID приложения — 123456.

3. Выберите Application Entry Point

Важно для Unity 2021.3 и новее

В новых версиях Unity параметр Activity по умолчанию установлен в GameActivity. Однако RuStore SDK корректно работает только с UnityPlayerActivity.

Если при выборе в таблице указать GameActivity, платежи будут работать некорректно или завершаться ошибкой.

Убедитесь, что в настройках проекта (Player Settings → Android → Other Settings → Activity) выбрано значение UnityPlayerActivity и в таблице ниже вы также выбираете Activity (com.unity3d.player.UnityPlayerActivity).

Укажите Activity для запуска после обработки диплинка:

ЗначениеКласс
Activitycom.unity3d.player.UnityPlayerActivity
GameActivitycom.unity3d.player.UnityPlayerGameActivity
CustomMainActivityВаша Activity (укажите в поле Custom Main Activity Class)
примечание

Выбор в этой таблице должен соответствовать значению, установленному в Player Settings → Android → Other Settings → Activity.

4. Выберите Deeplink Activity

Укажите Activity для обработки диплинка:

ЗначениеКласс
Defaultru.rustore.unitysdk.RuStoreDeeplinkActivityDefault
CustomВаша Activity (укажите в поле Custom Deeplink Activity Class)

5. Примените изменения

В секции Android Manifest нажмите:

  • Patch Manifest — применить изменения.
  • Verify Manifest — проверить корректность AndroidManifest.xml

Результат в Console:

  • [RuStore] AndroidManifest.xml patched. — изменения применены.
  • [RuStore] AndroidManifest.xml verified. — манифест настроен корректно.

Что делает Patch Manifest:

  • Добавляет RuStoreDeeplinkActivityDefault (или вашу Custom Deeplink Activity) с intent-filter для приема диплинка.
  • Добавляет meta-data для SDK (console_app_id_value, internal_config_key, sdk_pay_scheme_value).
Внимание!

Package Name приложения должен совпадать с Package Name APK-файла, опубликованного в RuStore Консоль.

6. Миграция

Если вы обновили плагин и у вас есть ранее созданный PayClientSettings.asset, при открытии Window → RuStoreSDK → Settings → PayClient будет автоматически выполнена проверка схемы настроек.

Если файл настроек создан в старой версии плагина (например, в нем отсутствует поле schemeVersion или его значение ниже актуального), откроется окно PayClientSettings Migration с вариантами действий:

  • Migrate — создает новый PayClientSettings.asset актуального формата и переносит в него ваши текущие значения (например, consoleApplicationId, deeplinkScheme, классы Activity).
  • Delete & Recreate — удаляет старый файл настроек и создает новый с настройками по умолчанию (данные будут потеряны).
  • Cancel — оставляет старый файл без изменений (часть функций SDK может работать некорректно до выполнения миграции).

Работа с 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 — это ошибка о невыполненном условии (возможные ошибки описаны в разделе Список ошибок).

Вызов метода GetPurchaseAvailability
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 на девайсе.
Вызов метода GetUserAuthorizationStatus
RuStorePayClient.Instance.GetUserAuthorizationStatus(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
if (result == UserAuthorizationStatus.AUTHORIZED) {
// Process success
}
});

Получение списка продуктов

Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод GetProducts.

Вызов метода GetProducts
ProductId[] ids = ...

RuStorePayClient.Instance.GetProducts(
productIds: ids,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});

ProductId[] productIds — список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.

Где в RuStore Консоль отображаются идентификаторы продуктов?
  1. Перейдите на вкладку Приложения и выберите нужное приложение.
  2. Выберите Монетизация в меню слева.
  3. Выберите тип товара: Подписки или Разовые покупки.
  4. Скопируйте идентификаторы нужных товаров.

Метод возвращает список продуктов. Ниже представлена модель продукта.

Модель продукта
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; }
public SubscriptionInfo? subscriptionInfo { get; }
}
  • productId — идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).
  • type — тип продукта. CONSUMABLE/NON-CONSUMABLE/SUBSCRIPTION (потребляемый/непотребляемый/подписка).
  • amountLabel — отформатированная цена покупки, включая валютный знак.
  • price — цена в минимальных единицах (в копейках).
  • currency — код валюты ISO 4217.
  • title — название продукта на языке language.
  • description — описание на языке language.
  • imageUrl — ссылка на картинку.
  • subscriptionInfo — информация о подписке (будет не null, если тип продукта SUBSCRIPTION).
  • subscriptionInfo — информация о подписке (будет не null, если тип продукта SUBSCRIPTION).
Модель информации о подписке
public class SubscriptionInfo {
public List<SubscriptionPeriod> periods { get; }
}
  • periods — cписок периодов подписки.
Модель периода подписки
public interface SubscriptionPeriod { }

public sealed class TrialPeriod : SubscriptionPeriod {
public string duration { get; }
public string currency { get; }
public int price { get; }
}

public sealed class PromoPeriod : SubscriptionPeriod {
public string duration { get; }
public string currency { get; }
public int price { get; }
}

public sealed class MainPeriod : SubscriptionPeriod {
public string duration { get; }
public string currency { get; }
public int price { get; }
}

public sealed class GracePeriod : SubscriptionPeriod {
public string duration { get; }
}

public sealed class HoldPeriod : SubscriptionPeriod {
public string duration { get; }
}
  • duration — длительность периода в формате ISO 8601.
  • currency — код валюты ISO 4217.
  • price — Цена в минимальных единицах валюты.

Получение списка покупок

Для получения списка покупок пользователя используйте метод GetPurchases.

Вызов метода получения списка покупок пользователя
RuStorePayClient.Instance.GetPurchases(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
result.ForEach(purchase => {
if (purchase is ProductPurchase productPurchase) {
// Process success
// productPurchase.productId
}
if (purchase is SubscriptionPurchase subscriptionPurchase) {
// Process success
// subscriptionPurchase.productId
}
});
});

Доступна перегрузка метода с фильтрацией покупок по трем параметрам:

  • ProductType.CONSUMABLE_PRODUCT — потребляемые товары
  • ProductType.NON_CONSUMABLE_PRODUCT — непотребляемые товары
  • ProductType.SUBSCRIPTION — подписки

Статусы покупок:

  • Для продуктов:

    • PAID: Успешное холдирование средств, покупка ожидает подтверждения со стороны разработчика.
    • CONFIRMED: Покупка подтверждена, средства списаны.
  • Для подписок:

    • ACTIVE: Подписка активна.
    • PAUSED: Подписка в Hold периоде (например, из-за недостатка средств на карте), продолжаются попытки списания в соответствии с настройками тарифа подписки.

Состояние выдачи товара (acknowledgementState):

  • PENDING — ожидает выдачи товара;
  • ACKNOWLEDGED — товар выдан;
  • UNKNOWN — логика не применима к платежу.

По умолчанию все фильтры выключены и возвращаются все покупки пользователя.

Вызов метода получения списка покупок пользователя
RuStorePayClient.Instance.GetPurchases(
productType: ProductType.CONSUMABLE_PRODUCT,
purchaseStatus: ProductPurchaseStatus.CONFIRMED,
acknowledgementState: AcknowledgementState.PENDING,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});

Получение сведений о покупке

Для получения информации о покупке, используйте метод getPurchase.
Вызов метода получения списка покупок пользователя
RuStorePayClient.Instance.GetPurchase(
purchaseId: purchase.purchaseId,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
result.ForEach(purchase => {
if (purchase is ProductPurchase productPurchase) {
// Process success
// productPurchase.productId
}
if (purchase is SubscriptionPurchase subscriptionPurchase) {
// Process success
// subscriptionPurchase.productId
}
});
});

Типы покупок

В SDK предусмотрен базовый интерфейс IPurchase, который объединяет общие поля всех типов покупок. На его основе созданы две реализации:

  • ProductPurchase: для потребляемых и непотребляемых покупок.
  • SubscriptionPurchase: для подписок.

Данное разделение позволяет каждому типу покупки иметь свои уникальные свойства и поведение.

Интерфейс IPurchase
public interface IPurchase {
PurchaseId purchaseId { get; }
InvoiceId invoiceId { get; }
OrderId? orderId { get; }
PurchaseType purchaseType { get; }
Enum status { get; }
Description description { get; }
DateTime? purchaseTime { get; }
Price price { get; }
AmountLabel amountLabel { get; }
Currency currency { get; }
DeveloperPayload? developerPayload { get; }
bool sandbox { get; }
}

Модель разовой покупки ProductPurchase

Модель ProductPurchase
public class ProductPurchase : BaseFields, IPurchaseStatus<ProductPurchaseStatus> {
public AmountLabel amountLabel { get; }
public Currency currency { get; }
public Description description { get; }
public DeveloperPayload? developerPayload { get; }
public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public Price price { get; }
public ProductId productId { get; }
public ProductType productType { get; }
public PurchaseId purchaseId { get; }
public DateTime? purchaseTime { get; }
public PurchaseType purchaseType { get; }
public Quantity quantity { get; }
public ProductPurchaseStatus status { get; }
public bool sandbox { get; }
public AcknowledgementState acknowledgementState { get; }

...
}
  • amountLabel — отформатированная цена покупки, включая валютный знак.
  • currency — код валюты ISO 4217.
  • description - описание покупки.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование)
  • invoiceId — идентификатор счета. Идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore.
  • orderId - уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).
  • price — цена в минимальных единицах (в копейках).
  • productId — идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр). Идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).
  • productType — тип продукта. (CONSUMABLE/NON-CONSUMABLE - потребляемый/непотребляемый.)
  • 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— реальный платеж.

  • acknowledgementState — состояние выдачи товара. Возможные значения: PENDING (ожидает выдачи товара), ACKNOWLEDGED (товар выдан), UNKNOWN (логика не применима к платежу).

Статусная модель покупки

Статусная модель одностадийного платежа.

Статусная модель двухстадийного платежа.

Модель подписки

Модель SubscriptionPurchase
public class SubscriptionPurchase : BaseFields, IPurchaseStatus<SubscriptionPurchaseStatus> {
public PurchaseId purchaseId { get; }
public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public PurchaseType purchaseType { get; }
public SubscriptionPurchaseStatus status { get; }
public Description description { get; }
public DateTime? purchaseTime { get; }
public Price price { get; }
public AmountLabel amountLabel { get; }
public Currency currency { get; }
public DeveloperPayload? developerPayload { get; }
public bool sandbox { get; }
public ProductId productId { get; }
public DateTime? expirationDate { get; }
public bool gracePeriodEnabled { get; }
public AcknowledgementState acknowledgementState { get; }

...
}
  • purchaseId — идентификатор покупки. Идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.
  • invoiceId — идентификатор счета. Идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей.
  • orderId - уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).
  • purchaseType — тип покупки:
    • ONE_STEP - одностадийная покупка;
    • TWO_STEP - двухстадийная покупка;
    • UNDEFINED - стадийность не определена.
  • status — состояние подписки:
    • INVOICE_CREATED — создан счет на оплату, подписка ожидает оплаты.
    • CANCELLED — счет на оплату подписки отменен.
    • EXPIRED — срок действия оплаты счета истек.
    • PROCESSING — первый платеж по подписке в обработке.
    • REJECTED — первый платеж по подписке отклонен. Подписка не оформлена.
    • ACTIVE — подписка активна.
    • PAUSED — подписка приостановлена из-за проблем с оплатой.
    • TERMINATED — закончились попытки списания по подписке (все были неуспешными). Подписка закрыта автоматически из-за проблем с оплатой.
    • CLOSED — подписка была отменена пользователем или разработчиком. Истек срок оплаченного периода, подписка закрыта.
  • description — описание покупки.
  • purchaseTime — время покупки.
  • price — цена в минимальных единицах (в копейках).
  • amountLabel — отформатированная цена покупки, включая валютный знак.
  • currency — код валюты ISO 4217.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование)
  • sandbox — флаг тестового платежа. Значение true — тестовый платеж, false— реальный платеж.

  • productId — идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр). Идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).
  • expirationDate — дата окончания действия подписки.
  • gracePeriodEnabled — флаг, указывающий, активен ли Grace-период для подписки.
  • acknowledgementState — состояние выдачи товара. Возможные значения: PENDING (ожидает выдачи товара), ACKNOWLEDGED (товар выдан), UNKNOWN (логика не применима к платежу).

Статусная модель подписки

Получение списка подписок, оформленных в SDK Billing Client

Получение списка подписок, оформленных в SDK Billing Client
RuStorePayClient.Instance.GetBillingSubscriptions(
onFailure: (error) => {
// Process error
},
onSuccess: (subscriptions) => {
foreach (var subscription in subscriptions) {
// Process subscription
// subscription.subscriptionToken — токен для серверной валидации
}
}
);

Метод возвращает список подписок, оформленных в SDK Billing Client.

Для работы метода пользователь должен быть авторизован в RuStore. При вызове неавторизованным пользователем метод вернёт ошибку.

Пример ответа.

Пример модели подписки, оформленной в SDK Billing Client
BillingSubscription(
purchaseId: new PurchaseId("sub_purchase_12345"),
invoiceId: new InvoiceId("inv_sub_67890"),
orderId: new OrderId("order_sub_abcde"),
purchaseType: PurchaseType.ONE_STEP,
status: SubscriptionPurchaseStatus.ACTIVE,
description: new Description("Ежемесячная подписка на 'Премиум'"),
purchaseTime: DateTime.Now,
price: new Price(29900), // Цена в копейках
amountLabel: new AmountLabel("299 ₽"),
currency: new Currency("RUB"),
developerPayload: new DeveloperPayload("user_id:123;source:profile"),
sandbox: false,
productId: new ProductId("premium_monthly_v1"),
expirationDate: DateTime.Now.AddDays(30),
gracePeriodEnabled: true,
subscriptionToken: new SubscriptionToken("special_validation_token")
);

Модель покупки подписки, оформленной в SDK Billing Client

Модель подписки, оформленной в SDK Billing Client
public class BillingSubscription : BaseFields, IPurchaseStatus<SubscriptionPurchaseStatus> {
public PurchaseId purchaseId { get; }
public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public PurchaseType purchaseType { get; }
public SubscriptionPurchaseStatus status { get; }
public Description description { get; }
public DateTime? purchaseTime { get; }
public Price price { get; }
public AmountLabel amountLabel { get; }
public Currency currency { get; }
public DeveloperPayload? developerPayload { get; }
public bool sandbox { get; }
public ProductId productId { get; }
public DateTime? expirationDate { get; }
public bool gracePeriodEnabled { get; }
public SubscriptionToken subscriptionToken { get; }
}

Описание полей BillingSubscription

  • purchaseId — идентификатор покупки.
  • invoiceId — идентификатор счета.
  • orderId — уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).
  • purchaseType — тип покупки.
  • status — статус покупки типа SubscriptionPurchaseStatus.
  • description — описание на языке language.
  • purchaseTime — время покупки.
  • price — цена в минимальных единицах (в копейках).
  • amountLabel — отформатированная цена покупки, включая валютный знак.
  • currency — код валюты ISO 4217.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование).
  • sandbox — флаг тестового платежа. Значение true — тестовый платеж, false— реальный платеж.

  • productId — идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).
  • expirationDate — дата окончания срока действия подписки.
  • gracePeriodEnabled — флаг, указывающий, активен ли льготный период для подписки.
  • subscriptionToken — токен для валидации покупки на сервере.

Статусы покупки подписки SubscriptionPurchaseStatus:

  • INVOICE_CREATED - создан счет на оплату, подписка ожидает оплаты.
  • CANCELLED - подписка отменена пользователем.
  • EXPIRED - срок действия подписки истек.
  • PROCESSING - платеж в обработке.
  • REJECTED - платеж отклонен.
  • ACTIVE - подписка активна.
  • PAUSED - подписка приостановлена из-за проблем с оплатой.
  • TERMINATED - закончились попытки списания по подписке (все были неуспешными). Подписка закрыта автоматически из-за проблем с оплатой.
  • CLOSED - подписка была отменена пользователем или разработчиком. Истек срок оплаченного периода, подписка закрыта.

Покупка продукта

Пояснения по работе с одностадийными и двухстадийными оплатами
  • При использовании одностадийного платежа покупка не требует подтверждения, денежные средства сразу списываются со счета покупателя, а с разработчика удерживается комиссия. В таком случае, если требуется вернуть денежные средства клиенту (например, по какой-то причине нет возможности поставить продукт), возможен только возврат средств через RuStore Консоль, денежные средства возвращаются покупателю через несколько дней. Возвращается полная стоимость покупки, при этом удержанная комиссия разработчику не возмещается.
  • В случае использования двухстадийного платежа сначала производится холдирование средств на счете покупателя. Комиссия в этом случае не удерживается. После холдирования покупка требует подтверждения или отмены. Комиссия с разработчика удерживается при подтверждении покупки. Отмена покупки означает снятие холда - денежные средства мгновенно снова доступны покупателю.
Важно

Двухстадийная оплата доступна только для определенного набора способов оплаты (на текущий момент — только для карт и SberPay). Технологии СБП не поддерживают двухстадийную оплату. Если выбран способ оплаты, который не поддерживает холдирование, то покупка будет запущена по сценарию с одной стадией.

Оплата с выбором типа покупки

Для вызова покупки продукта с выбором стадийности оплаты используйте метод Purchase:

Вызов метода покупки продукта
var parameters = new ProductPurchaseParams(
productId: new ProductId("product_id"),
appUserEmail: null,
appUserId: null,
developerPayload: null,
orderId: null,
quantity: new Quantity(1)
);

var sdkTheme = SdkTheme.DARK;

RuStorePayClient.Instance.Purchase(
parameters: parameters,
preferredPurchaseType: PreferredPurchaseType.ONE_STEP,
sdkTheme: sdkTheme,
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
},
purchaseEventListener: null
);
  • parameters — параметры покупки продукта.
  • preferredPurchaseType — желаемый тип покупки - одностадийная (ONE_STEP) или двухстадийная (TWO_STEP).
  • sdkTheme — цветовая тема платежной шторки. Доступно 2 варианта LIGHT и DARK (светлая и темная темы, соответственно). Данный параметр, для сохранения обратной совместимости между версиями SDK, реализован с параметром по умолчанию LIGHT.
  • purchaseEventListener — набор callback функций, позволяющий получать данные об invoiceId и purchaseId на разных этапах покупки — опционально.
Важно

Данный метод по умолчанию запускается по одностадийному сценарию оплаты (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)
);

var sdkTheme = SdkTheme.DARK;

RuStorePayClient.Instance.PurchaseTwoStep(
parameters: parameters,
sdkTheme: sdkTheme,
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
},
purchaseEventListener: null
);
  • parameters — параметры покупки продукта.
  • sdkTheme — цветовая тема платежной шторки. Доступно 2 варианта LIGHT и DARK (светлая и темная темы, соответственно). Данный параметр, для сохранения обратной совместимости между версиями SDK, реализован с параметром по умолчанию LIGHT.
  • purchaseEventListener — набор callback функций, позволяющий получать данные об invoiceId и purchaseId на разных этапах покупки — опционально.

Структура параметров покупки

Структура параметров покупки
public class ProductPurchaseParams : BaseFields {
public ProductId productId { get; }
public Quantity? quantity { get; }
public OrderId? orderId { get; }
public DeveloperPayload? developerPayload { get; }
public AppUserId? appUserId { get; }
public AppUserEmail? appUserEmail { get; }
}
  • productId — идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).
  • quantity — количество продукта. Необязательный параметр со стандартным значением 1. Применим только к покупке потребляемых товаров.
  • orderId — уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование). Максимальная длина 250 символов. Символы не экранируются.
  • appUserId — внутренний ID пользователя в вашем приложении (опциональный параметр). Строка с максимальной длиной в 128 символов.
    подсказка

    Например, данный параметр может использоваться для выявления случаев мошенничества в вашем приложении, что позволит повысить его безопасность.

  • appUserEmail — это необязательный параметр, позволяющий задать адрес электронной почты пользователя в вашем приложении. Если адрес электронной почты покупателя был указан при регистрации в приложении, его можно передать для автоматического заполнения поля email при отправке чека — как для платежей вне RuStore, так и для случаев, когда пользователь не авторизован в RuStore. Это избавляет пользователя от необходимости вручную вводить email, сокращает путь до покупки и способствует повышению конверсии.

Работа с PurchaseEventListener

Данный класс представляет из себя набор callback функций событий покупки, которые вызываются в процессе покупки.

Класс PurchaseEventListener
public class PurchaseEventListener {
public Action<PurchaseId, InvoiceId> onPurchaseCreated;
public Action<PurchaseId, InvoiceId> onPaymentStarted;
public Action<PurchaseId, InvoiceId> onPaymentCompleted;
public Action<PurchaseId?, InvoiceId?> onPaymentFailed;
public Action<PurchaseId?, InvoiceId?> onPurchaseCancelled;
}

Экземпляр передается в методы Purchase() и PurchaseTwoStep(). Благодаря данным уведомлениям можно получать данные о purchaseId и invoiceId на разных этапах покупки, чтобы взаимодействовать с этой информацией. Например, передать значение в аналитику или сделать запись в базу данных.

Пример использования PurchaseEventListener
var purchaseEventListener = new PurchaseEventListener(
onPurchaseCreated: (purchaseId, invoiceId) => { /* Событие при создании покупки */ },
onPaymentStarted: (purchaseId, invoiceId) => { /* Событие при старте оплаты */ },
onPaymentCompleted: (purchaseId, invoiceId) => { /* Событие при успешной оплате */ },
onPaymentFailed: (purchaseId, invoiceId) => { /* Событие при ошибке оплаты */ },
onPurchaseCancelled: (purchaseId, invoiceId) => { /* Событие при отмене покупки */ }
);

RuStorePayClient.Instance.Purchase(
parameters: parameters,
preferredPurchaseType: PreferredPurchaseType.ONE_STEP,
sdkTheme: SdkTheme.DARK,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
},
purchaseEventListener: purchaseEventListener
);

Структура результата покупки

public sealed class ProductPurchaseResult : BaseFields {

public InvoiceId invoiceId { get; }
public OrderId? orderId { get; }
public ProductId productId { get; }
public ProductType productType { get; }
public PurchaseId purchaseId { get; }
public PurchaseType purchaseType { get; }
public Quantity quantity { get; }
public bool sandbox { get; }

...
}
  • ProductPurchaseResult — результат успешной оплаты цифрового товара (для одностадийной оплаты) или успешного холдирования средств (для двухстадийной оплаты).
    • invoiceId — идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore
    • orderId — уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).
    • productId — идентификатор приобретенного продукта, указанный при создании в консоли разработчика RuStore.
    • productType — тип продукта NON-CONSUMABLE/CONSUMABLE/SUBSCRIPTION (непотребляемый/потребляемый/подписка).
    • purchaseId — идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке
    • 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 ProductType? productType { get; }
public PurchaseId? purchaseId { get; }
public PurchaseType? purchaseType { get; }
public Quantity? quantity { get; }
public bool? sandbox { get; }

...
}
  • invoiceId — идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStore.
  • orderId — уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).
  • productId — идентификатор приобретенного продукта, указанный при создании в консоли разработчика RuStore.
  • productType - тип продукта (NON_CONSUMABLE_PRODUCT - непотребляемый товар, CONSUMABLE_PRODUCT - потребляемый товар, SUBSCRIPTION - подписка).
  • purchaseId — идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.
  • purchaseType — тип покупки (ONE_STEP/TWO_STEP/UNDEFINED — одностадийная/двухстадийная/стадийность не определена).
  • quantity — количество товара, заданное при старте покупки.
  • sandbox — флаг, указывающий признак тестового платежа в песочнице. Если TRUE - покупка совершена в режиме тестирования.

Модель отмены оплаты

public sealed class ProductPurchaseCancelled : RuStorePaymentException {

public ProductType? productType { get; }
public PurchaseId? purchaseId { get; }
public PurchaseType? purchaseType { get; }

...
}
  • purchaseId — идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупке.
  • purchaseType — тип покупки (ONE_STEP/TWO_STEP/UNDEFINED — одностадийная/двухстадийная/стадийность не определена).
  • productType — тип продукта (NON_CONSUMABLE_PRODUCT - непотребляемый товар, CONSUMABLE_PRODUCT - потребляемый товар, SUBSCRIPTION - подписка).

Серверная валидация покупки

Если вам необходимо произвести валидацию успешной покупки на сервере RuStore, вы можете использовать invoiceId из модели SuccessProductPurchaseResult, возвращаемой при успешной покупке продукта.

Получение invoiceId из результата покупки
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);
});
});

Подтверждение покупки

Подтверждения требуют только покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки, после успешного холдирования будут находиться в статусе ProductPurchaseStatus.PAID.

Для списания средств с карты покупателя требуется подтверждение покупки. Для этого вы должны использовать метод ConfirmTwoStepPurchase.

Вызов метода подтверждения
PurchaseId id = ...
DeveloperPayload payload = ...

RuStorePayClient.Instance.ConfirmTwoStepPurchase(
purchaseId: purchaseId,
developerPayload: payload,
onFailure: (error) => {
// Process error
},
onSuccess: () => {
// Process success
});
  • purchaseId — идентификатор покупки.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование) (опционально). Максимум 250 символов (символы не экранируются). Если передан, заменяет значение, записанное при старте покупки методом Purchase/PurchaseTwoStep.

Отмена покупки

Через SDK можно отменять только те покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки после успешного холдирования будут находиться в статусе ProductPurchaseStatus.PAID. После отмены покупки будут переходить в статус ProductPurchaseStatus.REVERSED.

подсказка

Используйте отмену покупки в случаях, если после оплаты (холдирования средств) вы не можете предоставить покупателю товар.

Для отмены покупки (холда) используйте метод CancelTwoStepPurchase.

Вызов метода CancelTwoStepPurchase
PurchaseId id = ...

RuStoreBillingClient.Instance.CancelTwoStepPurchase(
purchaseId: id,
onFailure: (error) => {
// Process error
},
onSuccess: () => {
// Process success
}
);
  • purchaseId — идентификатор покупки.

Работа с подтверждением выдачи товара

Для обновления состояния подтверждения покупки используйте метод updateAcknowledgementState.

Вызов метода UpdateAcknowledgementState
PurchaseId purchaseId = ...
AcknowledgementState state = ...
DeveloperPayload payload = ...

RuStorePayClient.Instance.UpdateAcknowledgementState(
purchaseId: purchaseId,
acknowledgementState: state,
developerPayload: payload,
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process success
});

Логика не является обязательной и не влияет на проведение платежей. Она позволяет хранить на стороне RuStore состояние обработки покупки, чтобы затем при получении списка покупок с отдельной фильтрацией выбирать только необработанные покупки и выполнять по ним выдачу товара.

После успешного проведения платежа статус выдачи товара по умолчанию имеет значение PENDING.

Для платежей, совершённых в более ранних версиях SDK, где эта логика ещё не поддерживалась, используется статус UNKNOWN. При необходимости такой статус можно изменить на любой другой.

Статус обработки можно изменять в обе стороны: например, переводить покупку из PENDING в ACKNOWLEDGED, а также возвращать её в предыдущий статус, если требуется отозвать ранее выданный товар, например после возврата платежа.

При вызове этого метода значение developerPayload можно обновить. Если параметр передан, текущее значение будет перезаписано. Если параметр не передан, сохранится текущее значение developerPayload.

  • purchaseId — идентификатор покупки.
  • acknowledgementState — новое состояние подтверждения покупки. Доступные значения: AcknowledgementState.PENDING, AcknowledgementState.ACKNOWLEDGED, AcknowledgementState.UNKNOWN.
  • developerPayload — строка с дополнительной информацией о заказе, которую вы можете установить при подтверждении покупки. Эта строка переопределяет значение, заданное при инициализации. Максимальная длина 250 символов. Символы не экранируются (при использовании кавычек требуется экранирование) (опционально).

RuStoreUtils

RuStoreUtils — это блок в нативном SDK, содержащий набор публичных методов, предназначенных для взаимодействия с приложением RuStore на устройстве пользователя.

Для доступа к методам блока в среде Unity используется синглтон класса RuStoreCoreClient.

Метод IsRuStoreInstalled проверяет наличие приложения RuStore на устройстве пользователя.

Вызов метода IsRuStoreInstalled
if (RuStorePayClient.Instance.IsRuStoreInstalled()) {
// RuStore установлен на устройстве пользователя
} else {
// RuStore не установлен на устройстве пользователя
}

Метод openRuStoreDownloadInstruction открывает веб-страницу для скачивания мобильного приложения RuStore.

Вызов метода openRuStoreDownloadInstruction
RuStoreCoreClient.Instance.openRuStoreDownloadInstruction();

Метод openRuStore запускает мобильное приложение RuStore. При вызове данного метода, в случае отсутствия установленного приложения RuStore, будет отображено Toast уведомление с сообщением "Не удалось открыть приложение".

Вызов метода openRuStore
RuStoreCoreClient.Instance.openRuStore();

Метод openRuStoreAuthorization запускает мобильное приложение RuStore для авторизации. После успешной авторизации пользователя приложение RuStore автоматически закрывается. При вызове данного метода, в случае отсутствия установленного приложения RuStore, будет отображено Toast уведомление с сообщением "Не удалось открыть приложение".

Вызов метода openRuStoreAuthorization
RuStoreCoreClient.Instance.openRuStoreAuthorization();

Использование RuStoreUtils для проверки платежных сценариев

Кейс применения RuStoreUtils для проверки наличия RuStore на устройстве и работы с авторизацией пользователя рассмотрен в статье Прием платежей без установки RuStore.

В статье приведены:

  • Сценарии работы с покупками при отсутствии установленного RuStore;

  • Примеры последовательного вызова методов проверки установки и авторизации через RuStoreUtils;

  • Особенности поведения SDK в разных условиях (наличие/отсутствие RuStore, авторизация пользователя и др.).

Список ошибок

RuStoreError — базовый класс ошибки.

Класс 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), по которому можно определить причину ошибки. Таблица с кодами ошибок доступна в разделе коды ошибок.

Класс RuStorePaymentNetworkException
public class RuStorePaymentNetworkException : RuStorePaymentException {
public string? code { get; }
public string id { get; }
...
}
  • code — код ошибки.
  • id — уникальный идентификатор.

Унаследованные поля:

  • name – имя ошибки.
  • description – описание ошибки.
  • cause – дополнительная информация об ошибке.

Возможные ошибки

  • RuStorePaymentNetworkException — ошибка сетевого взаимодействия SDK;
  • RuStorePaymentException — базовый класс всех исключений SDK, наследуется от Exception;
  • RuStorePayClientAlreadyExist — ошибка повторной инициализации SDK;
  • RuStorePayClientNotCreated — попытка обратиться к публичным интерфейсам SDK до момента ее инициализации;
  • RuStorePayInvalidActivePurchase — запущен процесс оплаты неизвестного типа продукта;
  • RuStorePayInvalidConsoleAppId — не задан обязательный параметр console_application_id для инициализации SDK;
  • RuStorePaySignatureException — неверная сигнатура ответа. Возникает при попытке совершить мошеннические действия;
  • EmptyPaymentTokenException — ошибка получения платежного токена;
  • InvalidCardBindingIdException — ошибка оплаты сохраненной картой;
  • ApplicationSchemeWasNotProvided — не указана схема для обратного диплинка;
  • ProductPurchaseException - ошибка покупки продукта. Структура модели представлена в разделе структура результата покупки;
  • ProductPurchaseCancelled - произошла отмена покупки продукта (пользователь закрыл платежную шторку). Структура модели представлена в разделе структура результата покупки;
  • 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Выписанный токен не соответствует покупаемому товару.
4000041У пользователя уже есть активная подписка для данного кода продукта.
4000045Превышено максимальное значение размера.
4010001Доступ к запрашиваему ресурсу запрещен (неавторизовано).
4010002Время жизни токена истекло.
4010003Платежный токен невалиден.
4030001Не передан платежный токен.
4030002Пользователь заблокирован по требованиям безопасности.
4040002, 4040003, 4040004Ошибка платежной системы.
5000***Внутренняя ошибка.