Интеграция внутриигровых покупок для VR приложений
Перед нами часто встаёт задача интеграции внутриигровых покупок (IAP) для VR-приложений. Meta Quest, SteamVR и PCVR предъявляют разные требования к платёжным системам. Приложение для Quest обязано использовать нативный Meta IAP SDK — сторонние процессинги в Meta Store запрещены. Для Steam — Steamworks API. Если проект выходит на обеих платформах, нужна абстракция, переключающая реализацию под рантайм-платформу. Начинать интеграцию IAP без понимания требований целевого стора — гарантированный возврат на ревизию.
Как избежать ошибок при тестировании IAP на Quest?
Meta Platform SDK (com.meta.xr.sdk.platform) предоставляет IAP через IAP.GetProductsBySKU и IAP.LaunchCheckoutFlow. Все SKU заводятся заранее в Meta Developer Console под конкретным App ID. Без этого SDK при вызове LaunchCheckoutFlow будет возвращать ошибку PURCHASE_NOT_ALLOWED даже в тестовом режиме. Тестирование IAP на Quest: в Developer Console нужно добавить тестовых пользователей в раздел Test Users организации. Только они могут совершать тестовые покупки без реального списания средств. Без этой настройки разработчики регулярно упираются в то, что IAP «не работает» — хотя проблема в отсутствии прав тестового аккаунта. Подписки в Meta IAP — отдельный тип продукта (SUBSCRIPTION). У подписок есть trialPeriodDays, billingPeriod, startDate. При проверке активной подписки используем IAP.GetCurrentEntitlements — возвращает все активные entitlements, включая подписки. Важно: entitlement не исчезает сразу при отмене подписки — она активна до конца оплаченного периода. Нужно проверять ExpirationTime, а не просто факт наличия. Восстановление покупок: Meta автоматически восстанавливает non-consumable покупки при входе под тем же аккаунтом через IAP.GetViewerPurchases. Consumable покупки (монеты, расходники) не восстанавливаются — они должны быть списаны через IAP.ConsumePurchase после вручения игроку.
Steamworks и PCVR: серверная верификация обязательна
Для Steam используем Steamworks.NET — C# обёртка над Steamworks API. Микротранзакции через Steam работают через SteamUser.GetSteamID + серверную верификацию через Steam Web API. В отличие от Meta, Steam рекомендует серверную проверку покупок: клиент инициирует покупку → Steam возвращает OrderID → сервер игры верифицирует через ISteamMicroTxn/FinalizeTxn → вручаем предмет. Без серверной верификации покупки можно подделать через memory editing. Для VR-only игр на Steam, где нет выделенного сервера (синглплеер или P2P), верификация ведётся через Steam Inventory Service — Steam сам хранит предметы инвентаря, и читы на клиентской стороне не влияют на Steam Inventory.
Unity IAP как кроссплатформенная абстракция
Unity In-App Purchasing (com.unity.purchasing) поддерживает Meta Store через Meta Appstore IAP и Steam через Steam IAP в одном API. IStoreController.InitiatePurchase(product) одинаково работает на обеих платформах при правильной конфигурации Builder. Unity IAP сокращает время разработки на 30–40% по сравнению с интеграцией двух нативных SDK по отдельности. Проблема Unity IAP на Meta Quest: пакет Unity IAP использует Google Play Billing как основу для Android. Quest — тоже Android-based платформа, и Unity IAP по умолчанию может попытаться использовать Google Play Store вместо Meta Store. Нужно явно задать StandardPurchasingModule.useFakeStoreAlways = false и добавить Meta Store через builder.AddStoreConfiguration. Ограничение: Unity IAP не поддерживает все возможности нативных SDK — например, Meta-специфичные подписки с trialing требуют дополнительного кода вне Unity IAP. Если проект требует нативных фич, Unity IAP используется только как fallback, а Meta SDK — как первичный.
Почему серверная верификация обязательна для pay-to-win VR-игр?
Chargeback и возврат средств в Meta Store — пользователь запрашивает возврат, Meta его одобряет, но entitlement в игре уже активирован. Если игра вручила предмет при покупке и не проверяет entitlement повторно, игрок получил предмет бесплатно. Защита: не вручать дорогие предметы мгновенно на клиенте. Паттерн: LaunchCheckoutFlow → GetViewerPurchases (проверка статуса) → вручение через сервер с записью в БД. При каждом запуске приложения — повторная проверка активных entitlements через GetViewerPurchases и сверка с серверной записью. При несоответствии — блокировка предмета. Для Free-to-Play VR игр с cosmetic покупками серверная верификация часто не критична (украденный скин не ломает экономику), но для игр с pay-to-win элементами или подписками — обязательна.
| Платформа / сложность | Ориентировочные сроки |
|---|---|
| Meta Quest IAP (consumable + non-consumable) | 1–2 недели |
| Steam IAP через Steamworks | 1–2 недели |
| Кроссплатформа Unity IAP + нативные SDK | 2–4 недели |
| Серверная верификация + защита от возвратов | +1–3 недели |
| Метод верификации | Уровень защиты | Сложность реализации |
|---|---|---|
| Клиентская (только SDK) | Низкая | Быстрая |
| Серверная + Steam Inventory | Высокая | Средняя |
| Серверная + Meta Entitlements | Высокая | Высокая |
Что входит в работу
- Настройка Meta IAP SDK с корректными SKU в Developer Console
- Интеграция Steamworks для микротранзакций с серверной верификацией
- Создание кроссплатформенной абстракции через Unity IAP с fallback на нативные SDK
- Тестирование на реальных устройствах с тестовыми аккаунтами
- Документация по IAP-системе и инструкция по обслуживанию
- Поддержка после запуска: мониторинг покупок и решение проблем с возвратами
Мы реализовали IAP для 15+ VR-проектов за 5 лет работы. Оценим ваш проект и предложим оптимальное решение — от простой интеграции до комплексной защиты от фрода. Свяжитесь с нами, чтобы обсудить детали.
Стоимость рассчитывается индивидуально после анализа требований: платформы, типы продуктов, наличие серверной инфраструктуры.






