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 approvalEsse 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
}
}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.
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.merchantFUCPróximos Passos
- Ciclo de Vida da Transação - Veja como os estados de segurança fazem a transição durante uma venda
- Configurar Permissões do iOS - Garanta que seu Info.plist esteja configurado corretamente