# Швидкий старт (/uk/in-store/getting-started/quick_start_guide)









<div className="bg-background relative h-auto w-full overflow-hidden rounded-lg border mt-8">
  <FlickeringGrid className="absolute inset-0 z-0 size-full" squareSize="4" gridGap="6" maxOpacity="0.1" flickerChance="0.1" height="800" width="2000" />

  <SdkLifecycleDiagram />
</div>

Accept SDK працює всередині вашого застосунку й обробляє платежі безпосередньо на пристрої: зчитує картку або платіж через Tap to Pay, шифрує дані та тримає роботу з карткою поза вашим кодом, тож ви залишаєтеся поза сферою дії PCI. Ваш бекенд автентифікує кожну сесію SDK через Tapaya API, проводить онбординг мерчантів і запускає KYB. Tapaya виконує перевірки KYB і проводить розрахунок коштів на користь мерчанта.

## Виберіть спосіб інтеграції [#choose-your-integration-path]

Приймати платежі карткою через Tap to Pay можна двома способами. Обидва передають саму взаємодію з карткою
застосунку-плагіну **Tapaya Terminal** на тому самому пристрої. Вони відрізняються тим, яку частину цієї передачі контролює ваш застосунок:

<Cards>
  <VisualCard title="Accept SDK (рекомендовано)" visual="<Layers />" href="#set-up-your-integrator-account" description="Вбудуйте SDK у свій застосунок для Android і отримуйте результат через callback. Цей посібник описує саме цей спосіб." />

  <VisualCard title="Лише Tapaya Terminal" visual="<SquareTerminal />" href="/in-store/integration/card_terminal#integrate-without-the-sdk" description="Без SDK: відкрийте Tapaya Terminal за допомогою intent або deeplink і періодично запитуйте статус платежу." />
</Cards>

## Налаштування облікового запису інтегратора [#set-up-your-integrator-account]

Перш ніж писати код, налаштуйте обліковий запис, через який автентифікуватиметься ваш бекенд:

