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

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

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

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

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

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

Используете Paywall Builder? Покупки обрабатываются автоматически — этот шаг можно пропустить.

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


try {
  const result = await adapty.makePurchase({ product });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('User is now subscribed!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

Параметры запроса:

ПараметрОбязательностьОписание
productобязательныйОбъект AdaptyPaywallProduct, полученный с пейвола.

Параметры ответа:

ПараметрОписание
resultОбъект AdaptyPurchaseResult с полем type, указывающим результат покупки ('success', 'user_cancelled' или 'pending'), и полем profile, содержащим обновлённый AdaptyProfile в случае успешной покупки.

Смена подписки при совершении покупки

Когда пользователь выбирает новую подписку вместо продления текущей, поведение зависит от стора:

  • В App Store подписка обновляется автоматически в рамках группы подписок. Если пользователь покупает подписку из одной группы, уже имея подписку из другой, обе подписки будут активны одновременно.
  • В Google Play подписка не обновляется автоматически. Вам нужно самостоятельно управлять переключением в коде мобильного приложения, как описано ниже.

Чтобы заменить подписку на другую в Android, вызовите метод .makePurchase() с дополнительным параметром:


try {
  const result = await adapty.makePurchase({ 
    product,
    params: {
      android: {
        subscriptionUpdateParams: {
          oldSubVendorProductId: 'old_product_id',
          prorationMode: 'charge_prorated_price'
        },
        isOfferPersonalized: true
      }
    }
  });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('Subscription updated successfully!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

Дополнительный параметр запроса:

ПараметрОбязательностьОписание
paramsопциональныйОбъект типа MakePurchaseParamsInput, содержащий платформо-зависимые параметры покупки.

Структура MakePurchaseParamsInput:

{
  android: {
    subscriptionUpdateParams: {
      oldSubVendorProductId: 'old_product_id',
      prorationMode: 'charge_prorated_price'
    },
    isOfferPersonalized: true
  }
}

Подробнее о подписках и режимах замены можно прочитать в документации Google Developer:

Управление предоплаченными планами (Android)

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

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    android: {
        enablePendingPrepaidPlans: true,      
    },
  }
});

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

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

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


try {
  await adapty.presentCodeRedemptionSheet();
} catch (error) {
  console.error('Failed to present code redemption sheet:', error);
}

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

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