Как внедрить встроенные покупки и подписки в приложение
Практика3 минРедакция Innovialabs
Коротко
Заведите продукты в App Store Connect и Play Console, проводите покупки через StoreKit и Google Play Billing, проверяйте их и храните статус доступа на своём сервере, а пробные периоды и восстановление покупок настройте по правилам каждого магазина или через RevenueCat.
Коротко: из чего состоят покупки в приложении
Встроенные покупки (in-app purchases, IAP) — это продажа цифрового контента и функций через платёжную систему магазина. Работающая схема включает:
- Продукты в App Store Connect и Google Play Console.
- Клиентский код на StoreKit (iOS) и Google Play Billing Library (Android).
- Сервер, который проверяет покупки и хранит, у кого какой доступ.
- Уведомления от магазинов о продлениях, отменах и возвратах.
Типы продуктов
| Apple | Google Play | Пример |
|---|---|---|
| Consumable | Одноразовый расходуемый | Монеты, кредиты |
| Non-consumable | Одноразовый нерасходуемый | Отключение рекламы навсегда |
| Auto-renewable subscription | Subscription (base plan + offers) | Премиум на месяц или год |
| Non-renewing subscription | — (реализуется отдельно) | Доступ к сезону курса |
В Google Play подписка состоит из base plan (период и цена) и offers (скидки и пробные периоды). У Apple подписки объединяются в subscription group: пользователь может иметь только одну активную подписку из группы.
iOS: StoreKit
Современный StoreKit 2 работает на async/await и возвращает подписанные транзакции:
let products = try await Product.products(for: ["premium_monthly"])
if let product = products.first {
let result = try await product.purchase()
if case .success(let verification) = result,
case .verified(let transaction) = verification {
// выдайте доступ и сообщите серверу
await transaction.finish()
}
}
- Слушайте
Transaction.updatesс запуска приложения — покупки могут завершиться вне текущей сессии. - Для локальной отладки используйте StoreKit Configuration File в Xcode, затем Sandbox-аккаунты.
Android: Google Play Billing
- Подключите Google Play Billing Library и установите
BillingClient. - Загрузите продукты через
queryProductDetailsAsync, запустите покупку черезlaunchBillingFlow. - Подтвердите покупку (acknowledge) или израсходуйте её (consume). Неподтверждённые покупки Google автоматически возвращает через несколько дней.
- Тестируйте через лицензионных тестировщиков в Play Console.
Серверная проверка
Клиенту доверять нельзя: доступ выдаёт сервер.
- Apple: проверяйте транзакции через App Store Server API и принимайте App Store Server Notifications о продлениях, отменах и возвратах.
- Google: проверяйте токен покупки через Google Play Developer API и подпишитесь на Real-time developer notifications через Cloud Pub/Sub.
- Храните в базе статус подписки, дату окончания и идентификатор оригинальной транзакции, привязанные к аккаунту пользователя.
Пробные периоды
- Apple: introductory offers — бесплатный пробный период, оплата по сниженной цене за каждый период или разовой суммой. Право на introductory offer обычно одно на subscription group.
- Google: пробный период и скидка задаются как offer внутри base plan, с правилами, кто имеет на него право.
- Показывайте на экране оплаты, когда начнётся списание и какая будет цена после пробного периода. Скрытые условия — частая причина отказа на ревью.
Восстановление покупок
- Apple требует кнопку Restore Purchases для нерасходуемых покупок и подписок. В StoreKit 2 для этого есть
AppStore.sync()иTransaction.currentEntitlements. - В Android используйте
queryPurchasesAsyncпри запуске, чтобы подтянуть активные покупки. - Если у вас есть свои аккаунты, привязывайте покупки к ним — тогда доступ сохранится и на новом устройстве.
Когда брать RevenueCat и аналоги
RevenueCat, Adapty, Qonversion берут на себя серверную проверку, вебхуки, единый статус доступа для iOS и Android и аналитику подписок.
- Подходит, если нужно быстро запуститься и нет ресурсов на свой бэкенд для подписок.
- Свой сервер, если важен полный контроль над данными и логикой или уже есть развитый биллинг.
У таких сервисов своя модель оплаты — сравните её с затратами на собственную разработку и поддержку.