- C# 93.5%
- Shell 4.9%
- Java 1.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| Build~ | ||
| Editor | ||
| Runtime | ||
| .gitignore | ||
| Editor.meta | ||
| package.json | ||
| package.json.meta | ||
| README.md | ||
| README.md.meta | ||
| Runtime.meta | ||
Xiaomi GetApps IAP SDK
UPM-пакет для интеграции Xiaomi GetApps IAP SDK в Unity-проекты.
Описание
games.funzen.getappsiap — это Unity Package Manager (UPM) пакет, предоставляющий API для интеграции Xiaomi GetApps Billing SDK в Unity-проекты. Пакет работает на платформе Android и требует Unity 2022.3 или выше.
Чеклист разработки
- UPM package
- База библиотеки
- Интеграция с EDM4U
- Создание клиента
- Подключение клиента к сервисам
- Получение списка доступных покупок
- Запуск флоу покупок
- Консумация покупок
- Расширение поддерживаемых версий Unity
Требования
- Unity 2022.3 или выше
- Модуль Android Build Support
- EDM4U(опционально)
- Минимальная версия Android API: 21 (Lollipop)
Возможности
- Интеграция с Xiaomi GetApps Billing API через JNI
- Поддержка одноразовых покупок (consumables)
- Асинхронное управление подключением к биллинг-сервису
- Обработка обновлений покупок через callback-делегаты
- Поддержка подтверждения (acknowledgement) и потребления (consume) покупок
- Прокси-классы для работы с Java-объектами Android
Установка
Package Manager
- Откройте Window → Package Manager в Unity
- Нажмите + → Add package from git URL
- Введите URL репозитория:
https://gitlab.com/fgstudio/essentials/xiaomi-getapps-iap-sdk.git
Зависимости
- com.xiaomi.billingclient:billing:1.1.9 — Android Xiaomi GetApps IAP SDK
- com.unity.modules.androidjni — нативный Android JNI модуль Unity
Быстрый старт
Инициализация биллинг-клиента
using Funzen.GetAppsIAP;
public class GameManager : MonoBehaviour
{
private BillingClient _billingClient;
void Start()
{
_billingClient = BillingClient.CreateBuilder()
.SetPurchasesUpdatedListener(OnPurchasesUpdated)
.Build();
_billingClient.StartConnection(
onDisconnected: OnBillingServiceDisconnected,
onSetupFinished: OnBillingSetupFinished
);
}
private void OnBillingServiceDisconnected()
{
Debug.Log("Billing service disconnected");
// Повторная попытка подключения
}
private void OnBillingSetupFinished(IBillingResult billingResult)
{
if (billingResult.ResponseCode == 0) // OK
{
Debug.Log("Billing service connected");
}
else
{
Debug.LogError($"Billing setup failed: {billingResult.DebugMessage}");
}
}
private void OnPurchasesUpdated(IBillingResult billingResult, IReadOnlyList<IPurchase> purchases)
{
foreach (var purchase in purchases)
{
Debug.Log($"Purchase: {purchase.PackageName}, State: {purchase.PurchaseState}");
if (purchase.PurchaseState == PurchaseState.PURCHASED)
{
// Обработайте покупку
}
}
}
private void PurchaseProduct(ISkuDetails skuDetails)
{
var flowParams = BillingFlowParams.CreateBuilder()
.SetSkuDetails(skuDetails)
.Build();
_billingClient.LaunchBillingFlow(flowParams);
}
private void QueryPurchases()
{
_billingClient.QueryPurchases(SkuType.InApp);
}
}
API Reference
BillingClient
Основной класс для работы с биллинг-системой Xiaomi GetApps.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
IsReady |
bool |
Готов ли клиент к совершению покупок |
IsSupportSubscription |
bool |
Поддерживаются ли подписки |
Методы
| Метод | Описание |
|---|---|
CreateBuilder() |
Создать Builder для конфигурации клиента |
StartConnection(onDisconnected, onSetupFinished) |
Установить соединение с биллинг-сервисом |
QuerySkuDetails(params, onResponse) |
Запросить детали SKU |
LaunchBillingFlow(params) |
Запустить флоу покупки |
AcknowledgePurchase(purchaseToken, onResponse) |
Подтвердить покупку |
Consume(purchaseToken, onResponse) |
Потребить покупку |
QueryPurchasesAsync(skuType, onResponse) |
Запросить список покупок |
IPurchase
Интерфейс, представляющий данные о покупке.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
PackageName |
string |
Имя пакета ( SKU ) |
OrderId |
string |
ID заказа |
PurchaseToken |
string |
Токен покупки |
PurchaseState |
PurchaseState |
Состояние покупки |
IsAcknowledged |
bool |
Подтверждена ли покупка |
PurchaseTime |
DateTime |
Время покупки |
Quantity |
int |
Количество единиц |
Skus |
IReadOnlyList<string> |
Список SKU |
Signature |
string |
Подпись покупки |
ObfuscatedAccountId |
string |
Обфусцированный ID аккаунта |
ObfuscatedProfileId |
string |
Обфусцированный ID профиля |
DeveloperPayload |
string |
Данные разработчика |
IBillingResult
Интерфейс для получения результата биллинг-операции.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
ResponseCode |
int |
Код ответа (0 = OK) |
DebugMessage |
string |
Отладочное сообщение |
Делегаты
| Тип делегата | Описание |
|---|---|
BillingClientDisconnected |
Вызывается при разрыве соединения с биллинг-сервисом |
BillingSetupFinished(IBillingResult) |
Вызывается после завершения инициализации |
PurchasesUpdated(IBillingResult, IReadOnlyList<IPurchase>) |
Вызывается при обновлении списка покупок |
OnPurchasesResponse(IBillingResult, IReadOnlyList<IPurchase>) |
Вызывается при ответе на запрос покупок |
OnSkuDetailsResponse(IBillingResult, IReadOnlyList<ISkuDetails>) |
Вызывается при ответе на запрос SKU |
OnAcknowledgePurchaseResponse(IBillingResult) |
Вызывается при подтверждении покупки |
OnConsumeResponse(IBillingResult) |
Вызывается при потреблении покупки |
Перечисления
SkuType
Тип продукта (одноразовая покупка или подписка).
public readonly struct SkuType
{
public static SkuType InApp { get; } = new("inapp"); // Одноразовая покупка
public static SkuType Subscription { get; } = new("subs"); // Подписка
public static SkuType All { get; } = new("all"); // Все типы
public string Value { get; }
}
PurchaseState
Состояние покупки.
public enum PurchaseState : byte
{
Unspecified = 0, // Неизвестное состояние
Purchased = 1, // Оплачено
Pending = 2 // Ожидание оплаты
}
ReplacementMode
Режим замены подписки при апгрейде/даунгрейде.
public enum ReplacementMode : byte
{
ImmediateWithTimeProration = 1, // Немедленно с пропорциональным расчётом
ImmediateAndChargeProratedPrice = 2, // Немедленно с оплатой пропорциональной цены
ImmediateWithoutProration = 3, // Немедленно без пропорционального расчёта
ImmediateAndChargeFullPrice = 4, // Немедленно с оплатой полной цены
Deferred = 6 // Отложенная замена
}
RecurrenceMode
Режим повторения подписки.
public enum RecurrenceMode : byte
{
InfiniteRecurring = 1, // Повторяется бесконечно до отмены
FiniteRecurring = 2, // Повторяется фиксированное количество периодов
NonRecurring = 3 // Разовая покупка, не повторяется
}
BillingResponseCode
Коды ответов биллинг-сервиса.
public enum BillingResponseCode
{
NetNotWork = -4, // Нет подключения к сети
ServiceTimeout = -3, // Таймаут сервиса
FeatureNotSupported = -2, // Функция не поддерживается
ServiceDisconnected = -1, // Сервис отключён
Ok = 0, // Успешно
UserCanceled = 1, // Пользователь отменил
ServiceUnavailable = 2, // Сервис недоступен
BillingUnavailable = 3, // Биллинг недоступен
ItemUnavailable = 4, // Товар недоступен
DeveloperError = 5, // Ошибка разработчика
Error = 6, // Общая ошибка
ItemAlreadyOwned = 7, // Товар уже принадлежит пользователю
ItemNotOwned = 8, // Товар не принадлежит пользователю
PaymentUnknown = 9, // Неизвестная ошибка платежа
PaymentShowDialog = 10 // Показан диалог платежа
}
Делегаты
| Делегат | Сигнатура | Описание |
|---|---|---|
OnBillingClientDisconnected |
void OnBillingClientDisconnected() |
Вызывается при разрыве соединения с биллинг-сервисом |
OnBillingSetupFinished |
void OnBillingSetupFinished(IBillingResult) |
Вызывается после завершения инициализации |
OnPurchasesUpdated |
void OnPurchasesUpdated(IBillingResult, IReadOnlyList<IPurchase>) |
Вызывается при обновлении списка покупок |
OnPurchasesResponse |
void OnPurchasesResponse(IBillingResult, IReadOnlyList<IPurchase>) |
Вызывается при ответе на запрос покупок |
OnSkuDetailsResponse |
void OnSkuDetailsResponse(IBillingResult, IReadOnlyList<ISkuDetails>) |
Вызывается при ответе на запрос SKU |
OnAcknowledgePurchaseResponse |
void OnAcknowledgePurchaseResponse(IBillingResult) |
Вызывается при подтверждении покупки |
OnConsumeResponse |
void OnConsumeResponse(IBillingResult, string purchaseToken) |
Вызывается при потреблении покупки |
Интерфейсы
ISkuDetails
Интерфейс для данных о продукте.
| Свойство | Тип | Описание |
|---|---|---|
Sku |
string |
SKU ID продукта |
Title |
string |
Название продукта |
Type |
SkuType |
Тип продукта (inapp/subs) |
IconUrl |
string |
URL иконки |
PriceCurrencyCode |
string |
Валюта цены (например, USD) |
PriceAmountMicros |
string |
Цена в микродалларах |
OriginalPriceAmountMicros |
string |
Оригинальная цена в микродалларах |
Price |
string |
Форматированная цена |
OriginalPrice |
string |
Оригинальная форматированная цена |
PriceRegion |
string |
Регион цены |
Description |
string |
Описание продукта |
OneTimePurchaseOfferDetails |
IOneTimePurchaseOfferDetails |
Детали одноразовой акции |
SubscriptionOfferDetails |
IReadOnlyList<ISubscriptionOfferDetails> |
Детали предложений подписки |
IPurchase
Интерфейс для данных о покупке.
| Свойство | Тип | Описание |
|---|---|---|
PackageName |
string |
Имя пакета (SKU) |
OrderId |
string |
ID заказа |
PurchaseToken |
string |
Токен покупки |
PurchaseState |
PurchaseState |
Состояние покупки |
IsAcknowledged |
bool |
Подтверждена ли покупка |
PurchaseTime |
DateTime |
Время покупки |
Quantity |
int |
Количество единиц |
Skus |
IReadOnlyList<string> |
Список SKU |
Signature |
string |
Подпись покупки |
ObfuscatedAccountId |
string |
Обфусцированный ID аккаунта |
ObfuscatedProfileId |
string |
Обфусцированный ID профиля |
DeveloperPayload |
string |
Данные разработчика |
IsAutoRenewing |
bool |
Автоматически ли продлевается подписка |
IBillingResult
Интерфейс для результата биллинг-операции.
| Свойство | Тип | Описание |
|---|---|---|
ResponseCode |
BillingResponseCode |
Код ответа |
DebugMessage |
string |
Отладочное сообщение |
IPricingPhase
Интерфейс для фазы ценообразования подписки.
| Свойство | Тип | Описание |
|---|---|---|
BillingPeriod |
string |
Период (ISO 8601, например P1M) |
PriceCurrencyCode |
string |
Валюта |
FormattedPrice |
string |
Форматированная цена |
PriceAmountMicros |
long |
Цена в микродалларах |
RecurrenceMode |
RecurrenceMode |
Режим повторения |
BillingCycleCount |
int |
Количество циклов |
IOneTimePurchaseOfferDetails
Интерфейс для деталей акционного предложения.
| Свойство | Тип | Описание |
|---|---|---|
PriceAmountMicros |
long |
Цена в микродалларах |
FormattedPrice |
string |
Форматированная цена |
PriceCurrencyCode |
string |
Валюта |
OfferIdToken |
string |
Токен предложения |
ISubscriptionOfferDetails
Интерфейс для деталей предложения подписки.
| Свойство | Тип | Описание |
|---|---|---|
PricingPhases |
IReadOnlyList<IPricingPhase> |
Фазы ценообразования |
BasePlanId |
string |
ID базового плана |
OfferId |
string |
ID предложения |
OfferToken |
string |
Токен для покупки |
OfferTags |
IReadOnlyList<string> |
Теги предложения |
Классы
SkuDetails
Реализация ISkuDetails для хранения данных о продукте.
| Свойство | Тип | Описание |
|---|---|---|
Sku |
string |
SKU ID |
Title |
string |
Название |
Type |
SkuType |
Тип |
IconUrl |
string |
URL иконки |
PriceCurrencyCode |
string |
Валюта |
PriceAmountMicros |
string |
Цена в микродалларах |
OriginalPriceAmountMicros |
string |
Оригинальная цена |
Price |
string |
Форматированная цена |
OriginalPrice |
string |
Оригинальная цена |
PriceRegion |
string |
Регион |
Description |
string |
Описание |
OneTimePurchaseOfferDetails |
IOneTimePurchaseOfferDetails |
Акция |
SubscriptionOfferDetails |
IReadOnlyList<ISubscriptionOfferDetails> |
Предложения подписки |
Методы:
| Метод | Описание |
|---|---|
From(ISkuDetails) |
Создать копию из другого ISkuDetails |
Purchase
Реализация IPurchase для хранения данных о покупке.
| Свойство | Тип | Описание |
|---|---|---|
PackageName |
string |
Имя пакета |
OrderId |
string |
ID заказа |
PurchaseToken |
string |
Токен покупки |
PurchaseState |
PurchaseState |
Состояние |
IsAcknowledged |
bool |
Подтверждена |
PurchaseTime |
DateTime |
Время |
Quantity |
int |
Количество |
Skus |
IReadOnlyList<string> |
SKU список |
Signature |
string |
Подпись |
ObfuscatedAccountId |
string |
Обфусцированный аккаунт |
ObfuscatedProfileId |
string |
Обфусцированный профиль |
DeveloperPayload |
string |
Данные разработчика |
IsAutoRenewing |
bool |
Автопродление |
Методы:
| Метод | Описание |
|---|---|
From(IPurchase) |
Создать копию из другого IPurchase |
PricingPhase
Реализация IPricingPhase для хранения данных о фазе ценообразования.
| Свойство | Тип | Описание |
|---|---|---|
BillingPeriod |
string |
Период |
PriceCurrencyCode |
string |
Валюта |
FormattedPrice |
string |
Форматированная цена |
PriceAmountMicros |
long |
Цена в микродалларах |
RecurrenceMode |
RecurrenceMode |
Режим повторения |
BillingCycleCount |
int |
Количество циклов |
Методы:
| Метод | Описание |
|---|---|
From(IPricingPhase) |
Создать копию из другого IPricingPhase |
OneTimePurchaseOfferDetails
Реализация IOneTimePurchaseOfferDetails для хранения данных об акции.
| Свойство | Тип | Описание |
|---|---|---|
PriceAmountMicros |
long |
Цена в микродалларах |
FormattedPrice |
string |
Форматированная цена |
PriceCurrencyCode |
string |
Валюта |
OfferIdToken |
string |
Токен предложения |
Методы:
| Метод | Описание |
|---|---|
From(IOneTimePurchaseOfferDetails) |
Создать копию |
SubscriptionOfferDetails
Реализация ISubscriptionOfferDetails для хранения данных о предложении подписки.
| Свойство | Тип | Описание |
|---|---|---|
PricingPhases |
IReadOnlyList<IPricingPhase> |
Фазы |
BasePlanId |
string |
ID базового плана |
OfferId |
string |
ID предложения |
OfferToken |
string |
Токен |
OfferTags |
IReadOnlyList<string> |
Теги |
Методы:
| Метод | Описание |
|---|---|
From(ISubscriptionOfferDetails) |
Создать копию |
SkuDetailsParams
Параметры для запроса деталей SKU.
| Свойство | Тип | Описание |
|---|---|---|
Type |
SkuType |
Тип продукта |
Skus |
IReadOnlyList<string> |
Список SKU |
Методы:
| Метод | Описание |
|---|---|
CreateBuilder() |
Создать Builder |
Builder.SetType(SkuType) |
Установить тип |
Builder.AddSku(string) |
Добавить SKU |
Builder.AddSku(IEnumerable<string>) |
Добавить несколько SKU |
Builder.Build() |
Создать SkuDetailsParams |
BillingFlowParams
Параметры для запуска процесса покупки.
| Свойство | Тип | Описание |
|---|---|---|
SkuDetails |
ISkuDetails |
Детали продукта |
OfferToken |
string |
Токен предложения |
SubscriptionUpdateParams |
SubscriptionUpdateParams |
Параметры обновления подписки |
IsOfferPersonalized |
bool |
Персонализировано ли предложение |
ObfuscatedAccountId |
string |
Обфусцированный ID аккаунта |
ObfuscatedProfileId |
string |
Обфусцированный ID профиля |
WebHookUrl |
string |
Webhook URL |
Методы:
| Метод | Описание |
|---|---|
CreateBuilder() |
Создать Builder |
Builder.SetSkuDetails(ISkuDetails) |
Установить детали продукта |
Builder.SetOfferToken(string) |
Установить токен |
Builder.SetSubscriptionUpdateParams(SubscriptionUpdateParams) |
Установить параметры обновления |
Builder.SetIsOfferPersonalized(bool) |
Установить флаг персонализации |
Builder.SetObfuscatedAccountId(string) |
Установить ID аккаунта |
Builder.SetObfuscatedProfileId(string) |
Установить ID профиля |
Builder.SetWebHookUrl(string) |
Установить Webhook URL |
Builder.Build() |
Создать BillingFlowParams |
SubscriptionUpdateParams
Параметры для обновления подписки (апгрейд/даунгрейд).
| Свойство | Тип | Описание |
|---|---|---|
OldPurchaseToken |
string |
Токен старой покупки |
SubscriptionReplacementMode |
ReplacementMode |
Режим замены |
Методы:
| Метод | Описание |
|---|---|
CreateBuilder() |
Создать Builder |
Builder.SetOldPurchaseToken(string) |
Установить токен старой покупки |
Builder.SetSubscriptionReplacementMode(ReplacementMode) |
Установить режим замены |
Builder.Build() |
Создать SubscriptionUpdateParams |