No description
  • C# 93.5%
  • Shell 4.9%
  • Java 1.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-05-22 13:19:50 +00:00
Build~ Gitlab CI scripts 2026-04-14 19:02:17 +07:00
Editor Gitlab CI scripts 2026-04-14 19:02:17 +07:00
Runtime Version update to 1.0.2 2026-05-22 13:19:50 +00:00
.gitignore Gitlab CI scripts 2026-04-14 19:02:17 +07:00
Editor.meta Initial commit 2026-04-14 15:07:24 +07:00
package.json Version update to 1.0.2 2026-05-22 13:19:50 +00:00
package.json.meta Initial commit 2026-04-14 15:07:24 +07:00
README.md Purchase query, billing flow and etc 2026-04-21 15:34:46 +07:00
README.md.meta Initial commit 2026-04-14 15:07:24 +07:00
Runtime.meta Initial commit 2026-04-14 15:07:24 +07:00

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

  1. Откройте Window → Package Manager в Unity
  2. Нажмите + → Add package from git URL
  3. Введите URL репозитория:
    https://gitlab.com/fgstudio/essentials/xiaomi-getapps-iap-sdk.git
    

Зависимости

Быстрый старт

Инициализация биллинг-клиента

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