Совершение покупок в мобильном приложении в 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:

Активация промокодов в 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;
    }
});