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
— токен для валидации покупки на сервере.
Получение сведений о покупке
- Kotlin
- Java
getPurchase
.
RuStorePayClient.getPurchaseInteractor().getPurchase(PurchaseId("purchaseId"))
.addOnSuccessListener { purchase: Purchase ->
// Process success
}
.addOnFailureListener { throwable: Throwable ->
// Process error
}
Метод возвращает информацию о конкретной покупке в любом статусе. Ниже представлена модель покупки:
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
— состояние покупки.Промежуточные статусы:
INVOICE_CREATED
— создан счёт на оплату, покупка ожидает оплаты.PROCESSING
— запущена оплата.PAID
— только покупки потребляемого товара — промежуточный статус, средства на счёте покупателя зарезервированы. Покупка ожидает подтверждения от разработчика.
Финальные статусы:
CONSUMED
— платеж за потребляемый товар успешно совершен.CONFIRMED
— платеж за непотребляемый товар успешно совершен.CANCELLED
— покупка отменена, оплата не была произведена.EXPIRED
— истекло время на оплату покупки.REJECTED
— покупка отклонена (например, ввиду недостатка средств).REVERSED
— покупка была отменена, т. к. не было произведено подтверждение в течение 72 часов (только для потребляемых товаров).REFUNDED
— запрос на возврат средств за покупку совершён успешно.
Подробнее о переходах между статусами см. в статусной модели покупки.
-
developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. -
subscriptionToken
— токен для валидации покупки на сервере.
getPurchase
.
PurchaseInteractor purchaseInteractor = RuStorePayClient.Companion.getInstance().getPurchaseInteractor();
purchaseInteractor.getPurchase(new PurchaseId("purchaseId"))
.addOnSuccessListener(purchase -> {
// Process success
})
.addOnFailureListener(throwable -> {
// Process error
});
Метод возвращает информацию о конкретной покупке в любом статусе. Ниже представлена модель покупки:
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
— состояние покупки.Промежуточные статусы:
INVOICE_CREATED
— создан счёт на оплату, покупка ожидает оплаты.PROCESSING
— запущена оплата.PAID
— только покупки потребляемого товара — промежуточный статус, средства на счёте покупателя зарезервированы. Покупка ожидает подтверждения от разработчика.
Финальные статусы:
CONSUMED
— платеж за потребляемый товар успешно совершен.CONFIRMED
— платеж за непотребляемый товар успешно совершен.CANCELLED
— покупка отменена, оплата не была произведена.EXPIRED
— истекло время на оплату покупки.REJECTED
— покупка отклонена (например, ввиду недостатка средств).REVERSED
— покупка была отменена, т. к. не было произведено подтверждение в течение 72 часов (только для потребляемых товаров).REFUNDED
— запрос на возврат средств за покупку совершён успешно.
Подробнее о переходах между статусами см. в статусной модели покупки.
-
developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. -
subscriptionToken
— токен для валидации покупки на сервере.
Статусная модель покупки (purchaseState)
Статусная модель покупки потребляемых продуктов (CONSUMABLES
)
Статусная модель покупки непотребляемых продуктов (NON-CONSUMABLES
)
Покупка продукта
- Kotlin
- Java
Для вызова покупки продукта используйте метод purchase
.
RuStorePayClient.getProductInteractor().purchase(
ProductPurchaseParams(
productId = ProductId("productId"),
orderId = null,
quantity = null,
developerPayload = null,
)
).addOnSuccessListener { paymentResult: PaymentResult ->
when (paymentResult) {
// Process PaymentResult
}
}.addOnFailureListener { throwable: Throwable ->
// Process error
}
public class ProductPurchaseParams(
public val productId: ProductId,
public val quantity: Quantity? = null,
public val orderId: OrderId? = null,
public val developerPayload: DeveloperPayload? = null,
)
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).quantity
— количество продукта (необязательный параметр — если не указывать, будет подставлено значение1
).orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. Максимальная длина 250 символов.
public sealed interface ProductPurchaseResult {
public class SuccessProductPurchaseResult(
public val orderId: OrderId?,
public val purchaseId: PurchaseId,
public val productId: ProductId,
public val invoiceId: InvoiceId,
public val subscriptionToken: SubscriptionToken?,
) : ProductPurchaseResult
public class CancelProductPurchaseResult(
public val purchaseId: PurchaseId?,
) : ProductPurchaseResult
public class FailureProductPurchaseResult(
public val orderId: OrderId?,
public val purchaseId: PurchaseId?,
public val productId: ProductId?,
public val invoiceId: InvoiceId?,
public val quantity: Quantity?,
public val subscriptionToken: SubscriptionToken?,
public val cause: Throwable,
) : ProductPurchaseResult
}
SuccessProductPurchaseResult
— результат успешного завершения покупки цифрового товара.FailureProductPurchaseResult
— результат ошибки покупки цифрового товара.CancelProductPurchaseResult
— платёжный диалог закрыт до получения результата покупки. Состояние покупки неизвестно. Рекомендуем запросить статус покупки отдельно метод ом получения информации о покупке.
Для вызова покупки продукта используйте метод purchase
.
ProductInteractor productInteractor = RuStorePayClient.Companion.getInstance().getProductInteractor();
ProductPurchaseParams params = new ProductPurchaseParams(new ProductId("productId"), null, null, null);
productInteractor.purchase(params)
.addOnSuccessListener(result -> {
// Process PaymentResult
})
.addOnFailureListener(error -> {
// Process error
});
public class ProductPurchaseParams {
private final ProductId productId;
private final Quantity quantity;
private final OrderId orderId;
private final DeveloperPayload developerPayload;
public ProductPurchaseParams(ProductId productId, @Nullable Quantity quantity, @Nullable OrderId orderId, @Nullable DeveloperPayload developerPayload) {
this.productId = productId;
this.quantity = quantity;
this.orderId = orderId;
this.developerPayload = developerPayload;
}
public ProductId getProductId() {
return productId;
}
public @Nullable Quantity getQuantity() {
return quantity;
}
public @Nullable OrderId getOrderId() {
return orderId;
}
public @Nullable DeveloperPayload getDeveloperPayload() {
return developerPayload;
}
}
productId
— идентификатор продукта, который был присвоен продукту в RuStore Консоли (обязательный параметр).quantity
— количество продукта (необязательный параметр — если не указывать, будет подставлено значение1
).orderId
— уникальный идентификатор оплаты, сформированный приложением (опциональный параметр). Если вы укажете этот параметр в вашей системе, вы получите его в ответе при работе с API. Если не укажете, он будет сгенерирован автоматически (uuid). Максимальная длина 150 символов.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. Максимальная длина 250 символов.
public interface ProductPurchaseResult {
public static class SuccessProductPurchaseResult implements ProductPurchaseResult {
public final OrderId orderId;
public final PurchaseId purchaseId;
public final ProductId productId;
public final InvoiceId invoiceId;
public final SubscriptionToken subscriptionToken;
public SuccessProductPurchaseResult(OrderId orderId, PurchaseId purchaseId, ProductId productId, InvoiceId invoiceId, SubscriptionToken subscriptionToken) {
this.orderId = orderId;
this.purchaseId = purchaseId;
this.productId = productId;
this.invoiceId = invoiceId;
this.subscriptionToken = subscriptionToken;
}
}
public static class CancelProductPurchaseResult implements ProductPurchaseResult {
public final @Nullable PurchaseId purchaseId;
public CancelProductPurchaseResult(@Nullable PurchaseId purchaseId) {
this.purchaseId = purchaseId;
}
}
public static class FailureProductPurchaseResult implements ProductPurchaseResult {
public final @Nullable OrderId orderId;
public final @Nullable PurchaseId purchaseId;
public final @Nullable ProductId productId;
public final @Nullable InvoiceId invoiceId;
public final @Nullable Quantity quantity;
public final @Nullable SubscriptionToken subscriptionToken;
public final Throwable cause;
public FailureProductPurchaseResult(@Nullable OrderId orderId, @Nullable PurchaseId purchaseId, @Nullable ProductId productId, @Nullable InvoiceId invoiceId, @Nullable Quantity quantity, @Nullable SubscriptionToken subscriptionToken, Throwable cause) {
this.orderId = orderId;
this.purchaseId = purchaseId;
this.productId = productId;
this.invoiceId = invoiceId;
this.quantity = quantity;
this.subscriptionToken = subscriptionToken;
this.cause = cause;
}
}
}
SuccessProductPurchaseResult
— результат успешного завершения покупки цифрового товара.FailureProductPurchaseResult
— результат ошибки покупки цифрового товара.CancelProductPurchaseResult
— платёжный диалог закрыт до получения результата покупки. Состояние покупки неизвестно. Рекомендуем запросить статус покупки отдельно методом получения информации о покупке.
Серверная валидация покупки
- Kotlin
- Java
Если вам необходимо произвести валидацию покупки на сервере RuStore, вы можете использовать subscriptionToken
из модели ProductPurchaseResult.SuccessProductPurchaseResult
, возвращаемой при успешной покупке продукта.
Есть также методы для валидации платежей по их InvoiceId
.
RuStorePayClient.getProductInteractor().purchase(ProductId("productId"))
.addOnSuccessListener { result ->
if (result is ProductPurchaseResult.SuccessProductPurchaseResult) {
val subscriptionToken = result.subscriptionToken
yourApi.validate(subscriptionToken)
}
}
Также можно получить subscriptionToken
в сущности Purchase
. Сущность Purchase
можно получить используя метод getPurchases
.
RuStorePayClient.getPurchaseInteractor().getPurchases()
.addOnSuccessListener { purchases ->
purchases.forEach { purchase ->
yourApi.validate(purchase.subscriptionToken)
}
}
Если вам необходимо произвести валидацию покупки на сервере RuStore, вы можете использовать subscriptionToken
из модели ProductPurchaseResult.SuccessProductPurchaseResult
, возвращаемой при успешной покупке продукта.
Есть также методы для валидации платежей по их InvoiceId
.
ProductInteractor productInteractor = RuStorePayClient.Companion.getInstance().getProductInteractor();
ProductPurchaseParams params = new ProductPurchaseParams(new ProductId("productId"), null, null, null);
productInteractor.purchase(params)
.addOnSuccessListener(result -> {
if (result instanceof ProductPurchaseResult.SuccessProductPurchaseResult) {
ProductPurchaseResult.SuccessProductPurchaseResult successResult = (ProductPurchaseResult.SuccessProductPurchaseResult) result;
String subscriptionToken = successResult.getSubscriptionToken().getValue();
yourApi.validate(subscriptionToken);
}
});
Также можно получить subscriptionToken
в сущности Purchase
. Сущность Purchase
можно получить используя метод getPurchases
.
PurchaseInteractor purchaseInteractor = RuStorePayClient.Companion.getInstance().getPurchaseInteractor();
purchaseInteractor.getPurchases()
.addOnSuccessListener(purchases -> {
for (Purchase purchase : purchases) {
yourApi.validate(purchase.getSubscriptionToken().getValue());
}
})
.addOnFailureListener(error -> {
// Process error
});
Потребление (подтверждение) покупки
RuStore содержит продукты следующих типов:
CONSUMABLE
(потребляемый) — можно купить много раз, например кристаллы в приложении.NON_CONSUMABLE
(непотребляемый) — можно купить один раз, например отключение рекламы в приложении.
Подтверждения требуют только продукты типа CONSUMABLE
, если они находятся в состоянии PurchaseState.PAID
.
- Kotlin
- Java
Для потребления покупки используйте метод consumePurchase
:
RuStorePayClient.getPurchaseInteractor().consumePurchase(
purchaseId = PurchaseId("purchaseId"),
developerPayload = null,
)
.addOnSuccessListener {
// Process success
}.addOnFailureListener { throwable: Throwable ->
// Process error
}
purchaseId
— идентификатор покупки.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. Максимум 250 символов. Если передан, заменяет значение, записанное при старте покупки методомpurchase
.
Для потребления покупки используйте метод consumePurchase
:
PurchaseInteractor purchaseInteractor = RuStorePayClient.Companion.getInstance().getPurchaseInteractor();
purchaseInteractor.consumePurchase(
new PurchaseId("purchaseId"),
null
).addOnSuccessListener(aVoid -> {
// Process success
}).addOnFailureListener(throwable -> {
// Process error
});
purchaseId
— идентификатор покупки.developerPayload
— строка с дополнительной информацией о заказе, которую вы можете установить при инициализации процесса покупки. Максимум 250 символов. Если передан, заменяет значение, записанное при старте покупки методомpurchase
.
Обработка незавершённых платежей
Обработка незавершённых платежей производится разработчиком.
Чтобы подтвердить покупку типа CONSUMABLE
и в статусе PAID
вызовите метод потребления (подтверждения) покупки (см. Получение сведений о покупке).
Обработка ошибок
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, от которой наследуются остальные ошибки.