tags: [vr-ar]
Интеграция внутриигровых покупок для VR приложений
Meta Quest Store, SteamVR и PCVR имеют разные требования к IAP. Приложение для Quest должно использовать нативный Meta IAP SDK — сторонние платёжные процессоры в приложениях Meta Store запрещены. Для Steam — Steamworks API. Если приложение выходит на обеих платформах, нужна абстракция, которая переключает реализацию под рантайм-платформу.
Начинать интеграцию IAP без понимания требований целевого стора — гарантированный возврат на ревизию.
Meta Platform SDK: 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 покупки при входе в приложение под тем же Meta-аккаунтом через 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 на 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 — как первичный.
Серверная верификация и защита от возвратов
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 недели |
Стоимость рассчитывается после анализа требований: платформы, типы продуктов, наличие серверной инфраструктуры.





