7.0.0 (Beta)
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Условия работы платежей
- Для приложения включена возможность покупок в RuStore Консоли.
- Приложение не должно быть заблокировано в RuStore.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь авторизован в RuStore.
- Пользователь не должен быть заблокирован в RuStore.
Подготовка к работе
Для подключения пакета платежей к проекту выполните следующую команду.
flutter pub add flutter_rustore_billing
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию. Сама инициализация происходит автоматически, но для работы SDK в вашем файле AndroidManifest.xml
необходимо прописать consoleApplicationId
.
<meta-data
android:name="console_app_id_key"
android:value="@string/CONSOLE_APPLICATION_ID" />
В strings.xml
замените строку с вашим app_id
.
<string name="CONSOLE_APPLICATION_ID">"your_app_id"</string>
CONSOLE_APPLICATION_ID
— идентификатор приложения из консоли RuStore.
Где в RuStore Консоль отображаются идентификаторы приложений?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между
apps/
и/versions
. Например, для URL-адресаhttps://console.rustore.ru/apps/123456/versions
ID приложения —123456
.
ApplicationId
, указанный в build.gradle
, должен совпадать с applicationId
APK-файла, который вы публиковали в RuStore Консоль.
debug
) приложения должна совпадать с подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например, release
)Работа с SDK
В SDK доступны 2 публичных интерактора:
PurchaseInteractor
— интерактор, который позволяет работать с платежами и имеет несколько публичных методов:getPurchase(purchaseId: PurchaseId): Task<Purchase>
- позволяет получить информацию о покупке по её идентификатору;getPurchases(): Task<List<Purchase>>
- позволяет получить покупки пользователя. В списке возвращаются покупки в статусеCONFIRMED
для непотребляемых товаров иPAID
(статус, означающий холдирование средств и ожидающих подтверждения покупки со стороны разработчика);getPurchaseAvailability(): Task<PurchaseAvailabilityResult>
- возвращает результат доступности работы с платежами;consumePurchase(purchaseId: PurchaseId, developerPayload: DeveloperPayload? = null)
— позволяет совершить потребление покупки (только для потребляемых товаров).
ProductInteractor
— интерактор, который позволяет работать с продуктами и имеет несколько публичных методов:-
getProducts(productsId: List<ProductId>): Task<List<Product>>
— позволяет получить информацию по продуктам по их ID.
(Важно! Метод имеет ограничение в 1000 продуктов) -
purchase(params: ProductPurchaseParams): Task<ProductPurchaseResult>
— позволяет совершить покупку продукта
-
Также доступен RuStoreUtils
— блок, включающий набор публичных методов:
isRuStoreInstalled
— проверки наличия приложения RuStore на девайсе пользователя;openRuStore
— запускает мобильное приложение RuStore;openRuStoreAuthorization
— запускает мобильное приложение RuStore для авторизации, после успешной авторизации пользователя мобильное приложение RuStore автоматически закроется;openRuStoreDownloadInstruction
— открывает веб-страницу для скачивания мобильного приложения RuStore.
Проверка доступности работы с платежами
Для проверки доступности платежей, вызовите метод getPurchaseAvailability
. При его вызове проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Приложение RuStore поддерживает функциональность платежей.
- Пользователь авторизован в RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Для приложения включена во зможность покупок в RuStore Консоли.
Если все указанные выше условия выполняются, возвращается PurchaseAvailabilityResponse.Available
.В противном случае возвращается PurchaseAvailabilityResponse.Unavailable(val cause: Throwable)
, где cause
— это ошибка о невыполненном условии.
RuStorePayClient.instance.purchaseInteractor.getPurchaseAvailability().then((value) {
if (value case Available _) {
// Process purchases available
} else if (value case Unavailable unavailable) {
// Process purchases unavailable
}
});
Получение списка продуктов
Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод getProducts
.
RuStorePayClient.instance.productInteractor.getProducts(productIds).then((response) {
for (final product in response.products) {
print(product?.productId);
}
}, onError: (err) {
print("products err: $err");
}
);
productIds: List<ProductId>
— список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.
Где в RuStore Консоль отображаются идентификаторы продуктов?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Выберите Монетизация в меню слева.
- Выберите тип товара: Подписки или Разовые покупки.
- Скопируйте идентификаторы нужных товаров.
Метод возвращает список продуктов. Ниже представлена модель продукта.
class Product {
String productId;
ProductType type;
String amountLabel;
int? price;
String currency;
String imageUrl;
String title;
String? description;
}
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).type
— тип продукта.CONSUMABLE/NON-CONSUMABE
(потребляемый/непотребляемый).amountLabel
— отформатированная цена покупки, включая валютный знак.price
— цена в минимальных единицах (в копейках).currency
— код валюты ISO 4217.title
— название продукта на языкеlanguage
.description
— описание на языкеlanguage
.imageUrl
— ссылка на картинку.
Структура ProductType
.
enum ProductType {
consumable,
nonConsumable,
}
consumable
— потребляемый (можно купить много раз, например: кристаллы в приложении);nonConsumable
— непотребляемый (можно купить один раз, например: отключение рекламы в приложении);
Покупка продукта
Одностадийная оплата (без холдирования средств)
RuStorePayClient.instance.productInteractor.purchaseOneStep(id).then((value) {
// Process success
});
Двухстадийная оплата (с холдированием средств)
RuStorePayClient.instance.productInteractor.purchaseTwoStep(id).then((value) {
// Process success
});
Получение списка покупок
Для получения списка покупок пользователя используйте метод getPurchases
.
RuStorePayClient.instance.purchaseInteractor.getPurchases().then((purchase) {
// Process success
});
class Purchase {
String purchaseId;
String productId;
String invoiceId;
String? orderId;
PurchaseType purchaseType;
ProductType productType;
String description;
String? purchaseTime;
int price;
String amountLabel;
String currency;
int quantity;
PurchaseStatus status;
String? subscriptionToken;
String? developerPayload;
}
purchaseId
— идентификатор покупки.productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).invoiceId
— идентификатор счёта.orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.purchaseType
— тип покупки.productType
— тип продукта (потребляемый / непотребляемый / подписка):CONSUMABLE
/NON-CONSUMABE
/SUBSCRIPTION
.description
— описание на языкеlanguage
.purchaseTime
— время покупки.price
— цена в минимальных единицах (в копейках).amountLable
— отформатированная цена покупки, включая валютный знак.currency
— код валюты ISO 4217.quantity
— количество продукта (необязательный параметр — если не указывать, будет подставлено значение1
).purchaseState
— состояние покупки:INVOICE_CREATED
— создан счёт на оплату, покупка ожидает оплаты;CANCELLED
— покупка отменена покупателем;PROCESSING
— запущена оплата;-
REJECTED
— покупка отклонена (например, ввиду недостатка средств) PAID
— только для двухстадийной оплаты, промежуточный статус, средства на счёте покупателя захолдированы, покупка ожидает подтверждения от разработчика;CONFIRMED
— покупка успешно оплачена;REFUNDED
— запрос на возврат средств за покупку совершён успешно;REVERSED
— только для двухстадийной оплаты, покупка была отменена разработчиком или не было произведено подтверждение покупки в течение 72 часов, холдирование средств отменено.
DeveloperPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки.
Структура PurchaseType
.
enum PurchaseType {
oneStep,
twoStep,
}
Получение сведений о покупке
Для полу чения информации о покупке, используйте методgetPurchase
.
RuStorePayClient.instance.purchaseInteractor.getPurchase(purchaseId).then((purchase) {
// Process success
});
Метод возвращает информацию о конкретной покупке в любом статусе. Ниже представлена модель покупки.
class Purchase {
String purchaseId;
String productId;
String invoiceId;
String? orderId;
PurchaseType purchaseType;
ProductType productType;
String description;
String? purchaseTime;
int price;
String amountLabel;
String currency;
int quantity;
PurchaseStatus status;
String? subscriptionToken;
String? developerPayload;
}
Статусная модель покупки
Статусная модель одностадийного платежа.
Статусная модель двухстадийного платежа.
Потребление (подтверждение) покупки
Подтверждения требуют только покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки, после успешного холдирования будут находиться в статусе PurchaseStatus.PAID
.
Для списания средств с карты покупателя требуется подтверждение покупки. Для этого вы должны использовать метод confirmTwoStepPurchase
.
RuStorePayClient.instance.purchaseInteractor.confirmTwoStepPurchase(purchaseId).then((value) {
// Process success
});
id
— идентификатор покупки.-
developerPayload
— строка с дополнительн ой информацией о заказе, которую вы можете установить при инициализации процесса покупки
Валидация покупок на сервере
Если вам необходимо произвести валидацию успешной покупки на сервере RuStore, вы можете использовать subscriptionToken
в ProductPurchaseResult.SuccessProductPurchaseResult
, возвращаемой при успешной покупке продукта.
Также можно получить subscriptionToken
в сущности Purchase
. Сущность Purchase
можно получить, используя метод getPurchases()
.
RuStorePayClient.instance.getPurchases().then((response) {
for (final purchase in response.purchases) {
print(purchase?.subscriptionToken);
}
}, onError: (err) {
print("purchases err: $err" );
}
);
Отмена покупки
Через SDK можно отменить только те покупки, которые были запущены по двухстадийному сценарию оплаты, т.е. с холдированием средств. Такие покупки после успешной оплаты будут находиться в статусе PurchaseStatus.paid
. Отмена покупки фактически означает отмену холда средств.
RuStorePayClient.instance.purchaseInteractor.cancelTwoStepPurchase(id).then((value) {
// Process success
});
id
— идентификатор покупки.
Методы утилиты RuStoreFlutterUtils (публичные методы)
Проверка наличия приложения RuStore на устройстве пользователя.
RuStorePayClient.instance.ruStoreUtils.isRuStoreInstalled().then((isInstalled) {
});
Метод возвращает логическое значение isInstalled
.
Открытие веб-страницы для скачивания приложения RuStore.
RuStorePayClient.instance.ruStoreUtils.openRuStoreDownloadInstruction()
Запуск приложения RuStore
RuStorePayClient.instance.ruStoreUtils.openRuStore()
Запуск приложения RuStore для авторизации. После успешной авторизации пользователя приложение RuStore автоматически закроется.
RuStorePayClient.instance.ruStoreUtils.openRuStoreAuthorization()
Обработка ошибок
RuStorePaymentNetworkException
— ошибка сетевого взаимодействия SDK;RuStorePaymentCommonException
— общая ошибка SDK;RuStorePayClientAlreadyExist
— ошибка повторной инициализации SDK;RuStorePayClientNotCreated
— попытка обратиться к публичным интерфейсам SDK до момента её инициализации;RuStorePayInvalidActivePurchase
— запущен процесс оплаты неизвестного типа продукта;RuStorePayInvalidConsoleAppId
— не задан обязательный параметрсonsole_application_id
для инициализации SDK;RuStorePaySignatureException
— неверная сигнатура ответа (возникает при попытке совершить м ошеннические действия);EmptyPaymentTokenException
— ошибка получения платежного токена;RuStoreNotInstalledException
— на устройстве пользователя не установлен RuStore;RuStoreOutdatedException
— версия RuStore, установленная на устройстве пользователя, не поддерживает данный SDK;RuStoreUserUnauthorizedException
— пользователь не авторизован в RuStore;RuStoreApplicationBannedException
— приложение заблокировано в RuStore;RuStoreUserBannedException
— пользователь заблокирован в RuStore;RuStoreException
— базовая ошибка RuStore, от которой наследуются остальные ошибки.