# Schnellstart (/de/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>

Das Accept SDK läuft in Ihrer App und wickelt Zahlungen direkt auf dem Gerät ab: Es erfasst die Karte oder die Tap-to-Pay-Zahlung, verschlüsselt die Daten und hält die Kartenverarbeitung aus Ihrem Code heraus, sodass Sie außerhalb des PCI-Geltungsbereichs bleiben. Ihr Backend authentifiziert jede SDK-Session gegenüber der Tapaya API, führt das Onboarding der Händler durch und stößt KYB an. Tapaya führt die KYB-Prüfungen durch und rechnet die Gelder gegenüber dem Händler ab.

## Integrationsweg wählen [#choose-your-integration-path]

Es gibt zwei Möglichkeiten, Kartenzahlungen mit Tap to Pay anzunehmen. Beide übergeben die eigentliche Interaktion mit der Karte
an die Plugin-App **Tapaya Terminal** auf demselben Gerät. Sie unterscheiden sich darin, wie viel dieser Übergabe Ihre App selbst steuert:

<Cards>
  <VisualCard title="Accept SDK (empfohlen)" visual="<Layers />" href="#set-up-your-integrator-account" description="Betten Sie das SDK in Ihre Android-App ein und erhalten Sie das Ergebnis in Callbacks. Dieser Leitfaden beschreibt diesen Weg." />

  <VisualCard title="Nur Tapaya Terminal" visual="<SquareTerminal />" href="/in-store/integration/card_terminal#integrate-without-the-sdk" description="Ohne SDK: Öffnen Sie Tapaya Terminal mit einem Intent oder Deeplink und fragen Sie den Zahlungsstatus regelmäßig ab." />
</Cards>

## Integrator-Konto einrichten [#set-up-your-integrator-account]

Bevor Sie Code schreiben, richten Sie das Konto ein, gegenüber dem sich Ihr Backend authentifiziert:

1. **Registrieren Sie sich** unter [platform.tapaya.com/register](https://platform.tapaya.com/register). Die Registrierung erfolgt per Self-Service: Eine Einladung ist nicht erforderlich.
2. **Melden Sie sich an** und erstellen Sie dann Ihre Organisation oder treten Sie einer bestehenden bei; Sie werden direkt nach der Registrierung automatisch dazu aufgefordert.
3. **Generieren Sie Ihr Server Secret Token** auf der [Seite „API Keys“](https://platform.tapaya.com/api-keys/): Ihr Backend verwendet es, um die Tapaya Platform API aufzurufen (siehe [Authentifizierung der Platform API](/platform-api#authentication)).

<Callout title="Nicht dasselbe wie das Händler-Onboarding" type="info">
  Dies ist die Kontoeinrichtung für **Sie** als Integrator. Ihre **Händler** durchlaufen das Onboarding separat, entweder über
  das SDK, das Tapaya Platform UI, Ihre eigene Oberfläche oder einen Einladungslink. Details finden Sie unter
  [Händler-Onboarding](/merchants/onboarding). `POST /merchant/auth/register` legt nur den Basis-Händlerdatensatz
  an; das gehostete Onboarding per Einladung beginnt mit `POST /integrator/merchant/send-registration-invite`.
</Callout>

Der Rest dieses Leitfadens beschreibt, wie Sie das SDK zu Ihrem Projekt hinzufügen, eine Session authentifizieren und Ihre erste Transaktion durchführen.

<section id="setup-section">
  <div className="fd-steps [&_h3]:fd-step">
    ### Abhängigkeit hinzufügen [#add-dependency]

    Für Android wird das SDK über Maven Central veröffentlicht; unter React Native wird es mit
    `npx expo install @tapayadot/accept-react-native` aus npm installiert und über sein Config-Plugin eingebunden.

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

    Synchronisieren Sie das Projekt (Android) oder führen Sie `npx expo prebuild --clean` aus (React Native). Initialisieren und
    authentifizieren Sie das SDK anschließend in Ihrem Anwendungscode.

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

    Authentifizieren Sie eine Händler-Session mit einem Token, das Sie von Ihrem Backend erhalten.
    `authenticate` ist eine `suspend`-Funktion und wirft bei einem Fehler eine `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>

    ### Onboarding des Händlers [#onboard-the-merchant]

    Bevor Transaktionen zugelassen werden, muss der Händler das KYB-Onboarding abschließen. Das Onboarding wird **nicht mehr
    über das Accept SDK gesteuert**. Schließen Sie es über das Tapaya Platform UI, Ihre eigene Oberfläche auf Basis der Tapaya
    API oder einen Einladungslink ab. Alle Methoden finden Sie unter [Händler-Onboarding](/merchants/onboarding).

    <Callout title="Automatische Genehmigung in der Sandbox" type="info">
      In der Sandbox-Umgebung werden Händler direkt nach dem Onboarding automatisch genehmigt, sodass Sie nicht auf die Prüfung durch den Zahlungsabwickler warten müssen.
    </Callout>

    ### Bereitschaft des Händlers prüfen [#verify-merchant-readiness]

    Stellen Sie sicher, dass der Händler das Onboarding abgeschlossen hat und für die Zahlungsannahme genehmigt ist.

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

    Der Händler ist erst bereit, nachdem der Zahlungsabwickler ihn genehmigt hat. Fehlen Angaben,
    muss das Onboarding wiederholt werden. In manchen Fällen kann der Zahlungsabwickler den Händler vollständig sperren, etwa beim Verkauf verbotener Waren.

    ### Terminal installieren und aktivieren [#install--activate-terminal]

    <Callout title="Plugin-App erforderlich" type="warn">
      Für Kartenzahlungen muss das Plugin **Tapaya Accept** auf dem Gerät installiert sein.
      Prüfen Sie dies mit `Accept.plugin.isInstalled()` und öffnen Sie mit `Accept.plugin.install()` den Store-Eintrag,
      falls es fehlt.
    </Callout>

    Das Plugin Tapaya Accept ist für Kartenzahlungen erforderlich. Prüfen Sie, ob es installiert ist, und aktivieren Sie dann
    das Terminal, oder öffnen Sie den Eintrag im Play Store, um es zu installieren.

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

    ### Zahlungstransaktion erstellen [#create-payment-transaction]

    Um eine Transaktion durchzuführen, rufen Sie `Accept.payments.pay()` mit dem Betrag (in der kleinsten Einheit der Währung)
    und einem Währungscode nach ISO 4217 auf. Die Methode gibt einen `Flow<PaymentEvent>` zurück; sammeln Sie ihn ein (collect), um den Fortschritt und
    das endgültige Ergebnis zu verfolgen. `pay()` wirft nie eine Exception: Fehler kommen als `PaymentEvent.CreationFailed` an.

    Für den Schnellstart genügen `amount` und `currency`. Alle optionalen Parameter, etwa ein festes Trinkgeld, Anpassungen
    am Beleg oder Metadaten, finden Sie unter [Zahlung erstellen](../integration/card_terminal#create-a-payment).

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