Совершение покупок в мобильном приложении в Unity SDK
Отображение пейволов в мобильном приложении — важный шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако просто показать пейвол достаточно для поддержки покупок только в том случае, если вы используете Paywall Builder для его настройки.
Если вы не используете Paywall Builder, для завершения покупки и открытия нужного контента необходимо вызвать отдельный метод .makePurchase(). Именно он позволяет пользователям взаимодействовать с пейволами и совершать нужные транзакции.
Если для продукта, который пользователь пытается купить, на пейволе активен promotional offer, Adapty автоматически применит его в момент покупки.
Обратите внимание: introductory offer применяется автоматически только при использовании пейволов, настроенных через Paywall Builder.
В остальных случаях вам нужно самостоятельно проверить право пользователя на introductory offer в iOS. Пропуск этого шага может привести к отклонению приложения при публикации, а также к списанию полной стоимости с пользователей, которым положен introductory offer.
Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.
Совершение покупки
Используете Paywall Builder? Покупки обрабатываются автоматически — этот шаг можно пропустить.
Нужны пошаговые инструкции? Смотрите quickstart guide с подробным описанием всей реализации.
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successfull purchase
break;
default:
break;
}
});
}
Параметры запроса:
| Параметр | Обязательность | Описание |
|---|---|---|
| Product | обязательный | Объект AdaptyPaywallProduct, полученный из пейвола. |
Параметры ответа:
| Параметр | Описание |
|---|---|
| Profile | Содержится в ответе при успешном запросе. Объект AdaptyProfile содержит исчерпывающую информацию об уровнях доступа пользователя, подписках и разовых покупках в приложении. Проверьте статус уровня доступа, чтобы убедиться, что пользователь имеет необходимый доступ к приложению. |
Важно: если вы всё ещё используете StoreKit версии ниже v2.0 и Adapty SDK версии ниже v.2.9.0, вместо этого необходимо указать общий секрет Apple App Store. Этот метод в настоящее время устарел согласно политике Apple.
Смена подписки при совершении покупки
Когда пользователь выбирает новую подписку вместо продления текущей, поведение зависит от стора:
- В App Store подписка обновляется автоматически внутри группы подписок. Если пользователь покупает подписку из одной группы, уже имея подписку из другой, обе подписки будут активны одновременно.
- В Google Play подписка не обновляется автоматически. Переключение нужно реализовать в коде мобильного приложения, как описано ниже.
Чтобы заменить подписку на другую в Android, вызовите метод .makePurchase() с дополнительным параметром:
// Create subscription update parameters
var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters(
"old_product_id", // Product ID of the current subscription
AdaptySubscriptionUpdateReplacementMode.WithTimeProration
);
Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => {
if(error != null) {
// Handle the error
return;
}
// successful cross-grade
});
Дополнительный параметр запроса:
| Параметр | Обязательность | Описание |
|---|---|---|
| subscriptionUpdateParams | обязательный | Объект AdaptySubscriptionUpdateParameters. |
Подробнее о подписках и режимах замены можно прочитать в документации Google Developer:
- О режимах замены
- Рекомендации 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((error) => {
// handle the error
});
По нашим наблюдениям, экран активации промокода (Offer Code Redemption sheet) в некоторых приложениях работает нестабильно. Мы рекомендуем перенаправлять пользователя напрямую в App Store.
Для этого нужно открыть URL следующего формата:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
Управление предоплаченными планами (Android)
Если пользователи вашего приложения могут приобретать предоплаченные планы (например, покупать неавтопродлеваемую подписку на несколько месяцев), вы можете включить отложенные транзакции для таких планов.
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetGoogleEnablePendingPrepaidPlans(true);
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});