---
title: "Включение покупок через Flow Builder в Kotlin Multiplatform SDK"
description: "Быстрый старт по настройке встроенных покупок с помощью Adapty Flow Builder."
---

Это руководство использует API Adapty Kotlin Multiplatform SDK v4 (beta). Если вы используете v3, ознакомьтесь с [руководством по миграции](migration-to-kmp-sdk-v4) для получения соответствующих имён методов.

Чтобы подключить встроенные покупки, вам нужно разобраться с тремя ключевыми концепциями:

- [**Products**](product) – всё, что пользователи могут купить (подписки, расходуемые покупки, пожизненный доступ)
- [**Flows**](adapty-flow-builder) – последовательности экранов, которые показывают продукты пользователям и создаются в конструкторе флоу без кода. SDK получает их с помощью `getFlow`. Если вы предпочитаете строить интерфейс в собственном коде, используйте пейвол — см. [Реализация пейволов вручную](kmp-quickstart-manual).
- [**Placements**](placements) – где и когда в приложении показываются флоу (например, `main`, `onboarding`, `settings`). Вы прикрепляете флоу к плейсментам в дашборде, а затем запрашиваете их по ID плейсмента в коде. Это упрощает проведение A/B-тестов и показ разных флоу разным пользователям.

Adapty предлагает три способа подключить покупки в приложении. Выберите один из них в зависимости от требований вашего приложения:

| Реализация | Сложность | Когда использовать |
|---|---|---|
| Adapty Flow Builder | ✅ Просто | Вы [создаёте готовый к покупке флоу в no-code конструкторе](quickstart-paywalls). Adapty автоматически отображает его и берёт на себя весь сложный процесс покупки, валидацию чеков и управление подписками. |
| Пейволы, созданные вручную | 🟡 Средне | Вы реализуете интерфейс пейвола в коде приложения, но всё равно получаете объект флоу от Adapty, сохраняя гибкость в управлении продуктами. См. [гайд](kmp-quickstart-manual). |
| Observer mode | 🔴 Сложно | У вас уже есть собственная инфраструктура обработки покупок, и вы хотите продолжать её использовать. Обратите внимание, что observer mode имеет ограничения в Adapty. См. [статью](observer-vs-full-mode). |

:::important
**Шаги ниже показывают, как реализовать флоу, созданный в Adapty Flow Builder.**

Если вы предпочитаете создавать UI пейвола самостоятельно, смотрите [Реализация пейволов вручную](kmp-quickstart-manual).
:::

Чтобы отобразить флоу, созданный в Adapty Flow Builder, в коде приложения нужно сделать следующее:

1. **Получить флоу**: Получите его из Adapty.
2. **Отобразить его — Adapty сам обработает покупки**: Покажите view в вашем приложении.
3. **Обработать действия кнопок**: Свяжите действия пользователя с реакцией приложения на них. Например, открывайте ссылки или закрывайте флоу при нажатии кнопок.

## Прежде чем начать \{#before-you-start\}

Прежде чем начать, выполните следующие шаги:

1. Подключите ваше приложение к [App Store](initial_ios) и/или [Google Play](initial-android) в дашборде Adapty.
2. [Создайте продукты](create-product) в Adapty.
3. [Создайте флоу и добавьте в него продукты](create-paywall).
4. [Создайте плейсмент и добавьте в него флоу](create-placement).
5. [Установите и активируйте SDK](sdk-installation-kotlin-multiplatform) в коде вашего приложения.

:::tip
Самый быстрый способ выполнить эти шаги — следовать [руководству по быстрому старту](quickstart) или создавать флоу и плейсменты с помощью [Developer CLI](developer-cli-quickstart).
:::

## 1. Получение флоу \{#1-get-the-flow\}

Флоу привязаны к плейсментам, настроенным в дашборде. Плейсменты позволяют показывать разные флоу разным аудиториям или запускать [A/B-тесты](ab-tests).

Чтобы получить флоу, созданный в Adapty Flow Builder, нужно:

1. Получить объект `flow` по ID [плейсмента](placements) с помощью метода `getFlow`.