1. **Зареєструйтеся** на [platform.tapaya.com/register](https://platform.tapaya.com/register). Реєстрація відбувається самостійно, запрошення не потрібне.
2. **Увійдіть**, а потім створіть організацію або приєднайтеся до наявної; вам автоматично запропонують це зробити одразу після реєстрації.
3. **Згенеруйте Server Secret Token** на [сторінці API-ключів](https://platform.tapaya.com/api-keys/): ваш бекенд використовує його для викликів Tapaya Platform API (див. [автентифікацію в Platform API](/platform-api#authentication)).

<Callout title="Це не онбординг мерчантів" type="info">
  Це налаштування облікового запису для **вас**, інтегратора. Ваші **мерчанти** проходять онбординг окремо: через
  SDK, Tapaya Platform UI, ваш власний UI або за посиланням-запрошенням. Докладніше див. у розділі [Онбординг
  мерчантів](/merchants/onboarding). `POST /merchant/auth/register` лише створює базовий запис
  мерчанта; хостований онбординг за запрошенням починається з `POST /integrator/merchant/send-registration-invite`.
</Callout>

Далі в цьому посібнику описано, як додати SDK до проєкту, автентифікувати сесію та провести першу транзакцію.

<section id="setup-section">
  <div className="fd-steps [&_h3]:fd-step">
    ### Додавання залежності [#add-dependency]

    На Android SDK опубліковано в Maven Central; у React Native він встановлюється з npm командою
    `npx expo install @tapayadot/accept-react-native` і підключається через власний конфігураційний плагін.

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin title="build.gradle.kts"
        dependencies {
            // [!code ++:1]
            implementation("com.tapaya:accept:1.15.0")
        }
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```json title="app.json"
        {
          "expo": {
            "plugins": ["@tapayadot/accept-react-native"]
          }
        }
        ```
      </CodeBlockTab>
    </CodeBlockTabs>

    Синхронізуйте проєкт (Android) або запустіть `npx expo prebuild --clean` (React Native), а потім
    виконайте ініціалізацію та автентифікацію в коді застосунку.

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin title="MyApplication.kt"
        // Step 1: Initialize (once, in Application.onCreate)
        Accept.initialize(this) // sandbox by default; pass isProduction = true to go live
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```typescript title="App.tsx"
        import Accept from '@tapayadot/accept-react-native';

        // Step 1: Initialize (once, at app startup)
        Accept.initialize(); // sandbox by default; pass { isProduction: true } to go live
        ```
      </CodeBlockTab>
    </CodeBlockTabs>

    Автентифікуйте сесію мерчанта за допомогою токена, отриманого з вашого бекенду.
    `authenticate` є функцією типу `suspend` і в разі невдачі викидає виняток `AcceptException`.

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin
        // Step 2: Authenticate (suspend; call from a coroutine)
        try {
            val sdkToken = myBackend.login() // token from POST /merchant/auth/login
            Accept.auth.authenticate(sdkToken)
            // Accept.state now emits SdkState.Authenticated
        } catch (e: AcceptException) {
            // handle authentication failure
        }
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```typescript
        // Step 2: Authenticate
        try {
            const sdkToken = await myBackend.login(); // token from POST /merchant/auth/login
            await Accept.auth.authenticate(sdkToken);
            // Accept.state is now 'authenticated'
        } catch (error) {
            // handle authentication failure
        }
        ```
      </CodeBlockTab>
    </CodeBlockTabs>

    ### Онбординг мерчанта [#onboard-the-merchant]

    Перш ніж буде дозволено будь-які транзакції, мерчант має завершити онбординг KYB. Онбординг **більше не
    керується Accept SDK**. Завершіть його через Tapaya Platform UI, власний UI, що працює з Tapaya
    API, або за посиланням-запрошенням. Усі способи описано в розділі [Онбординг мерчантів](/merchants/onboarding).

    <Callout title="Автоматичне схвалення в пісочниці" type="info">
      У пісочниці (sandbox) мерчантів схвалюють автоматично одразу після онбордингу, тож вам не потрібно чекати на перевірку платіжним процесором.
    </Callout>

    ### Перевірка готовності мерчанта [#verify-merchant-readiness]

    Переконайтеся, що мерчант завершив онбординг і отримав схвалення на прийом платежів.

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin
        val ready = when (val status = Accept.merchant.onboardingStatus()) {
            OnboardingStatus.ReadyForPayments -> true
            is OnboardingStatus.RequiresAction -> false // status.state describes what's blocking
        }
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```typescript
        const status = await Accept.merchant.onboardingStatus();
        // status.state describes what's blocking when it requires action
        const ready = status.type === 'readyForPayments';
        ```
      </CodeBlockTab>
    </CodeBlockTabs>

    Мерчант готовий лише після того, як його схвалить платіжний процесор. Якщо якихось даних бракує,
    онбординг потрібно пройти повторно. У деяких випадках платіжний процесор може повністю заблокувати мерчанта, наприклад у разі продажу заборонених товарів.

    ### Встановлення та активація термінала [#install--activate-terminal]

    <Callout title="Потрібен застосунок-плагін" type="warn">
      Для платежів карткою на пристрої має бути встановлено плагін **Tapaya Accept**.
      Для перевірки використовуйте `Accept.plugin.isInstalled()`, а якщо плагіна немає, відкрийте його сторінку
      в магазині застосунків за допомогою `Accept.plugin.install()`.
    </Callout>

    Плагін Tapaya Accept потрібен для платежів карткою. Перевірте, чи його встановлено, а потім активуйте
    термінал або відкрийте сторінку плагіна в Play Store, щоб його встановити.

    <div className="bg-background relative h-auto w-full overflow-hidden rounded-lg border px-10">
            <img alt="Плагін" src="__img0" />
    </div>

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin
        if (Accept.plugin.isInstalled()) {
            // suspend; returns ActivateTerminalResult (Success / Canceled / Failed)
            Accept.plugin.activateTerminal()
        } else {
            Accept.plugin.install() // opens the store listing
        }
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```typescript
        if (Accept.plugin.isInstalled()) {
            // returns ActivateTerminalResult: { type: 'success' | 'canceled' | 'failed' }
            await Accept.plugin.activateTerminal();
        } else {
            await Accept.plugin.install(); // opens the store listing
        }
        ```
      </CodeBlockTab>
    </CodeBlockTabs>

    ### Створення платіжної транзакції [#create-payment-transaction]

    Щоб провести транзакцію, викличте `Accept.payments.pay()` із сумою (у найменшій одиниці валюти)
    і кодом валюти за ISO 4217. Метод повертає `Flow<PaymentEvent>`; збирайте з нього події (collect), щоб стежити за перебігом і
    остаточним результатом. `pay()` ніколи не викидає винятків: невдачі надходять як `PaymentEvent.CreationFailed`.

    Для швидкого старту достатньо лише `amount` і `currency`. Усі необов'язкові параметри, як-от фіксовані чайові, перевизначення
    чека або метадані, описано в розділі [Створення платежу](../integration/card_terminal#create-a-payment).

    <div className="bg-background relative h-auto w-full overflow-hidden rounded-lg border px-10">
            <img alt="Платіж" src="__img1" />
    </div>

    <CodeBlockTabs defaultValue="kotlin" groupId="accept-language">
      <CodeBlockTabsList>
        <CodeBlockTabsTrigger value="kotlin">
          Android (Kotlin)
        </CodeBlockTabsTrigger>

        <CodeBlockTabsTrigger value="typescript">
          React Native (TypeScript)
        </CodeBlockTabsTrigger>
      </CodeBlockTabsList>

      <CodeBlockTab value="kotlin">
        ```kotlin
        Accept.payments.pay(amount = 15000, currency = "CZK") // 150.00 Kč
            .collect { event ->
                when (event) {
                    PaymentEvent.Creating -> Log.d("pay", "creating")
                    is PaymentEvent.Created -> Log.d("pay", "created ${event.paymentToken}")
                    PaymentEvent.Launched -> Log.d("pay", "launched")
                    is PaymentEvent.Result -> Log.d("pay", event.payResult.toString())
                    is PaymentEvent.CreationFailed -> Log.e("pay", event.cause.toString())
                }
            }
        ```
      </CodeBlockTab>

      <CodeBlockTab value="typescript">
        ```typescript
        // payAsync() reduces the event stream to its outcome; use pay() to render progress
        const result = await Accept.payments.payAsync({
            amount: 15000,
            currency: 'CZK', // 150.00 Kč
        });

        if (result.type === 'success') {
            console.log(result.paymentToken, result.receiptUrl);
        }
        ```
      </CodeBlockTab>
    </CodeBlockTabs>
  </div>
</section>
