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: пакет використовує 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-специфічні підписки з trial вимагають додаткового коду поза 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 тижні |
Вартість розраховується після аналізу вимог: платформи, типи продуктів, наявність серверної інфраструктури.





