Покупки в мобильном приложении в React Native SDK
Отображение пейволов в мобильном приложении — важный шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако просто показать пейвол достаточно для проведения покупок только в том случае, если вы используете Paywall Builder для его настройки.
Если вы не используете Paywall Builder, для завершения покупки и разблокировки нужного контента необходимо вызвать отдельный метод .makePurchase(). Этот метод является точкой входа, через которую пользователь взаимодействует с пейволом и совершает транзакцию.
Если для продукта, который пользователь хочет купить, настроен активный promotional offer, Adapty применит его автоматически в момент покупки.
Обратите внимание: introductory offer применяется автоматически только при использовании пейволов, созданных в Paywall Builder.
В остальных случаях необходимо проверить право пользователя на introductory offer в iOS. Если пропустить этот шаг, приложение может быть отклонено при публикации. Кроме того, пользователи, имеющие право на introductory offer, могут быть списана полная стоимость.
Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.
Совершить покупку
Используете Paywall Builder? Покупки обрабатываются автоматически — этот шаг можно пропустить.
Нужна пошаговая инструкция? Ознакомьтесь с quickstart-гайдом — там описана полная реализация с учётом всего контекста.
try {
const purchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
}
break;
case 'user_cancelled':
// Handle the case where the user canceled the purchase
break;
case 'pending':
// Handle deferred purchases (e.g., the user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
Параметры запроса:
| Параметр | Обязательность | Описание |
|---|---|---|
| Product | обязательный | Объект AdaptyPaywallProduct, полученный из пейвола. |
Параметры ответа:
| Параметр | Описание |
|---|---|
| Profile | При успешном запросе ответ содержит этот объект. Объект AdaptyProfile содержит подробную информацию об уровнях доступа пользователя, его подписках и разовых покупках внутри приложения. Проверьте статус уровня доступа, чтобы убедиться, что пользователь имеет необходимый доступ к приложению. |
Примечание: если вы всё ещё используете StoreKit версии ниже 2.0 и Adapty SDK версии ниже 2.9.0, вместо этого нужно указать общий секрет Apple App Store. Этот метод в настоящее время устарел по решению Apple.
Смена подписки при покупке
Когда пользователь выбирает новую подписку вместо продления текущей, поведение зависит от стора:
- В App Store подписка обновляется автоматически внутри группы подписок. Если пользователь покупает подписку из одной группы, уже имея подписку из другой, обе будут активны одновременно.
- В Google Play подписка не обновляется автоматически. Переключение нужно реализовать в коде мобильного приложения, как описано ниже.
Чтобы заменить подписку на другую в Android, вызовите метод .makePurchase() с дополнительным параметром:
try {
const purchaseResult = await adapty.makePurchase(product, params);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
}
break;
case 'user_cancelled':
// Handle the case where the user canceled the purchase
break;
case 'pending':
// Handle deferred purchases (e.g., the user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
Дополнительный параметр запроса:
| Параметр | Обязательность | Описание |
|---|---|---|
| params | обязательный | объект типа MakePurchaseParamsInput. |
Версия 3.8.2+: структура MakePurchaseParamsInput обновлена. oldSubVendorProductId и prorationMode теперь вложены в subscriptionUpdateParams, а isOfferPersonalized перемещён на верхний уровень.
Пример:
makePurchase(product, {
android: {
subscriptionUpdateParams: {
oldSubVendorProductId: 'old_product_id',
prorationMode: 'charge_prorated_price'
},
isOfferPersonalized: true
}
}); Подробнее о подписках и режимах замены можно прочитать в документации Google для разработчиков:
- О режимах замены
- Рекомендации Google по режимам замены
- Режим замены
CHARGE_PRORATED_PRICE. Примечание: этот метод доступен только при повышении уровня подписки. Понижение не поддерживается. - Режим замены
DEFERRED. Примечание: фактическая смена подписки произойдёт только по окончании текущего расчётного периода.
Активация промокодов в iOS
Об офферных кодах
Офферные коды позволяют предоставлять скидки или бесплатные пробные периоды конкретным пользователям. В отличие от обычных офферов, которые применяются автоматически, офферные коды распространяются за пределами приложения — через email-рассылки, социальные сети или печатные материалы. Пользователи активируют их, вводя код в App Store, переходя по ссылке для активации или через диалог внутри приложения.
Чтобы настроить офферные коды, откройте подписку в App Store Connect и перейдите в раздел Offer Codes. Вы можете создать три вида офферных кодов:
- Free — подписка бесплатна на заданный период, следующее продление — по полной цене.
- Pay as you go — пользователь платит сниженную цену в каждом расчётном периоде на протяжении заданного срока, после чего подписка продлевается по полной цене.
- Pay up front — пользователь единовременно платит сниженную цену за весь срок оффера, после чего подписка продлевается по полной цене.
Добавлять офферные коды в Adapty не нужно. Apple помечает каждую транзакцию в период действия оффера категорией офферного кода. Это касается как первоначальной активации, так и всех последующих продлений со скидкой. Adapty обнаруживает метку и записывает каждую транзакцию с категорией оффера offer_code. Как только период оффера заканчивается и подписка продлевается по полной цене, метка исчезает. Вы можете фильтровать аналитику по типу оффера Offer Code в дашборде Adapty.
Устранение расхождений в выручке
Если транзакция по офферному коду отображается в Adapty по полной цене продукта вместо сниженной цены оффера, проверьте следующее в App Store Connect:
- Для офферного кода настроены корректные цены для всех регионов, где пользователи могут его активировать.
- Цена оффера задана для конкретной страны или региона пользователя. Apple передаёт региональную цену в транзакции. Если для оффера не настроена региональная цена, Apple может передать полную цену продукта.
Вы можете фильтровать и проверять транзакции по офферным кодам в дашборде Adapty по фильтрам типа оффера Offer Code и Offer Discount Type.
Устаревшие промокоды (deprecated)
Apple прекратила поддержку промокодов для встроенных покупок в марте 2026 года. Офферные коды заменяют их с расширенными возможностями: настраиваемые условия применения, сроки действия и до 1 миллиона кодов в квартал. Если вы ранее использовали промокоды для встроенных покупок, перейдите на офферные коды в App Store Connect.
Устаревшие промокоды (не более 100 на приложение на версию) предоставляли бесплатный доступ к подписке. В отличие от офферных кодов, Apple не включала информацию о скидке в транзакции по промокодам — в чеке указывалась полная цена продукта. В результате Adapty записывал эти транзакции по полной цене, что приводило к расхождениям в выручке между аналитикой Adapty и App Store Connect.
Если вы видите исторические транзакции по полной цене, которые должны были быть бесплатными, скорее всего, они связаны с устаревшими промокодами. Поскольку эти коды больше не поддерживаются, перейдите на офферные коды для точного учёта выручки.
Чтобы отобразить в приложении форму активации промокода:
adapty.presentCodeRedemptionSheet();
По нашим наблюдениям, форма активации промокода в некоторых приложениях работает нестабильно. Мы рекомендуем перенаправлять пользователя напрямую в App Store.
Для этого откройте URL следующего формата:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
Управление предоплаченными планами (Android)
Если пользователи вашего приложения могут приобретать предоплаченные планы (например, купить невозобновляемую подписку на несколько месяцев), вы можете включить отложенные транзакции для таких планов.
adapty.activate("PUBLIC_SDK_KEY", {
android: { pendingPrepaidPlansEnabled: true }
});