Getnet DocsGetnet Docs

Início Rápido: Sua Primeira Venda

Este tutorial orienta você pelos passos essenciais para processar sua primeira transação de pagamento usando o Get Mini SDK. Você inicializará o ambiente do SDK, fará login como estabelecimento (merchant), conectará a um dispositivo PIN pad físico e executará uma transação de venda com tratamento de resultados baseado em delegate.

Requisitos

Antes de começar, certifique-se de ter:

  • SDK integrado no seu projeto Xcode com as linker flags -ObjC e -lsqlite3 configuradas
  • Protocolos do External Accessory adicionados ao seu Info.plist (ex: com.datecs.pinpad)
  • Credenciais de teste fornecidas pelo Get Mini: FUC (Merchant ID), Terminal ID, Chave de Licença (License Key) e credenciais de login
  • Dispositivo iOS físico para testes (O Simulator não suporta comunicação Bluetooth com PIN pad)
  • Dispositivo PIN pad Bluetooth ligado e dentro do alcance

Você deve concluir Instalar o SDK e Configurar Permissões do iOS antes de prosseguir com este tutorial.

Processo de Pagamento

Esta seção guia você por todo o fluxo de pagamento, desde a inicialização até o tratamento do resultado da transação.

Passo 1: Inicializar o Ambiente do SDK

O SDK deve ser inicializado com sua license key e ambiente de destino antes de qualquer operação. Essa configuração normalmente ocorre no seu AppDelegate ou em uma classe gerenciadora de pagamentos dedicada:

// Import via Bridging Header: CommonUtils.h
func initializeSDK() {
    // Set environment: "des" (Development), "int" (Integration), "ccal" (Pre-production), "real" (Production)
    CommonUtils.setEntorno("des")

    // Set your license key provided by Get Mini
    CommonUtils.setAppLicense("YOUR_LICENSE_KEY")
}

Chame este método de inicialização em application(_:didFinishLaunchingWithOptions:) antes de qualquer operação do SDK. A configuração de ambiente determina a quais servidores do Gateway do Get Mini o SDK se conecta para processar as transações.

Sempre use o ambiente de teste ("des") durante o desenvolvimento. Mude para produção ("real") apenas quando implantar em ambientes produtivos com credenciais de produção válidas.

Passo 2: Executar o Login do Estabelecimento

Antes de processar transações, recupere a configuração do estabelecimento do Get Mini. A operação de login retorna os dados do estabelecimento (FUC, Terminal, etc.) necessários para as operações de pagamento:

// Import via Bridging Header: DatosLoginDTO.h, RedsysConfigurationManager.h
func performMerchantLogin() {
    let loginDTO = DatosLoginDTO(user: "your_username", andPass: "your_password")

    RedsysConfigurationManager.obtenerDatosComercioLogin(loginDTO) { result, error in
        if let merchantData = result {
            print("Login successful for: \(merchantData.nombreComercio ?? "Merchant")")
            // Store merchantData for use in payment operations
            self.saveMerchantData(merchantData)
        } else {
            print("Login failed: \(error?.localizedDescription ?? "Unknown error")")
        }
    }
}

O objeto DatosLoginResponseDTO retornado em caso de sucesso contém configurações essenciais do estabelecimento, incluindo FUC, Terminal ID e outras configurações necessárias para criar o objeto MerchanDTO para o processamento de pagamentos.

Passo 3: Implementar Protocolos de Delegate

Sua view controller deve estar em conformidade com os protocolos de delegate do SDK para receber callbacks durante a inicialização e o processamento de pagamentos. Adicione os protocolos necessários à declaração da sua classe:

// Import via Bridging Header: RedsysPinpadManager.h
class PaymentViewController: UIViewController,
                             RedsysDelegateGeneric,
                             RedsysBTPinpadInitDelegate,
                             RedsysBTPinpadPaymentDelegate {

    var pinpadManager: RedsysPinpadManager!
    var selectedDevice: Any?
    var pinpadConfig: PinpadConfig?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Manager initialization will happen when starting the payment flow
    }

    // MARK: - Init Delegate Methods

    func onInitFinished(_ result: Any!, orError error: Error!) {
        if let config = result as? PinpadConfig {
            print("PinPad initialized successfully")
            self.pinpadConfig = config
            // Proceed to payment
        } else {
            print("Initialization failed: \(error?.localizedDescription ?? "")")
        }
    }

    // MARK: - Payment Delegate Methods

    func onPaymentProcess(_ result: Any!, orError error: Error!) {
        // Called during payment processing to notify progress
        print("Payment in progress...")
    }

    func onPaymentFinished(_ result: RespuestaTransaccionDTO!, orError error: Error!) {
        if let transaction = result, error == nil {
            print("Sale Approved! Auth Code: \(transaction.codigoAutorizacion ?? "")")
        } else {
            print("Sale Failed: \(error?.localizedDescription ?? "")")
        }
    }
}

Os métodos do delegate fornecem callbacks em diferentes estágios: onInitFinished confirma que o PIN pad está pronto, onPaymentProcess notifica sobre atualizações de progresso e onPaymentFinished entrega o resultado final da transação.

