Пример подключения библиотеки RuStore Pay SDK для React Native
Этот проект демонстрирует подключение и использование библиотеки ru.rustore.sdk-wrapper.react-native:pay:10.0.1 для работы с платежной системой SDK Pay в React Native приложении.
Подключение библиотеки
Android
Библиотека подключена в файле android/app/build.gradle:
dependencies {
implementation("com.facebook.react:react-android")
implementation("ru.rustore.sdk-wrapper.react-native:pay:10.0.1")
// ... остальные зависимости
}
Так же нужно указать репозиторий, для того чтобы необходимые зависимости скачались
maven {
url = uri("https://artifactory-external.vkpartner.ru/artifactory/maven")
}
Настройка проекта
- Application ID:
ru.rustore.react.pay.example - Минимальная версия SDK: Android API 24
- Целевая версия SDK: Android API 36
Регистрация нативного модуля
Для работы библиотеки необходимо зарегистрировать нативный модуль в MainApplication.java:
import ru.rustore.react.pay.RuStoreReactPayPackage;
// ...
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new RuStoreReactPayPackage());
return packages;
}
JavaScript интерфейс
В проекте реализован JavaScript интерфейс для работы с нативным модулем Android. Все методы расположены в директории src/libs/RuStoreReactPay/ эти файлы необходимо перенести к себе в проект.
Основные файлы
index.tsx- основной модуль с методами для работы с платежамиtypes.ts- TypeScript типы для работы с платежами
Доступные методы
Получение информации о покупках
// Получить информацию о конкретной покупке
RuStoreReactPay.getPurchase(purchaseId: string): Promise<{
productPurchase?: ProductPurchase;
subscriptionPurchase?: SubscriptionPurchase;
}>
// Получить список покупок с фильтрацией
RuStoreReactPay.getPurchases(params?: {
productType?: ProductType;
purchaseStatus?: ProductPurchaseStatus | SubscriptionPurchaseStatus;
}): Promise<Array<{
productPurchase?: ProductPurchase;
subscriptionPurchase?: SubscriptionPurchase;
}>>
Структура моделей покупок
1. ProductPurchase (покупка товара)
purchaseId- идентификатор покупки. Используется для получения информации о покупке в SDK.invoiceId- идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей.orderId- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).purchaseType- тип покупки (одностадийная/двухстадийная).description- описание покупки.purchaseTime- время покупки.price- цена в минимальных единицах валюты.amountLabel- отформатированная цена покупки, включая валютный знак.currency- код валюты ISO 4217.status- состояние покупки товара.developerPayload- указанная разработчиком строка, содержащая дополнительную информацию о заказе.sandbox- флаг, указывающий признак тестового платежа. Если true - покупка совершена в режиме тестирования.productId- идентификатор приобретенного продукта, указанный при создании в консоли разработчика.productType- тип продукта.quantity- количество продукта.
2. SubscriptionPurchase (покупка подписки)
purchaseId- идентификатор покупки. Используется для получения информации о покупке в SDK.invoiceId- идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей.orderId- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).purchaseType- тип покупки (oneStep,twoStep- одностадийная/двухстадийная).description- описание покупки.purchaseTime- время покупки.price- цена в минимальных единицах валюты.amountLabel- отформатированная цена покупки, включая валютный знак.currency- код валюты ISO 4217.developerPayload- указанная разработчиком строка, содержащая дополнительную информацию о заказе.sandbox- флаг, указывающий признак тестового платежа. Если true - покупка совершена в режиме тестирования.status- состояние покупки подписки.productId- идентификатор приобретенной подписки, указанный при создании в консоли разработчика.expirationDate- дата окончания срока действия подписки.-
gracePeriodEnabled- флаг, указывающий, активен ли льготный период для подписки.Статусы покупок
Статусы покупки продукта
ProductPurchaseStatus: INVOICE_CREATED- создан счет на оплату, покупка ожидает оплаты.CANCELLED- отменён пользователем до запуска оплаты.PROCESSING- запущена оплата.REJECTED- отказ при платеже (недостаточно средств, невалидный CVC или другие причины).CONFIRMED- финальный статус успешного платежа, денежные средства списаны с покупателя.REFUNDED- запрос на возврат средств выполнен успешно. Деньги будут возвращены пользователю в течение 10 рабочих дней.REFUNDING- инициирован возврат, запрос отправлен в эквайер.EXECUTING- покупка находится в процессе выполнения.EXPIRED- срок действия счета истек.PAID- только для двухстадийной оплаты. Холдирование средств на карте пользователя прошло успешно, покупка ожидает подтверждения.REVERSED- только для двухстадийной оплаты. Не поступило запроса на подтверждение холда, холд отменён, деньги возвращены покупателю. Статусы покупки подпискиSubscriptionPurchaseStatus:INVOICE_CREATED- создан счет на оплату, подписка ожидает оплаты.CANCELLED- подписка отменена пользователем.EXPIRED- срок действия подписки истек.PROCESSING- платеж в обработке.REJECTED- платеж отклонен.ACTIVE- подписка активна.PAUSED- подписка приостановлена из-за проблем с оплатой.TERMINATED- закончились попытки списания по подписке (все были неуспешными). Подписка закрыта автоматически из-за проблем с оплатой.CLOSED- подписка была отменена пользователем или разработчиком. Истек срок оплаченного периода, подписка закрыта.
Проверка доступности покупок
// Проверить доступность покупок
RuStoreReactPay.getPurchaseAvailability(): Promise<PurchaseAvailability>
Работа с продуктами
// Получить информацию о продуктах
RuStoreReactPay.getProducts(ids: string[]): Promise<Product[]>
productId- идентификатор продукта, указанный при создании продукта в консоли разработчика.type- тип продукта (потребляемый / непотребляемый / подписка).amountLabel- отформатированная цена товара, включая валютный знак.price- цена в минимальных единицах (копейках).currency- код валюты ISO 4217.title- название продукта.description- описание продукта.imageUrl- ссылка на иконку продукта.
Покупки
// Одношаговая покупка
RuStoreReactPay.purchase(params: {
productId: string;
orderId?: string;
quantity?: number;
developerPayload?: string;
appUserId?: string;
appUserEmail?: string;
preferredPurchaseType?: PreferredPurchaseType;
}): Promise<ProductPurchaseResult>
// Двухшаговая покупка
RuStoreReactPay.purchaseTwoStep(params: {
productId: string;
orderId?: string;
quantity?: number;
developerPayload?: string;
appUserId?: string;
appUserEmail?: string;
}): Promise<ProductPurchaseResult>
Структура ProductPurchaseResult (результат успешного запуска покупки):
purchaseId- идентификатор покупки. Используется для получения информации о покупке в SDK методом получения информации о покупкеproductId- идентификатор приобретенного продукта, указанный при создании в консоли разработчика RuStore.invoiceId- идентификатор счета. Используется для серверной валидации платежа, поиска платежей в консоли разработчика, а также отображается покупателю в истории платежей в мобильном приложении RuStoreorderId- уникальный идентификатор оплаты, указанный разработчиком или сформированный автоматически (uuid).purchaseType- тип покупки (ONE_STEP/TWO_STEP - одностадийная\двухстадийная)productType- тип продукта (consumable, nonConsumable, subscription).sandbox- флаг, указывающий признак тестового платежа в песочнице. Если TRUE - покупка совершена в режиме тестированияquantity- кол-во купленного продукта.
// Подтверждение двухшаговой покупки
RuStoreReactPay.confirmTwoStepPurchase(params: {
//идентификатор покупки
purchaseId: string;
//дополнительная информация от разработчика AnyApp (опционально).Максимально 250 символов.
//Если передан, заменяет значение, записанное при старте покупки методом purchase/purchaseTwoStep.
developerPayload?: string;
}): Promise<void>
// Отмена двухшаговой покупки
RuStoreReactPay.cancelTwoStepPurchase(purchaseId: string): Promise<void>
Работа с RuStore
// Проверить статус авторизации пользователя
RuStoreReactPay.getUserAuthorizationStatus(): Promise<boolean>
// Проверить установлен ли RuStore
RuStoreReactPay.isRuStoreInstalled(): Promise<boolean>
// Открыть RuStore
RuStoreReactPay.openRuStore(): Promise<void>
// Открыть авторизацию в RuStore
RuStoreReactPay.openRuStoreAuthorization(): Promise<void>
// Открыть инструкцию по установке RuStore
RuStoreReactPay.openRuStoreDownloadInstruction(): Promise<void>
Обработка ошибок
// Проверить является ли ошибка ошибкой RuStore Pay
RuStoreReactPay.isRuStorePayError(error: unknown): error is RuStorePayError
Список ошибок и их описание https://www.rustore.ru/help/sdk/pay/kotlin-java/10-0-0#handlingerrors
Типы данных
Основные типы
ProductType- тип продукта (CONSUMABLE_PRODUCT, NON_CONSUMABLE_PRODUCT, SUBSCRIPTION, UNDEFINED)ProductPurchaseStatus- статус покупки продуктаSubscriptionPurchaseStatus- статус подпискиPurchaseType- тип покупки (ONE_STEP, TWO_STEP, UNDEFINED)PreferredPurchaseType- предпочтительный тип покупки
Пример использования
import { RuStoreReactPay } from './src/libs/RuStoreReactPay';
// Получить список продуктов
const products = await RuStoreReactPay.getProducts(['product1', 'product2']);
// Проверить доступность покупок
const availability = await RuStoreReactPay.getPurchaseAvailability();
// Выполнить покупку
const result = await RuStoreReactPay.purchase({
productId: 'product1',
quantity: 1,
appUserId: 'user123'
});
Запуск проекта
# Установка зависимостей
npm install
# Запуск на Android
npm run android
Требования
- Node.js >= 20
- React Native 0.81.4
- Android SDK 24+
- Установленный RuStore на устройстве для тестирования платежей
Примечания
- Все методы асинхронные и возвращают Promise
- Библиотека поддерживает как одностадийные, так и двухстадийными покупки
- Реализована полная TypeScript типизация для удобства разработки
- На данный момент покупка подписки может быть совершена только с использованием одностадийного платежа и потребуют предустановленный RuStore
Пояснения по работе с одностадийные и двухстадийными оплатами
-
При использовании одностадийного платежа покупка не требует подтверждения, денежные средства сразу списываются со счета покупателя, а с разработчика удерживается комиссия. В таком случае, если требуется вернуть денежные средства клиенту (например, по какой-то причине нет возможности выдать продукт), возможен только возврат средств через консоль разработчика, денежные средства возвращаются покупателю через несколько дней. Возвращается полная стоимость покупки, при этом удержанная комиссия разработчику не возмещается.
-
В случае использования двухстадийного платежа сначала производится холдирование средств на счете покупателя. Комиссия в этом случае не удерживается. После холдирования покупка требует подтверждения или отмены. Комиссия с разработчика удерживается при подтверждении покупки. Отмена покупки означает снятие холда - денежные средства мгновенно снова доступны покупателю. ВАЖНО! Не все способы оплаты поддерживают двухстадийную оплату.