6.1.0 (Beta)
RuStore позволяет интегрировать платежи в мобильное приложение.
-
Если не знаете с чего начать, прочтите инструкцию в сценариях использования.
-
Если вы переходите на Pay SDK с billingClient SDK, ознакомьтесь с инструкцией по переходу. Подробности о Pay SDK можно узнать тут.
Условия работы платежей
- Для приложения включена возможность покупок в RuStore Консоли.
- Приложение не должно быть заблокировано в RuStore.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь авторизован в RuStore.
- Пользователь не должен быть заблокирован в RuStore.
Подключение в проект
Добавление репозитория
Подключите репозиторий, как показано в примере ниже.
repositories {
maven {
url = uri("https://artifactory-external.vkpartner.ru/artifactory/maven")
}
}
Подключение зависимости
Добавьте следующий код в свой конфигурационный файл для подключения зависимости.
dependencies {
implementation(platform("ru.rustore.sdk:bom:6.1.0"))
implementation("ru.rustore.sdk:pay")
}
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию.
Сама инициализация происходит автоматически, но для работы SDK в вашем файле manifest.xml
необходимо прописать console_app_id_key
.
Сделать это можно следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="your.app.package.name">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.App"
tools:targetApi="n">
...
<meta-data
android:name="console_app_id_key"
android:value="@string/CONSOLE_APPLICATION_ID" />
</application>
</manifest>
-
Пример:CONSOLE_APPLICATION_ID
— идентификатор приложения из консоли RuStore.https://console.rustore.ru/apps/111111
.
Где в RuStore Консоль отображаются идентификаторы приложений?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Скопируйте идентификатор из URL-адреса страницы приложения — это набор цифр между
apps/
и/versions
. Например, для URL-адресаhttps://console.rustore.ru/apps/123456/versions
ID приложения —123456
.
ApplicationId
, указанный вbuild.gradle
, должен совпадать сapplicationId
APK-файла, который вы публиковали в RuStore Консоль.-
Подпись
keystore
должна совпадать с подписью, которой было подписано приложение, опубликованное в RuStore Консоль. Убедитесь, что используемыйbuildType
(пр.debug
) использует такую же подпись, что и опубликованное приложение (пр.release
).
Работа с SDK
Доступные публичные интеракторы:
PurchaseInteractor
— интерактор, который позволяет работать с платежами и имеет несколько публичных методов:getPurchase(purchaseId: PurchaseId): Task<Purchase>
— позволяет получить информацию о покупке по её идентификатору.getPurchases(): Task<List<Purchase>>
— позволяет получить покупки пользователя. В списке возвращаются покупки в статусеCONFIRMED
для непотребляемых товаров иPAID
для потребляемых товаров.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 на устройстве пользователя.openRuStoreDownloadInstruction
— открывает страницу скачивания мобильного приложения RuStore.openRuStore
— запускает мобильное приложение RuStore.openRuStoreAuthorization
— запускает мобильное приложение RuStore для авторизации. После успешной авторизации пользователя RuStore автоматически закроется.
Проверка доступности работы с платежами
- Kotlin
- Java
Для проверки доступности платежей, вызовите метод getPurchaseAvailability
у PurchaseInteractor
. При его вызове проверяются следующие условия:
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь авторизован в RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- У компании подключена монетизация через консоль разработчика RuStore.
Если все условия выполняются, возвращается PurchaseAvailabilityResult.Available
.
Иначе возвращается PurchaseAvailabilityResult.Unavailable(val cause: Throwable)
, где cause
— ошибка о невыполненном условии.
Чтобы понять причину ошибки, проверьте её тип на RuStoreException
.
См. Обработка ошибок.
Например, если вы получили RuStoreUserUnauthorizedException
, это означает, что пользователь не авторизован в RuStore.
В этом случае вы можете вызвать метод openRuStoreAuthorization
, который запускает мобильное приложение RuStore для авторизации.
Другие доступные методы см. в разделе Работа с SDK.
RuStorePayClient.getPurchaseInteractor().getPurchaseAvailability()
.addOnSuccessListener { result ->
when (result) {
is PurchaseAvailabilityResult.Available -> {
// Process purchases available
}
is PurchaseAvailabilityResult.Unavailable -> {
// Process purchases unavailable
}
}
}.addOnFailureListener { throwable ->
// Process unknown error
}
Для проверки доступности платежей, вызовите метод getPurchaseAvailability
у PurchaseInteractor
. При его вызове проверяются следующие условия:
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь авторизован в RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- У компании подключена монетизация через консоль разработчика RuStore.
Если все условия выполняются, возвращается PurchaseAvailabilityResult.Available
.
Иначе возвращается PurchaseAvailabilityResult.Unavailable(val cause: Throwable)
, где cause
— ошибка о невыполненном условии.
Чтобы понять причину ошибки, проверьте её тип на RuStoreException
.
См. Обработка ошибок.
Например, если вы получили RuStoreUserUnauthorizedException
, это означает, что пользователь не авторизован в RuStore.
В этом случае вы можете вызвать метод openRuStoreAuthorization
, который запускает мобильное приложение RuStore для авторизации.
Другие доступные методы см. в разделе Работа с SDK.
PurchaseInteractor purchaseInteractor = RuStorePayClient.Companion.getInstance().getPurchaseInteractor();
purchaseInteractor.getPurchaseAvailability()
.addOnSuccessListener(result -> {
if (result instanceof PurchaseAvailabilityResult.Available) {
// Process purchases available
} else if (result instanceof PurchaseAvailabilityResult.Unavailable) {
// Process purchases unavailable
}
})
.addOnFailureListener(throwable -> {
// Process unknown error
});
Работа с продуктами
Получение списка продуктов
- Kotlin
- Java
Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод getProducts
.
RuStorePayClient.instance.getProductInteractor().getProducts(productsId = listOf(ProductId("id1"), ProductId("id2")))
.addOnSuccessListener { products: List<Product> ->
// Process success
}
.addOnFailureListener { throwable: Throwable ->
// Process error
}
productsId: List<ProductId>
— список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.
Где в RuStore Консоль отображаются идентификаторы продуктов?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Выберите Монетизация в меню слева.
- Выберите тип товара: Подписки или Разовые покупки.
- Скопируйте идентификаторы нужных товаров.
Метод возвращает список продуктов. Ниже представлена модель продукта.
public class Product internal constructor(
public val productId: ProductId,
public val type: ProductType,
public val amountLabel: AmountLabel,
public val price: Price?,
public val currency: Currency,
public val imageUrl: Url,
public val title: Title,
public val description: Description?,
)
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).type
— тип продукта.CONSUMABLE/NON-CONSUMABE
(потребляемый/непотребляемый).amountLabel
— отформатированная цена покупки, включая валютный знак.price
— цена в минимальных единицах (в копейках).currency
— код валюты ISO 4217.title
— название продукта на языкеlanguage
.description
— описание на языкеlanguage
.imageUrl
— ссылка на картинку.
Примеры ответа
Product(
productId = ProductId("conProduct1"),
type = ProductType.CONSUMABLE_PRODUCT,
amountLabel = AmountLabel("100.00 руб."),
price = Price(10000),
currency = Currency("RUB"),
imageUrl = Url("https://your_image_consumable_product.png"),
title = Title("Название Потребляемого продукта"),
description = Description("Описание потребляемого продукта"),
)
Product(
productId = ProductId("nonConProduct1"),
type = ProductType.NON_CONSUMABLE_PRODUCT,
amountLabel = AmountLabel("200.00 руб."),
price = Price(20000),
currency = Currency("RUB"),
imageUrl = Url("https://your_image_non_consumable_product.png"),
title = Title("Название Непотребляемого продукта"),
description = Description("Описание Непотребляемого продукта"),
)
Для получения продуктов, добавленных в ваше приложение через RuStore консоль, необходимо использовать метод getProducts
.
List<ProductId> productIds = Arrays.asList(new ProductId("id1"), new ProductId("id2"));
ProductInteractor productInteractor = RuStorePayClient.Companion.getInstance().getProductInteractor();
productInteractor.getProducts(productsId)
.addOnSuccessListener(products -> {
// Process success
})
.addOnFailureListener(throwable -> {
// Process error
});
productsId: List<ProductId>
— список идентификаторов продуктов (задаются при создании продукта в консоли разработчика). Список продуктов имеет ограничение в размере 1000 элементов.
Где в RuStore Консоль отображаются идентификаторы продуктов?
- Перейдите на вкладку Приложения и выберите нужное приложение.
- Выберите Монетизация в меню слева.
- Выберите тип товара: Подписки или Разовые покупки.
- Скопируйте идентификаторы нужных товаров.
Метод возвращает список продуктов. Ниже представлена модель продукта:
public class Product {
private final ProductId productId;
private final ProductType type;
private final AmountLabel amountLabel;
private final Price price;
private final Currency currency;
private final Url imageUrl;
private final Title title;
private final Description description;
public Product(ProductId productId, ProductType type, AmountLabel amountLabel, @Nullable Price price, Currency currency, Url imageUrl, Title title, @Nullable Description description) {
this.productId = productId;
this.type = type;
this.amountLabel = amountLabel;
this.price = price;
this.currency = currency;
this.imageUrl = imageUrl;
this.title = title;
this.description = description;
}
public ProductId getProductId() {
return productId;
}
public ProductType getType() {
return type;
}
public AmountLabel getAmountLabel() {
return amountLabel;
}
public @Nullable Price getPrice() {
return price;
}
public Currency getCurrency() {
return currency;
}
public Url getImageUrl() {
return imageUrl;
}
public Title getTitle() {
return title;
}
public @Nullable Description getDescription() {
return description;
}
}
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).type
— тип продукта.CONSUMABLE/NON-CONSUMABE
(потребляемый/непотребляемый).amountLabel
— отформатированная цена покупки, включая валютный знак.price
— цена в минимальных единицах (в копейках).currency
— код валюты ISO 4217.title
— название продукта на языкеlanguage
.description
— описание на языкеlanguage
.imageUrl
— ссылка на картинку.
Примеры ответа
Product(
productId = ProductId("conProduct1"),
type = ProductType.CONSUMABLE_PRODUCT,
amountLabel = AmountLabel("100.00 руб."),
price = Price(10000),
currency = Currency("RUB"),
imageUrl = Url("https://your_image_consumable_product.png"),
title = Title("Название Потребляемого продукта"),
description = Description("Описание потребляемого продукта"),
)
Product(
productId = ProductId("nonConProduct1"),
type = ProductType.NON_CONSUMABLE_PRODUCT,
amountLabel = AmountLabel("200.00 руб."),
price = Price(20000),
currency = Currency("RUB"),
imageUrl = Url("https://your_image_non_consumable_product.png"),
title = Title("Название Непотребляемого продукта"),
description = Description("Описание Непотребляемого продукта"),
)
Работа с покупками
Получение списка покупок
- Kotlin
- Java
Для получения списка покупок пользователя используйте метод getPurchases
.
RuStorePayClient.getPurchaseInteractor().getPurchases()
.addOnSuccessListener { purchases: List<Purchase> ->
// Process success
}
.addOnFailureListener { throwable: Throwable ->
// Process error
}
Метод возвращает список покупок в статусах CONFIRMED
для непотребляемых товаров и PAID
для потребляемых товаров.
Ниже представлена модель покупки:
public class Purchase internal constructor(
public val purchaseId: PurchaseId,
public val productId: ProductId,
public val invoiceId: InvoiceId,
public val orderId: OrderId?,
public val type: PurchaseType,
public val description: Description,
public val purchaseTime: Date?,
public val price: Price,
public val amountLabel: AmountLabel,
public val currency: Currency,
public val quantity: Quantity,
public val status: PurchaseStatus,
public val subscriptionToken: SubscriptionToken?,
public val developerPayload: DeveloperPayload?,
)
purchaseId
— идентификатор покупки.productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).invoiceId
— идентификатор счёта.orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.type
— тип продукта (потребляемый / непотребляемый):CONSUMABLE
/NON-CONSUMABE
.description
— описание покупки.purchaseTime
— время покупки.price
— цена в минимальных единицах валюты.amountLable
— отформатированная цена покупки, включая валютный знак.currency
— код валюты ISO 4217.quantity
— количество продукта (необязательный параметр — если не указывать, будет подставлено значение1
).purchaseState
— состояние покупки.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки.
Для получения списка покупок пользователя используйте метод getPurchases
.
PurchaseInteractor purchaseInteractor = RuStorePayClient.Companion.getInstance().getPurchaseInteractor();
purchaseInteractor.getPurchases()
.addOnSuccessListener(purchases -> {
// Process PaymentResult
})
.addOnFailureListener(error -> {
// Process error
});
Метод возвращает список покупок в статусах CONFIRMED
для непотребляемых товаров и PAID
для потребляемых товаров.
Ниже представлена модель покупки:
public class Purchase {
private final PurchaseId purchaseId;
private final ProductId productId;
private final InvoiceId invoiceId;
private final OrderId orderId;
private final PurchaseType type;
private final Description description;
private final Date purchaseTime;
private final Price price;
private final AmountLabel amountLabel;
private final Currency currency;
private final Quantity quantity;
private final PurchaseStatus status;
private final SubscriptionToken subscriptionToken;
private final DeveloperPayload developerPayload;
public Purchase(PurchaseId purchaseId, ProductId productId, InvoiceId invoiceId, OrderId orderId, PurchaseType type, Description description, Date purchaseTime, Price price, AmountLabel amountLabel, Currency currency, Quantity quantity, PurchaseStatus status, SubscriptionToken subscriptionToken, @Nullable DeveloperPayload developerPayload) {
this.purchaseId = purchaseId;
this.productId = productId;
this.invoiceId = invoiceId;
this.orderId = orderId;
this.type = type;
this.description = description;
this.purchaseTime = purchaseTime;
this.price = price;
this.amountLabel = amountLabel;
this.currency = currency;
this.quantity = quantity;
this.status = status;
this.subscriptionToken = subscriptionToken;
this.developerPayload = developerPayload;
}
public PurchaseId getPurchaseId() {
return purchaseId;
}
public ProductId getProductId() {
return productId;
}
public InvoiceId getInvoiceId() {
return invoiceId;
}
public @Nullable OrderId getOrderId() {
return orderId;
}
public PurchaseType getType() {
return type;
}
public Description getDescription() {
return description;
}
public Date getPurchaseTime() {
return purchaseTime;
}
public Price getPrice() {
return price;
}
public AmountLabel getAmountLabel() {
return amountLabel;
}
public Currency getCurrency() {
return currency;
}
public Quantity getQuantity() {
return quantity;
}
public PurchaseStatus getStatus() {
return status;
}
public @Nullable SubscriptionToken getSubscriptionToken() {
return subscriptionToken;
}
public @Nullable DeveloperPayload getDeveloperPayload() {
return developerPayload;
}
}
purchaseId
— идентификатор покупки.productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).invoiceId
— идентификатор счёта.orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.type
— тип продукта (потребляемый / непотребляемый):CONSUMABLE
/NON-CONSUMABE
.description
— описание покупки.purchaseTime
— время покупки.price
— цена в минимальных единицах валюты.amountLable
— отформатированная цена покупки, включая валютный знак.currency
— код валюты ISO 4217.quantity
— количество продукта (необязательный параметр — если не указывать, будет подставлено значение1
).purchaseState
— состояние покупки.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки.subscriptionToken
— токен для валидации покупки на сервере.