# Inicializando o POS

Antes de poder processar quaisquer transações de pagamento, você deve inicializar o aplicativo Tap on Phone. O processo de inicialização estabelece uma sessão segura, aciona a validação de Single Sign-On (SSO) com o seu backend e configura o terminal para o lojista específico.

Normalmente, você realiza essa inicialização uma vez quando o lojista faz login no seu aplicativo cliente. A sessão permanece ativa entre as inicializações do app e as reinicializações do dispositivo até que você a redefina (reset) explicitamente.

## Pré-requisitos

Antes de inicializar o POS, certifique-se de que você tem:

* O `userId`, `merchantId` e `userToken` atuais para o lojista autenticado.  
* O `ClientID` da sua organização, formatado como uma string JSON.  
* Implementou as APIs Activity Result do AndroidX para gerenciar a resposta do intent.

## Passo 1: Registrar o Activity Result Launcher

O app Tap on Phone processa a inicialização de forma assíncrona e pode exibir uma interface para solicitar as permissões necessárias do dispositivo (como acesso à localização) ao lojista.

Você deve registrar um callback de Activity Result para gerenciar o resultado final:

```
val posInitResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // The POS is initialized and ready to process transactions
    } else if (result.resultCode == Activity.RESULT_CANCELED) {
        // The initialization failed
        val data = result.data
        val errorCode = data?.getStringExtra("errorCode") ?: "None"
        val errorName = data?.getStringExtra("errorName") ?: "None"
        val errorMessage = data?.getStringExtra("errorMessage") ?: "None"

        // Handle the error (e.g., prompt the user to retry or contact support)
    }
}
```

## Passo 2: Construir o Intent de Inicialização

Crie um Android Intent explícito direcionado à `InitActivity` do aplicativo Tap on Phone. Você deve incluir o package name, o class name específico e os parâmetros obrigatórios como extras do intent.

1. Defina a classe do componente como `com.dejamobile.cbp.sps.app.InitActivity`.  
2. Formate o seu Client ID como uma string JSON para passar no extra `operationMetadata`.  
3. Adicione o `userId`, `merchantId` e `userToken`.

```
private fun startPosInit(userId: Int, merchantId: Int, userToken: String, clientId: String) {

    // Format the Client ID as a JSON string
    val operationMetadata \= "{\\"ClientID\\":\\"$clientId\\"}"

    val intent \= Intent().apply {
        setClassName(
            "com.dejamobile.cbp.sps.app",
            "com.dejamobile.cbp.sps.app.InitActivity"
        )

        putExtra("userId", userId)
        putExtra("merchantId", merchantId)
        putExtra("userToken", userToken)
        putExtra("operationMetadata", operationMetadata)
    }

    // Launch the intent
    posInitResult.launch(intent)
}
```

## Passo 3: Iniciar o Intent

Chame a sua função para iniciar o intent.

Quando você inicia este intent:

1. O app Tap on Phone envia a solicitação de inicialização para o backend.  
2. O backend envia uma solicitação de permissão de SSO para o seu backend.  
3. Se o seu backend aprovar a solicitação (HTTP 200), o app Tap on Phone configura o terminal local.  
4. A Activity é finalizada e retorna `RESULT_OK` para o seu callback registrado.

<Callout type="info">

Se você precisar trocar de usuários ou limpar a configuração atual, você deve enviar um broadcast de reset antes de chamar o intent de inicialização novamente. Veja [Redefinindo o POS](/pt/get-tap-on-phone/transaction-guides/resetting-the-pos) para obter instruções.

</Callout>