Совершение покупок в мобильном приложении в Unity SDK

Отображение пейволов в мобильном приложении — необходимый шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако сам по себе показ пейвола обеспечивает покупки только тогда, когда Adapty отрисовывает экран — то есть при использовании флоу или пейвола из старого Paywall Builder.

Если вы отрисовываете экран в своём коде, для совершения покупки и открытия нужного контента необходимо использовать отдельный метод .makePurchase(). Он служит точкой входа, через которую пользователи взаимодействуют с пейволами и завершают нужные транзакции.

Если на вашем пейволе активирован promotional offer для продукта, который пользователь хочет купить, Adapty автоматически применит его в момент покупки.

Warning

Имейте в виду, что introductory offer будет применён автоматически только в том случае, если Adapty отображает экран.

В других случаях вам потребуется проверить право пользователя на introductory offer в iOS. Пропуск этого шага может привести к отклонению приложения при релизе. Кроме того, пользователям, которым положен introductory offer, может быть выставлена полная цена.

Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.

Совершение покупки

Note

Adapty отображает ваш экран? Для флоу или пейвола, созданного в Paywall Builder, покупки обрабатываются автоматически — этот шаг можно пропустить.

Нужна пошаговая инструкция? Ознакомьтесь с гайдом по быстрому старту: там подробно описана полная реализация с необходимым контекстом.

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 предоставляет исчерпывающую информацию об уровнях доступа пользователя, подписках и разовых покупках в приложении.

Проверьте статус уровня доступа, чтобы убедиться, что у пользователя есть необходимый доступ к приложению.

Warning

Примечание: если вы используете Apple StoreKit версии ниже 2.0 и Adapty SDK версии ниже v2.9.0, вам необходимо указать общий секрет 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:

Активация промокодов в iOS

Об offer-кодах

Offer-коды позволяют предоставлять скидки или бесплатные пробные периоды конкретным пользователям. В отличие от обычных предложений, которые применяются автоматически, offer-коды распространяются за пределами приложения — через email-рассылки, соцсети или печатные материалы. Пользователи активируют их, вводя код в App Store, переходя по ссылке для активации или через диалог внутри приложения.

Чтобы настроить offer-коды, откройте подписку в App Store Connect и перейдите в раздел Offer Codes. Вы можете создать три вида offer-кодов:

  • Free — подписка бесплатна в течение заданного срока, следующее продление — по полной цене.
  • Pay as you go — пользователь платит сниженную цену за каждый расчётный период в течение заданного срока, затем подписка продлевается по полной цене.
  • Pay up front — пользователь единовременно платит сниженную цену за весь срок предложения, затем подписка продлевается по полной цене.

Добавлять offer-коды в Adapty не нужно. Apple помечает каждую транзакцию в течение периода предложения категорией offer-кода. Это касается как первоначальной активации, так и всех последующих продлений со скидкой. Adapty обнаруживает метку и записывает каждую транзакцию с категорией предложения offer_code. Когда период предложения заканчивается и подписка продлевается по полной цене, метка больше не проставляется. Вы можете фильтровать аналитику по типу предложения Offer Code в дашборде Adapty.

Устранение расхождений в выручке

Если транзакция по offer-коду отображается в Adapty по полной цене продукта вместо сниженной, проверьте следующее в App Store Connect:

  • Для offer-кода настроены корректные цены для всех регионов, где пользователи могут его активировать.
  • Цена предложения задана для конкретной страны или региона пользователя. Apple передаёт региональную цену в транзакции. Если для предложения не указана региональная цена, Apple может передать полную цену продукта.

Вы можете фильтровать и проверять транзакции по offer-кодам в дашборде Adapty с помощью фильтров по типу предложения Offer Code и Offer Discount Type.

Устаревшие промокоды (deprecated)

Warning

Apple отказалась от промокодов для встроенных покупок в марте 2026 года. Offer-коды заменяют их с расширенными возможностями: настраиваемые условия применения, сроки действия и до 1 миллиона кодов в квартал. Если вы ранее использовали промокоды для встроенных покупок, перейдите на offer-коды в App Store Connect.

Устаревшие промокоды (не более 100 на приложение на версию) предоставляли бесплатный доступ к подписке. В отличие от offer-кодов, Apple не включала информацию о скидке в транзакции по промокодам — в чеке передавалась полная цена продукта. В результате Adapty записывал эти транзакции по полной цене, что приводило к расхождениям в выручке между аналитикой Adapty и App Store Connect.

Если вы видите исторические транзакции по полной цене, которые должны были быть бесплатными, скорее всего, они относятся к устаревшим промокодам. Поскольку такие коды теперь устарели, переходите на offer-коды для точного учёта выручки.

Чтобы отобразить экран активации кода в приложении:

Adapty.PresentCodeRedemptionSheet((error) => {
  // handle the error
});
Danger

По нашим наблюдениям, экран активации промокода (Offer Code Redemption sheet) в некоторых приложениях работает нестабильно. Мы рекомендуем перенаправлять пользователя напрямую в App Store.

Для этого нужно открыть URL следующего формата: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

Продвигаемые встроенные покупки из App Store

Info

Ваше приложение получает продвигаемые встроенные покупки начиная с SDK версии 4.1, на iOS 16.4 и выше. Ниже iOS 16.4 коллбэк никогда не срабатывает, и продвигаемые покупки завершаются самостоятельно. Это функция только для iOS: на Android коллбэк не срабатывает никогда.

Когда пользователь инициирует покупку со страницы вашего приложения в App Store, SDK передаёт продукт через OnReceivePromotedPurchase и ждёт. Завершение покупки остаётся за вашим приложением: передайте продукт в Adapty.MakePromotedPurchase. Поскольку вы сами контролируете этот момент, перед началом покупки можно показать собственный экран.

Если рекламируемый продукт содержит предложение по подписке, SDK применит его при покупке автоматически. Предложение считывается из намерения покупки App Store, которое предоставляет эти данные начиная с iOS 18.0. На iOS 16.4–17.x покупка проходит по базовой цене.

IAdaptyEventListener включает обязательный метод OnReceivePromotedPurchase(AdaptyPromotedProduct), который работает в паре с Adapty.MakePromotedPurchase для завершения полученной покупки:

public void OnReceivePromotedPurchase(AdaptyPromotedProduct product) {
    Adapty.MakePromotedPurchase(product, (result, error) => {
        // process the purchase result
    });
}
Warning

OnReceivePromotedPurchase — это и есть покупка. Пустая реализация приведёт к потере покупки, которую пользователь уже инициировал: App Store передаёт продукт вашему приложению, и больше ничто её не завершит.

Управление предоплаченными планами (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;
    }
});