# Hướng dẫn bắt đầu nhanh (/vi/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 chạy bên trong ứng dụng của bạn và xử lý thanh toán ngay trên thiết bị: SDK đọc thẻ hoặc giao dịch Tap to Pay, mã hóa dữ liệu và giữ việc xử lý thẻ nằm ngoài mã của bạn, nhờ đó bạn nằm ngoài phạm vi PCI. Backend của bạn xác thực từng phiên SDK với Tapaya API, thực hiện onboarding merchant và kích hoạt KYB. Tapaya thực hiện các bước kiểm tra KYB và quyết toán tiền cho merchant.

## Chọn cách tích hợp [#choose-your-integration-path]

Có hai cách nhận thanh toán bằng thẻ qua Tap to Pay. Cả hai đều chuyển phần tương tác thực tế với thẻ cho
ứng dụng plugin **Tapaya Terminal** trên cùng thiết bị. Điểm khác nhau là ứng dụng của bạn tự quản lý bao nhiêu phần trong việc chuyển giao đó:

<Cards>
  <VisualCard title="Accept SDK (khuyến nghị)" visual="<Layers />" href="#set-up-your-integrator-account" description="Tích hợp SDK vào ứng dụng Android của bạn và nhận kết quả qua callback. Hướng dẫn này đi theo cách tích hợp này." />

  <VisualCard title="Chỉ dùng Tapaya Terminal" visual="<SquareTerminal />" href="/in-store/integration/card_terminal#integrate-without-the-sdk" description="Không dùng SDK: mở Tapaya Terminal bằng intent hoặc deeplink và truy vấn định kỳ trạng thái thanh toán." />
</Cards>

## Thiết lập tài khoản bên tích hợp [#set-up-your-integrator-account]

Trước khi viết mã, hãy thiết lập tài khoản mà backend của bạn sẽ dùng để xác thực:

1. **Đăng ký** tại [platform.tapaya.com/register](https://platform.tapaya.com/register). Bạn tự đăng ký: không cần lời mời.
2. **Đăng nhập**, sau đó tạo hoặc tham gia tổ chức của bạn; hệ thống sẽ tự động nhắc bạn làm việc này ngay sau khi đăng ký.
3. **Tạo Server Secret Token** từ [trang API Keys](https://platform.tapaya.com/api-keys/): backend của bạn dùng token này để gọi Tapaya Platform API (xem [xác thực Platform API](/platform-api#authentication)).

<Callout title="Không phải onboarding merchant" type="info">
  Đây là bước thiết lập tài khoản cho **bạn**, bên tích hợp. Các **merchant** của bạn được onboarding riêng, qua
  SDK, Tapaya Platform UI, UI của riêng bạn hoặc một liên kết mời. Xem [Onboarding
  merchant](/merchants/onboarding) để biết chi tiết. `POST /merchant/auth/register` chỉ tạo bản ghi merchant
  cơ bản; onboarding qua lời mời trên trang do Tapaya lưu trữ bắt đầu bằng `POST /integrator/merchant/send-registration-invite`.
</Callout>

Phần còn lại của hướng dẫn này trình bày cách thêm SDK vào dự án, xác thực một phiên và thực hiện giao dịch đầu tiên.

<section id="setup-section">
  <div className="fd-steps [&_h3]:fd-step">
    ### Thêm dependency [#add-dependency]

    Trên Android, SDK được phát hành trên Maven Central; trên React Native, SDK được cài từ npm bằng
    `npx expo install @tapayadot/accept-react-native` và được kết nối thông qua config plugin của nó.

    <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>

    Đồng bộ dự án (Android) hoặc chạy `npx expo prebuild --clean` (React Native), sau đó khởi tạo và
    xác thực trong mã ứng dụng của bạn.

    <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>

    Xác thực phiên của merchant bằng token lấy từ backend của bạn.
    `authenticate` là một hàm `suspend` và ném ra `AcceptException` khi thất bại.

    <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>

    ### Onboarding merchant [#onboard-the-merchant]

    Trước khi được phép thực hiện bất kỳ giao dịch nào, merchant phải hoàn tất onboarding KYB. Onboarding **không còn
    do Accept SDK điều khiển**. Hãy hoàn tất qua Tapaya Platform UI, UI của riêng bạn kết nối với Tapaya
    API, hoặc một liên kết mời. Xem [Onboarding merchant](/merchants/onboarding) để biết tất cả các cách.

    <Callout title="Tự động duyệt trong sandbox" type="info">
      Trong môi trường sandbox, merchant được tự động duyệt ngay sau khi onboarding, nên bạn không phải chờ đơn vị xử lý thanh toán xét duyệt.
    </Callout>

    ### Kiểm tra merchant đã sẵn sàng [#verify-merchant-readiness]

    Đảm bảo merchant đã hoàn tất onboarding và được duyệt để nhận thanh toán.

    <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>

    Merchant chỉ sẵn sàng sau khi đơn vị xử lý thanh toán đã duyệt. Nếu thiếu một số thông tin,
    phải thực hiện lại onboarding. Trong một số trường hợp, đơn vị xử lý thanh toán có thể chặn hoàn toàn merchant, chẳng hạn khi bán hàng hóa bị cấm.

    ### Cài đặt và kích hoạt máy thanh toán [#install--activate-terminal]

    <Callout title="Cần ứng dụng plugin" type="warn">
      Để thanh toán bằng thẻ, thiết bị phải cài đặt plugin **Tapaya Accept**.
      Dùng `Accept.plugin.isInstalled()` để kiểm tra, và `Accept.plugin.install()` để mở trang ứng dụng
      trên cửa hàng nếu plugin chưa được cài.
    </Callout>

    Plugin Tapaya Accept là bắt buộc đối với thanh toán bằng thẻ. Kiểm tra xem plugin đã được cài đặt chưa, sau đó kích hoạt
    máy thanh toán, hoặc mở trang ứng dụng trên Play Store để cài đặt.

    <div className="bg-background relative h-auto w-full overflow-hidden rounded-lg border px-10">
            <img alt="Plugin" 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>

    ### Tạo giao dịch thanh toán [#create-payment-transaction]

    Để thực hiện giao dịch, gọi `Accept.payments.pay()` với số tiền (theo đơn vị nhỏ nhất của loại tiền tệ)
    và mã tiền tệ ISO 4217. Hàm trả về một `Flow<PaymentEvent>`; hãy collect flow này để theo dõi tiến trình và
    kết quả cuối cùng. `pay()` không bao giờ ném ngoại lệ: các lỗi được trả về dưới dạng `PaymentEvent.CreationFailed`.

    Phần bắt đầu nhanh chỉ cần `amount` và `currency`. Với mọi tham số tùy chọn, chẳng hạn tiền tip cố định, ghi đè thông tin
    biên lai hoặc metadata, xem [Tạo khoản thanh toán](../integration/card_terminal#create-a-payment).

    <div className="bg-background relative h-auto w-full overflow-hidden rounded-lg border px-10">
            <img alt="Thanh toán" 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>