Passo 4: Inicializar o Gerenciador do PIN pad

Crie a instância do gerenciador do PIN pad e inicialize-a para comunicação Bluetooth:

func startPaymentFlow() {
    // Initialize manager with Bluetooth technology
    pinpadManager = RedsysPinpadManager(bluetoothTech: "GENERAL")

    // Get available Bluetooth devices
    let availableDevices = pinpadManager.bluetoothDevicesList()

    guard let devices = availableDevices as? [Any], !devices.isEmpty else {
        print("No PinPad devices found")
        return
    }

    // Select first available device
    selectedDevice = devices[0]

    // Configure the selected device
    connectAndConfigureDevice()
}

func connectAndConfigureDevice() {
    // Create MerchanDTO from login response
    let merchantDTO = MerchanDTO()
    merchantDTO.fuc = "999008881"  // From DatosLoginResponseDTO
    merchantDTO.fucExtendido = "999008881"
    merchantDTO.terminal = "001"
    merchantDTO.password = "your_password"

    // Connect and configure the device
    pinpadManager.connectAndConfigureDevice(selectedDevice,
                                           merchan: merchantDTO,
                                           withDelegate: self)
}

O gerenciador busca por dispositivos Bluetooth pareados e estabelece uma conexão. O método delegate onInitFinished será chamado quando o dispositivo estiver pronto para transações.

Passo 5: Executar o Pagamento

Uma vez que o PIN pad é inicializado (confirmado em onInitFinished), crie o DTO de pagamento e execute a transação:

func executePayment() {
    guard let config = pinpadConfig else {
        print("PinPad not initialized")
        return
    }

    // Create payment DTO
    let amount: Float = 10.50  // Amount in currency units
    let pagoDTO = PagoDTO(
        valor: Int(amount * 100),  // Convert to cents
        mMoneda: 978,              // ISO 4217 code (978 = EUR)
        nFactura: "TEST\(Int.random(in: 1000...9999))",  // Unique invoice number
        email: "",
        tlfCliente: "",
        datosPropietarios: ""
    )

    // Create MerchanDTO (same as in Step 4)
    let merchantDTO = MerchanDTO()
    merchantDTO.fuc = "999008881"
    merchantDTO.fucExtendido = "999008881"
    merchantDTO.terminal = "001"
    merchantDTO.password = "your_password"

    // Execute payment
    pinpadManager.payWithPinpadBluetooth(
        selectedDevice,
        merchan: merchantDTO,
        config: config,
        andPagoDTO: pagoDTO,
        withDelegate: self
    )
}

O SDK gerencia o fluxo completo da transação, incluindo a solicitação de inserção do cartão, a digitação do PIN, a comunicação com o Gateway de pagamento e o retorno do resultado através do callback delegate onPaymentFinished.

ParâmetroTipoDescrição
valorIntValor da transação em centavos (ex: 1050 para €10.50)
mMonedaIntCódigo ISO 4217 da moeda (978 = EUR, 840 = USD)
nFacturaStringNúmero único da fatura/pedido para rastreamento

Passo 6: Lidar com os Resultados da Transação

Processe o resultado da transação no callback delegate onPaymentFinished:

func onPaymentFinished(_ result: RespuestaTransaccionDTO!, orError error: Error!) {
    if let transaction = result, error == nil {
        // Transaction successful
        let authCode = transaction.codigoAutorizacion ?? ""
        let amount = transaction.importeTotal ?? ""

        print("Payment Approved")
        print("Auth Code: \(authCode)")
        print("Amount: \(amount)")

        // Save to database
        saveTransaction(authCode: authCode, amount: amount)

        // Show success message
        showSuccessAlert(authCode: authCode)
    } else {
        // Transaction failed
        print("Payment Failed: \(error?.localizedDescription ?? "")")
        showErrorAlert(message: error?.localizedDescription ?? "Transaction failed")
    }
}

Sempre salve o código de autorização (codigoAutorizacion) das transações bem-sucedidas. Este código é necessário para estornos e conciliação.

Solução de Problemas

Crash na Inicialização do RedsysPinpadManager

Verifique se a linker flag -ObjC está adicionada em Other Linker Flags. A ausência desta flag causa travamentos (crashes) de “Selector not recognized”.

Nenhum Dispositivo PIN pad Encontrado

Certifique-se de que UISupportedExternalAccessoryProtocols no Info.plist inclui o protocolo correto para o seu dispositivo (ex: com.datecs.pinpad para dispositivos Itos/Castles). Confirme se o dispositivo está pareado em Configurações do iOS > Bluetooth.

Erro de Ambiente Durante o Login

Se o login falhar com erros de ambiente, verifique se CommonUtils.setEntorno está definido como "des" para credenciais de teste ou "real" para credenciais de produção. O ambiente deve corresponder às suas credenciais.

Próximos Passos

Agora que você processou com sucesso seu primeiro pagamento, explore recursos adicionais do SDK: