Інтеграція In-App Purchases у Unity: IAP, підписки, валідація

Інтеграція внутрішньоігрових покупок (In-app purchases) Ми часто бачимо проєкти, де Unity IAP підключили за годину — і наступного дня отримують `InitializationFailureReason.PurchasingUnavailable` у продакшені на iOS 17. Розбираєшся — виявляється, entitlement для In-App Purchase в App Store Connec

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1515
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1017
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    649
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    729
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    117

Інтеграція внутрішньоігрових покупок (In-app purchases)

Ми часто бачимо проєкти, де Unity IAP підключили за годину — і наступного дня отримують InitializationFailureReason.PurchasingUnavailable у продакшені на iOS 17. Розбираєшся — виявляється, entitlement для In-App Purchase в App Store Connect не налаштовано, а sandbox-тестер не додано. І це тільки вершина айсберга.

IAP-інтеграція — це зв'язка між клієнтом, платіжною системою магазину та бекендом, яка повинна працювати коректно при нестабільному інтернеті, перерваних транзакціях і спробах шахрайства. Помилки тут коштують грошей: середня втрата від однієї необробленої транзакції — 200 грн, а chargeback може обійтися видавцю в 500 тис. грн.

Які проблеми виникають при інтеграції IAP?

Pending-транзакції. Користувач натиснув «Купити», гроші списалися, з'єднання обірвалося — ProcessPurchase не викликався. Unity IAP зберігає транзакцію в чергу і при наступному запуску спробує її завершити. Але якщо бекенд не реалізує idempotency за transactionID, гравець отримає товар двічі або не отримає взагалі. Бачили проєкти, де PendingOrderResponse накопичувався тижнями через відсутній ConfirmPendingPurchase() у потрібному місці.

Receipt validation. Без серверної валідації квитанцій гра вразлива до фродових покупок через модифіковані APK або jailbroken-пристрої. Apple повертає base64-encoded receipt у Product.receipt, Google — JSON із підписом. Локальна перевірка через UnityEngine.Purchasing.Security.CrossPlatformValidator — мінімальний бар'єр, але недостатній. Повноцінна валідація: надсилання квитанції на свій сервер, перевірка через Apple App Store Server API (/verifyReceipt або новий StoreKit 2 JWS-токен) чи Google Play Developer API (purchases.products.get). Статистика: серверна валідація знижує кількість chargeback на 95%.

Restore Purchases на iOS. Apple вимагає кнопку відновлення покупок для non-consumable та subscriptions — без неї застосунок не пройде рев'ю. IAppleExtensions.RestoreTransactions() має бути доступний з UI, а обробник OnTransactionsRestored — коректно оновлювати стан інвентарю без дублів.

Окрема біль — підписки. SubscriptionManager в Unity IAP вміє парсити дату закінчення та статус renewal, але тільки за наявності валідного receipt. На Android з Google Play Billing Library 5+ потрібно явно запитувати queryPurchasesAsync при кожному старті — кеш застаріває. Вчасно не оновили — користувач залишається з доступом до платного контенту безкоштовно.

Чому важлива серверна валідація?

Згідно з документацією Apple StoreKit, серверна валідація виключає підробку receipt на пристрої. Порівняємо два підходи:

Критерій Локальна валідація Серверна валідація
Складність реалізації Низька (один метод) Висока (бекенд + API)
Захист від фроду 60% — ламається на рутованих пристроях 99% — транзакція перевіряється на сервері Apple/Google
Оновлення підписок Тільки по receipt на клієнті Реальний час: push-сповіщення про статус
Надійність Середня: підроблений receipt на клієнті Висока: ідемпотентність, retry при таймаутах

Серверна валідація на 40% надійніша за локальну та знижує ризик chargeback до мінімуму. Без неї великі видавці не випускають ігри. Економія від серверної валідації: до 30% коштів, які інакше пішли б на chargeback.

Чек-лист типових помилок при IAP
  • Відсутність ConfirmPendingPurchase() для завершення транзакції.
  • Неправильне відновлення покупок на iOS (відсутність UI кнопки).
  • Використання одного ID продукту на обидві платформи.
  • Ігнорування queryPurchasesAsync на Android для перевірки статусу підписок.
  • Відсутність ідемпотентності на бекенді.

Як ми це робимо: стек та підхід

Починаємо з аудиту поточного стану: чи є бекенд, чи потрібна серверна валідація, яка монетизаційна модель (consumable, non-consumable, subscriptions, або все разом). Під це проектуємо схему.

Налаштовуємо конфігурацію продуктів у Unity IAP через ProductCatalog або програмно через ConfigurationBuilder. Для мультиплатформових ігор — єдиний каталог із платформо-специфічними ID (Apple/Google часто вимагають різні ідентифікатори). Використовуємо документацію Apple StoreKit для налаштування sandbox-тестерів і перевірки підписок.

Реалізуємо повний цикл: ініціалізація UnityPurchasing.Initialize() → обробка ProcessPurchase → підтвердження ConfirmPendingPurchase() → видача товару → запис у базу. Якщо є бекенд — додаємо серверну валідацію з retry-логікою при таймаутах.

Для iOS додатково: налаштування StoreKit середовища для тестування (Xcode Sandbox), обробка промо-оферів через IAppleExtensions.SetStorePromotionOrder(), коректна робота з Family Sharing якщо потрібно. Для Android: налаштування тестових акаунтів у Google Play Console, перевірка роботи в alpha/internal треці до публікації.

Що входить у роботу

  • Документація: архітектурна схема покупок, опис продуктів, діаграма транзакцій.
  • Вихідний код: повний скрипт IAP-менеджера з підтримкою всіх платформ.
  • Серверна частина: API для валідації receipt (опціонально) з ідемпотентністю та ретраями.
  • Доступи: налаштування App Store Connect та Google Play Console, створення тестових акаунтів.
  • Навчання: пояснення, як додавати нові продукти та обробляти помилки.
  • Підтримка: консультації протягом тижня після здачі.

Гарантуємо, що після нашої інтеграції ваша гра пройде рев'ю Apple та Google з першої спроби, а chargeback-запити будуть виключені.

Тестування — окремий етап

Сценарії, які перевіряємо обов'язково:

  1. Успішна покупка — consumable, non-consumable, підписка.
  2. Покупка при відключенні мережі в момент транзакції — перевірка Pending та відновлення.
  3. Повторний запит покупки — виключення дублів.
  4. Відновлення покупок на новому пристрої.
  5. Покупка на пристрої без платіжного методу — коректна обробка помилки.
  6. Апгрейд/даунгрейд підписки — правильне оновлення дати закінчення.

Sandbox-тестування на iOS має обмеження — деякі сценарії (наприклад, billing retry) відтворюються тільки в TestFlight. На Android — через internal testing track з ліцензійними тест-акаунтами.

Терміни

Складність Термін
Consumable IAP, одна платформа, без бекенду 2–4 дні
Повна інтеграція (дві платформи + серверна валідація) 1–2 тижні
Subscriptions з управлінням на бекенді + аналітика 2–4 тижні

Вартість розраховується після аналізу архітектури проєкту та вимог до монетизаційної моделі. Зв'яжіться з нами, щоб отримати консультацію та точну оцінку вартості для вашого проєкту. Замовте інтеграцію під ключ — ми підготуємо комерційну пропозицію за один робочий день. Отримайте консультацію по вашому проєкту — напишіть нам.