# Segurança e Licenciamento

A leitura do cartão e a digitação do PIN acontecem no PIN pad certificado, não no seu aplicativo. Esta página cobre o que é responsabilidade do seu app: vincular o terminal pelo modelo de licenciamento, escolher o ambiente de execução, capturar a assinatura quando o cartão exige e tratar logs e credenciais com cuidado.

## Vinculação de Terminal e Licenciamento

Um recurso de segurança exclusivo do Get Mini SDK é a **Vinculação de Bundle ID**, que impede que aplicativos não autorizados processem transações usando as credenciais do seu estabelecimento.

### Processo de Registro de Licença

Para usar o SDK, você deve registrar o **Bundle Identifier** do seu aplicativo no Get Mini:

**Passo 1: Fornecer o Bundle ID**

Entre em contato com o suporte do Get Mini e forneça o Bundle Identifier do seu aplicativo iOS (encontrado no Xcode em **General > Identity > Bundle Identifier**).

**Passo 2: Receber a License Key**

O Get Mini emite uma chave de licença vinculada de forma exclusiva ao seu Bundle ID específico. Esta chave vincula as credenciais do seu estabelecimento ao seu aplicativo.

**Passo 3: Validação do SDK**

O SDK valida a licença durante a inicialização:

```
CommonUtils.setAppLicense("YOUR_LICENSE_KEY")
```

Se o Bundle ID do aplicativo em execução não corresponder àquele associado à licença, o SDK falha ao inicializar e retorna um erro.

### Controle de Ambiente

É **estritamente proibido** definir o ambiente como `"real"` (Produção) até que sua implementação tenha sido certificada pelo Get Mini:

```
// Development/Testing only
CommonUtils.setEntorno("des")  // Allowed during development

// Production - ONLY after certification
CommonUtils.setEntorno("real")  // Requires Get Mini approval
```

Esse controle impede transações de produção não autorizadas e garante que todas as implementações passem por uma revisão de segurança adequada antes de processar pagamentos reais.

## Assinatura como Alternativa de Segurança

Nem todas as transações são autorizadas via PIN. Em cenários específicos, o SDK exige a captura de uma assinatura digital para finalizar a validade legal da venda.

### Quando a Assinatura É Necessária

Se o portador do cartão não se autenticou via PIN, a resposta da transação indica isso através do campo `AutenticadoPorPin`:

```
func onPaymentFinished(_ result: RespuestaTransaccionDTO!, orError error: Error!) {
    if let transaction = result, transaction.AutenticadoPorPin == false {
        // Signature capture required
        captureCustomerSignature()
    }
}
```

Isso ocorre comumente com:
- **Transações offline** onde a verificação do PIN não foi possível
- **Tipos de cartão específicos** que não suportam autenticação por PIN
- **Cartões internacionais** com diferentes requisitos de autenticação

### Enviando a Assinatura

Seu aplicativo deve capturar a assinatura digital do cliente como uma imagem e enviá-la usando o método `envioFirmaDigitalizada`:

```
let signatureDTO = EnvioFirmaDTO(
    withTerminal: terminalDataDTO,
    withFirma: signatureImage,      // UIImage of signature
    Format: 2,                      // 2 = JPEG format
    andOperacion: operationDTO
)

RedsysConfigurationManager.envioFirmaDigitalizada(signatureDTO) { result, error in
    if error == nil {
        // Signature submitted successfully
    }
}
```

<Callout type="warning">

O envio da assinatura é um **requisito de segurança obrigatório** para concluir transações em que `AutenticadoPorPin == false`. Sem a assinatura, a transação pode não atender aos requisitos de validade legal.

</Callout>

## Responsabilidades de Segurança do Desenvolvedor

Embora o SDK gerencie a criptografia de dados, os desenvolvedores devem aderir às melhores práticas de segurança, conforme descrito na seção **"PRECAUCIÓN"** (Seção 3) do manual técnico.

### Proteções de Ambiente

**Nunca use credenciais de produção em ambientes de teste:**

- Use `"des"` (Desenvolvimento), `"int"` (Integração) ou `"ccal"` (Pré-produção) durante o desenvolvimento e testes
- Mude para `"real"` (Produção) apenas após a aprovação da certificação do Get Mini
- Mantenha credenciais de estabelecimento separadas para cada ambiente

### Gerenciamento de Logs

**Não registre (log) dados sensíveis de transação:**

```
// ❌ BAD: Logs entire response object
print("Transaction result: \(result)")

// ✅ GOOD: Logs only non-sensitive fields
print("Transaction completed with status: \(result.status)")
```

Objetos de resposta de `onPaymentFinished` contêm metadados de transação e códigos de autorização que não devem ser armazenados em:
- Logs de console
- Logs de sistema
- Serviços de analytics externos
- Ferramentas de relatórios de falhas (crash reporting)
- Arquivos locais

### Proteção de Credenciais

**Proteja os identificadores do estabelecimento:**

FUC (Merchant ID) e Terminal IDs devem ser:
- **Injetados no momento do build** via configurações de build
- **Recuperados de uma configuração remota segura** em tempo de execução
- **Nunca codificados diretamente (hardcoded) em texto claro** no código-fonte ou no controle de versão

```
// ❌ BAD: Hardcoded credentials
let fuc = "999008881"

// ✅ GOOD: Retrieved from secure configuration
let fuc = Configuration.shared.merchantFUC
```

## Próximos Passos

* [Ciclo de Vida da Transação](/pt/get-mini/ios-sdk/core-concepts/ios-lifecycle) - Veja como os estados de segurança fazem a transição durante uma venda
* [Configurar Permissões do iOS](/pt/get-mini/ios-sdk/first-steps/configure-ios-permissions) - Garanta que seu Info.plist esteja configurado corretamente