# Guida rapida (/it/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>

L'Accept SDK viene eseguito all'interno della Sua app e gestisce i pagamenti sul dispositivo: legge la carta o il pagamento Tap to Pay, cifra i dati e tiene la gestione delle carte fuori dal Suo codice, così Lei resta al di fuori dell'ambito PCI. Il Suo backend autentica ogni sessione dell'SDK presso la Tapaya API, esegue l'onboarding degli esercenti e avvia la verifica KYB. Tapaya esegue i controlli KYB e regola i fondi a favore dell'esercente.

## Scegliere il percorso di integrazione [#choose-your-integration-path]

Esistono due modi per accettare pagamenti con carta tramite Tap to Pay. Entrambi affidano l'effettiva interazione con la carta
all'app plugin **Tapaya Terminal** sullo stesso dispositivo. Si differenziano per quanta parte di questo passaggio gestisce la Sua app:

<Cards>
  <VisualCard title="Accept SDK (consigliato)" visual="<Layers />" href="#set-up-your-integrator-account" description="Integri l'SDK nella Sua app Android e riceva il risultato tramite callback. Questa guida descrive questo percorso." />

  <VisualCard title="Solo Tapaya Terminal" visual="<SquareTerminal />" href="/in-store/integration/card_terminal#integrate-without-the-sdk" description="Senza SDK: apra Tapaya Terminal con un intent o un deeplink e interroghi periodicamente lo stato del pagamento." />
</Cards>

## Configurare l'account integratore [#set-up-your-integrator-account]

Prima di scrivere codice, configuri l'account con cui il Suo backend si autenticherà:

1. **Si registri** su [platform.tapaya.com/register](https://platform.tapaya.com/register). La registrazione è self-service: non serve alcun invito.
2. **Acceda**, quindi crei la Sua organizzazione o si unisca a una esistente; Le verrà richiesto automaticamente subito dopo la registrazione.
3. **Generi il Suo Server Secret Token** dalla [pagina delle chiavi API](https://platform.tapaya.com/api-keys/): il Suo backend lo usa per chiamare la Tapaya Platform API (consulti [autenticazione della Platform API](/platform-api#authentication)).

<Callout title="Non è l'onboarding degli esercenti" type="info">
  Questa è la configurazione dell'account per **Lei**, l'integratore. I Suoi **esercenti** completano l'onboarding separatamente, tramite
  l'SDK, la Tapaya Platform UI, una Sua interfaccia o un link di invito. Per i dettagli consulti [Onboarding
  degli esercenti](/merchants/onboarding). `POST /merchant/auth/register` crea soltanto il record di base
  dell'esercente; l'onboarding ospitato tramite invito inizia con `POST /integrator/merchant/send-registration-invite`.
</Callout>

Il resto di questa guida spiega come aggiungere l'SDK al progetto, autenticare una sessione ed eseguire la prima transazione.

<section id="setup-section">
  <div className="fd-steps [&_h3]:fd-step">
    ### Aggiungere la dipendenza [#add-dependency]

    Su Android l'SDK è pubblicato su Maven Central; su React Native si installa da npm con
    `npx expo install @tapayadot/accept-react-native` e viene collegato dal suo config plugin.

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

    Sincronizzi il progetto (Android) o esegua `npx expo prebuild --clean` (React Native), quindi inizializzi l'SDK ed esegua
    l'autenticazione nel codice dell'applicazione.

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

    Autentichi una sessione dell'esercente con un token ottenuto dal Suo backend.
    `authenticate` è una funzione `suspend` e in caso di errore genera un'`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 dell'esercente [#onboard-the-merchant]

    Prima che qualsiasi transazione sia consentita, l'esercente deve completare l'onboarding KYB. L'onboarding **non è più
    gestito dall'Accept SDK**. Lo completi tramite la Tapaya Platform UI, una Sua interfaccia basata sulla Tapaya
    API o un link di invito. Tutti i metodi sono descritti in [Onboarding degli esercenti](/merchants/onboarding).

    <Callout title="Approvazione automatica in sandbox" type="info">
      Nell'ambiente sandbox gli esercenti vengono approvati automaticamente subito dopo l'onboarding, quindi non deve attendere la verifica del processore di pagamento.
    </Callout>

    ### Verificare che l'esercente sia pronto [#verify-merchant-readiness]

    Si assicuri che l'esercente abbia completato l'onboarding e sia approvato per accettare pagamenti.

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

    L'esercente è pronto solo dopo l'approvazione del processore di pagamento. Se mancano alcune informazioni,
    l'onboarding deve essere ripetuto. In alcuni casi il processore di pagamento potrebbe bloccare completamente l'esercente, ad esempio se vende merci vietate.

    ### Installare e attivare il terminale [#install--activate-terminal]

    <Callout title="App plugin obbligatoria" type="warn">
      I pagamenti con carta richiedono che sul dispositivo sia installato il plugin **Tapaya Accept**.
      Usi `Accept.plugin.isInstalled()` per verificarlo e `Accept.plugin.install()` per aprire la scheda
      nello store se manca.
    </Callout>

    Il plugin Tapaya Accept è obbligatorio per i pagamenti con carta. Verifichi se è installato, quindi attivi
    il terminale, oppure apra la scheda nel Play Store per installarlo.

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

    ### Creare una transazione di pagamento [#create-payment-transaction]

    Per eseguire una transazione, chiami `Accept.payments.pay()` con l'importo (nell'unità minima della valuta)
    e un codice valuta ISO 4217. Restituisce un `Flow<PaymentEvent>`; lo raccolga per seguire l'avanzamento e
    l'esito finale. `pay()` non genera mai eccezioni: gli errori arrivano come `PaymentEvent.CreationFailed`.

    La guida rapida richiede solo `amount` e `currency`. Per tutti i parametri facoltativi, come una mancia fissa, le personalizzazioni
    della ricevuta o i metadati, consulti [Creare un pagamento](../integration/card_terminal#create-a-payment).

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