2. Создать представление флоу с помощью метода `createFlowView`. Представление содержит UI-элементы и стили, необходимые для отображения флоу. Если у флоу нет настроенного представления, `createFlowView` возвращает ошибку — обработайте её в `onError`.

:::important
Чтобы получить отображение, необходимо включить переключатель **Show on device** во Flow Builder. В противном случае `createFlowView` вернёт ошибку, и флоу не отобразится.
:::

```kotlin showLineNumbers
Adapty.getFlow("YOUR_PLACEMENT_ID")
    .onSuccess { flow ->
        AdaptyUI.createFlowView(flow)
            .onSuccess { view ->
                view.present()
            }
            .onError { error ->
                // the flow has no view configured, or view creation failed
            }
    }
    .onError { error ->
        // handle the error
    }
```

## 2. Отобразите флоу \{#2-display-the-flow\}

Теперь, когда у вас есть флоу, достаточно добавить несколько строк, чтобы отобразить его.

Чтобы показать визуальный флоу на экране устройства, нужно сначала создать представление. Для этого вызовите метод `AdaptyUI.createFlowView()`:

```kotlin showLineNumbers
AdaptyUI.createFlowView(flow)
    .onSuccess { view ->
        view.present()
    }
    .onError { error ->
        // handle the error
    }
```

После успешного создания представления его можно отобразить на экране устройства. Каждое представление можно использовать только один раз: после вызова `dismiss()` вызовите `createFlowView` ещё раз, чтобы снова показать флоу.

:::tip
Подробнее о том, как отображать флоу, читайте в нашем [гайде](kmp-present-paywalls).
:::

## 3. Обработка нажатий на кнопки \{#3-handle-button-actions\}

Когда пользователи нажимают кнопки во флоу, Kotlin Multiplatform SDK автоматически обрабатывает покупки, восстановление, закрытие флоу и открытие ссылок.

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

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

Обратите внимание, что по умолчанию флоу остаётся открытым после успешной покупки. Если вы хотите закрыть его после завершения покупки, скройте вью в колбэке `flowViewDidFinishPurchase`.

:::tip
Читайте наши гайды о том, как обрабатывать [действия](kmp-handle-paywall-actions) и [события](kmp-handling-events) кнопок.
:::

```kotlin showLineNumbers
AdaptyUI.setFlowsEventsObserver(object : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction -> mainUiScope.launch { view.dismiss() }
            else -> Unit
        }
    }

    override fun flowViewDidFinishPurchase(
        view: AdaptyUIFlowView,
        product: AdaptyPaywallProduct,
        purchaseResult: AdaptyPurchaseResult
    ) {
        if (purchaseResult !is AdaptyPurchaseResult.UserCanceled) {
            mainUiScope.launch { view.dismiss() }
        }
    }
})
```

## Следующие шаги \{#next-steps\}

Ваш пейвол готов к показу в приложении. Протестируйте покупки в [песочнице App Store](test-purchases-in-sandbox) или в [Google Play Store](testing-on-android), чтобы убедиться, что тестовая покупка через пейвол проходит успешно.

Теперь вам нужно [проверить уровень доступа пользователей](kmp-check-subscription-status), чтобы показывать пейвол или открывать платные функции нужным пользователям.

## Полный пример \{#full-example\}

Вот как все эти шаги можно объединить в вашем приложении.

```kotlin showLineNumbers
// Set up the observer for handling flow events
AdaptyUI.setFlowsEventsObserver(object : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction -> mainUiScope.launch { view.dismiss() }
            else -> Unit
        }
    }

    override fun flowViewDidFinishPurchase(
        view: AdaptyUIFlowView,
        product: AdaptyPaywallProduct,
        purchaseResult: AdaptyPurchaseResult
    ) {
        if (purchaseResult !is AdaptyPurchaseResult.UserCanceled) {
            mainUiScope.launch { view.dismiss() }
        }
    }
})

// Get and display the flow
Adapty.getFlow("YOUR_PLACEMENT_ID")
    .onSuccess { flow ->
        AdaptyUI.createFlowView(flow)
            .onSuccess { view ->
                view.present()
            }
            .onError { error ->
                // the flow has no view configured — use custom logic
            }
    }
    .onError { error ->
        // handle the error
    }
```