Pular para o conteúdo principal
Nesta página

Requisitos#

Revise os requisitos para integrar o SDK iOS da DEUNA:

  • Versão do Swift: 5.8 ou superior
  • Versão do Xcode: 16.0 ou superior
  • Target de implantação: iOS 13.0 ou superior para experiências modais principais; iOS 14.0 ou superior para SwiftUI embedded DeunaWidget
  • Credenciais da DEUNA: Conta ativa e credenciais válidas (entre em contato com support@deuna.com se você tiver atrasos para obter credenciais)

Instalação#

Existem dois métodos suportados para instalar o SDK iOS da DEUNA:

Swift Package Manager (Recomendado)

  1. No Xcode, navegue até Arquivo → Adicionar Dependências de Pacote...
  2. Na barra de pesquisa, insira a URL do repositório:
    Plain text
    https://github.com/deuna-developers/deuna-sdk-ios
  3. Fixar a regra de dependência do pacote para a versão 2.12.6 (ou superior).
  4. Quando o Escolher Produtos do Pacote aparecer:
    • Selecione DeunaSDK e vincule-o ao seu target de aplicativo.
    • Defina todos os outros produtos (DeunaSDKCybersource, DeunaSDKKount, DeunaSDKRiskified, DeunaSDKSift, DeunaSDKSignifyd, DeunaSDKMercadoPago, DeunaSDKAccertify) como Nenhum a menos que sua integração use esse provedor antifraude específico.

CocoaPods

Se seu projeto iOS usa CocoaPods:

  1. Especifique o target de implantação mínimo e adicione DeunaSDK para o seu Podfile:
PodfileRuby
platform :ios, '14.0'

target 'YourApp' do
  use_frameworks!
  pod 'DeunaSDK', '~> 2.12.6'

  # Add ONLY the optional fraud provider subspecs you need:
  # pod 'DeunaSDK/MercadoPago'
  # pod 'DeunaSDK/Riskified'
  # pod 'DeunaSDK/Cybersource'
  # pod 'DeunaSDK/Signifyd'
  # pod 'DeunaSDK/Kount'
  # pod 'DeunaSDK/Sift'
  # pod 'DeunaSDK/Accertify'
end
  1. Execute:
Shell
pod install
  1. Desativar Sandbox de Scripts do Usuário: No Xcode, navegue até as Configurações de Builddo seu target, pesquise por User Script Sandboxing (ENABLE_USER_SCRIPT_SANDBOXING) e defina como Não.

Permissões Necessárias para Downloads de Vouchers

Inicialização#

Swift
import DeunaSDK

Você pode inicializar o SDK de duas maneiras, dependendo da arquitetura do seu aplicativo:

Instância compartilhada global

Inicialize uma vez durante a inicialização do app (por exemplo, no seu AppDelegate ou App inicializador) e acesse em qualquer lugar via DeunaSDK.shared:

Swift
DeunaSDK.initialize(
  environment: .sandbox, // .sandbox or .production
  publicApiKey: "YOUR_PUBLIC_API_KEY"
)

let deunaSDK = DeunaSDK.shared

Coordenador ou instância de tela

Crie e mantenha uma instância para uma tela ou coordenador específico:

Swift
let deunaSDK = DeunaSDK(
  environment: .sandbox,
  publicApiKey: "YOUR_PUBLIC_API_KEY"
)

Abrir widget de pagamento#

O Widget de Pagamento oferece vários métodos de pagamento aos clientes:

  • Cartões de crédito e débito: Visa, Mastercard, American Express e cartões co-branded.
  • Métodos de pagamento alternativos (APMs): OXXO, KueskiPay, Aplazo, Daviplata, Nequi e mais.
  • Carteiras digitais: Apple Pay e PayPal.

Exibir em um modal

Ligar initPaymentWidget na sua DeunaSDK instância:

Swift
deunaSDK.initPaymentWidget(
  orderToken: "YOUR_ORDER_TOKEN",
  callbacks: PaymentWidgetCallbacks(
    onSuccess: { order in
      deunaSDK.close() // Close the payment widget modal
      // YOUR CODE HERE: Handle successful payment (e.g. navigate to confirmation screen)
    },
    onError: { error in
      // Error handling
      if error.type == .initializationFailed {
        deunaSDK.close() // Close the widget if initialization fails
        // YOUR CODE HERE: Handle initialization failure (e.g. show alert or fallback)
        return
      }
      if error.type == .paymentError {
        // YOUR CODE HERE: Handle payment processing failure (e.g. prompt user to retry)
      }
    },
    onClosed: { action in
      // Widget closed
      // action == .userAction (dismissed manually by customer) or .systemAction (closed via code)
      // YOUR CODE HERE: Handle modal dismissal
    },
    onCardBinDetected: { metadata in
      guard metadata != nil else { return }
      // YOUR CODE HERE: Handle card brand or BIN detection (e.g. apply discounts)
    },
    onInstallmentSelected: { installment in
      // YOUR CODE HERE: Handle installment plan selection
    },
    onPaymentProcessing: {
      // YOUR CODE HERE: Payment processing started (e.g. disable external buttons)
    },
    onEventDispatch: { event, payload in
      // YOUR CODE HERE: Track analytics event
    }
  ),
  userToken: "YOUR_USER_TOKEN", // optional
  styleFile: "YOUR_STYLE_FILE_UUID", // optional
  language: "en" // optional: "es", "en", "pt"
)

Referência de Parâmetros

ParâmetroTipoModalEmbutidoDescrição
orderTokenString✅✅Obrigatório. Token único para o pedido criado via API DEUNA.

Importante: Não defina um redirect_url na criação do pedido se desejar que o onSuccess execute no aplicativo.
callbacksPaymentWidgetCallbacks✅✅Obrigatório. Callbacks que escutam eventos do widget (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch).
userTokenString?✅✅Opcional. Token de portador DEUNA do cliente.

Importante: Para cartões salvos aparecerem, o email vinculado ao userToken deve corresponder ao billing_address.email da criação do pedido.
styleFileString?✅✅Opcional. UUID fornecido pela DEUNA para aplicar personalização de tema (cores, tipografia, logo).
paymentMethods[[String: Any]]?✅✅Opcional. Array que define um único método de pagamento para fluxo de formulários diretos (por exemplo, [["paymentMethod": "bnpl", "processors": ["kueski"]]]).
languageString?✅✅Opcional. Código de idioma ("es", "en", "pt"). Substitui a configuração padrão do lojista.
behaviorWidgetBehavior?✅✅Opcional. Personalização de fluxo, como WidgetBehavior(paymentMethods: ["flowType": "twoStep"]) para PayPal, ou Pagamentos Divididos WidgetBehavior(paymentMethods: ["creditCard": ["splitPayments": ["maxCards": 2]]]).
fraudCredentials[String: Any]?✅✅Opcional. Credenciais do provedor de fraude (ex. ["RISKIFIED": ["storeDomain": "yourdomain.com"]]).
domainString?✅✅Opcional. Substitui o host base padrão (https://pay.deuna.io).
hidePayButtonBool❌✅Opcional. Oculta o botão de pagamento integrado no modo incorporado quando seu aplicativo renderiza um botão nativo.

Experiências disponíveis#

ExperiênciaMétodoTipo de configuraçãoEntrada importante
Widget de pagamentoinitPaymentWidget(...)PaymentWidgetConfigurationorderToken, PaymentWidgetCallbacks
Cofre de PagamentosinitElements(...)ElementsWidgetConfigurationElementsCallbacks; types pode ser omitido
Clique para pagarinitElements(...)ElementsWidgetConfigurationtypes: [["name": ElementsWidget.clickToPay]]
Próxima AçãoinitNextAction(...)NextActionWidgetConfigurationToken para o pedido que requer outra ação
VoucherinitVoucher(...)VoucherWidgetConfigurationToken para o pedido de voucher

Incorpore um widget com SwiftUI#

No iOS 14 ou posterior, use DeunaWidget para renderizar a experiência de pagamento incorporada na sua hierarquia SwiftUI.

Swift
import DeunaSDK
import SwiftUI

struct EmbeddedCheckoutScreen: View {
  let deunaSDK: DeunaSDK
  let orderToken: String

  var body: some View {
    VStack {
      DeunaWidget(
        deunaSDK: deunaSDK,
        configuration: PaymentWidgetConfiguration(
          orderToken: orderToken,
          callbacks: PaymentWidgetCallbacks(
            onSuccess: { order in
              // Explicitly release widget resources to prevent memory leaks
              deunaSDK.dispose()
              // YOUR CODE HERE: Handle successful payment
            },
            onError: { error in
              if error.type == .paymentError {
                // YOUR CODE HERE: Handle payment error
              }
            },
            onEventDispatch: { event, payload in
              // YOUR CODE HERE: Track analytics event
            }
          ),
          userToken: nil,
          styleFile: nil
        )
      )
    }
  }
}

Incorporação com redimensionamento automático e tratamento de teclado

Por padrão, DeunaWidget preenche seu contêiner com uma altura fixa. Ao passar autoResizeConfig: AutoResizeConfig(initialHeight: 100), o widget alterna para o modo de redimensionamento automático: ele cresce e encolhe dinamicamente para corresponder à altura do conteúdo do WebView.

Quando incorporado dentro de um ScrollView, use ScrollViewFinder para capturar o UIScrollView subjacente e conectar onScrollNeeded para que campos em foco rolem automaticamente acima do teclado:

Swift
import DeunaSDK
import SwiftUI
import UIKit

struct MyCheckoutView: View {
  let deunaSDK: DeunaSDK
  let widgetConfig: DeunaWidgetConfiguration

  @State private var outerScrollView: UIScrollView?

  var body: some View {
    ScrollView {
      VStack(spacing: 0) {
        // Invisible helper capturing the underlying UIScrollView
        Color.clear.frame(height: 0)
          .background(ScrollViewFinder { sv in outerScrollView = sv })

        // Your content above the widget

        DeunaWidget(deunaSDK: deunaSDK, configuration: widgetConfig)
          .onScrollNeeded { overlap in
            guard let sv = outerScrollView else { return }
            let newOffset = CGPoint(x: 0, y: sv.contentOffset.y + overlap)
            UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseOut) {
              sv.setContentOffset(newOffset, animated: false)
            }
          }

        // Your content below the widget
      }
    }
  }
}

/// Traverses UIKit view hierarchy to capture the parent UIScrollView
struct ScrollViewFinder: UIViewRepresentable {
  let onFound: (UIScrollView) -> Void

  func makeUIView(context: Context) -> UIView {
    let view = UIView()
    view.isHidden = true
    DispatchQueue.main.async {
      var parent = view.superview
      while let p = parent {
        if let sv = p as? UIScrollView { onFound(sv); return }
        parent = p.superview
      }
    }
    return view
  }

  func updateUIView(_ uiView: UIView, context: Context) {}
}

Botão de pagamento personalizado (hidePayButton)

Se seu aplicativo renderiza seu próprio botão nativo fora do widget, passe hidePayButton: true e execute pagamentos manualmente usando isValid e submit:

Swift
let configuration = PaymentWidgetConfiguration(
  orderToken: orderToken,
  callbacks: callbacks,
  hidePayButton: true
)

// When the user taps your native pay button:
deunaSDK.isValid { isValid in
  guard isValid else {
    showValidationWarning()
    return
  }

  deunaSDK.submit { result in
    if result["status"] as? String == "error" {
      print("Submit failed:", result["message"] ?? "")
    }
  }
}
MétodoDescriçãoValor de Retorno
deunaSDK.isValid { valid in ... }Valida a entrada do usuário no formulário de pagamento ativo.Bool
deunaSDK.submit { result in ... }Envia o pagamento equivalente a clicar no botão do widget.[String: Any] (status: "success" ou status: "error")

Filtrar e configurar métodos de pagamento#

Fluxo de formulários diretos (paymentMethods)

As arquiteturas de checkout da DEUNA suportam a abertura direta em um formulário de pagamento individual — um padrão conhecido como fluxo de formulários.

Embora paymentMethods é um tipo de array, os motores de checkout atualmente suportam apenas um elemento nesta lista. Fornecer um único método de pagamento abre o widget diretamente no formulário desse método (por exemplo, Kueski Pay BNPL), ignorando o seletor de métodos.

Swift
deunaSDK.initPaymentWidget(
  orderToken: orderToken,
  callbacks: callbacks,
  paymentMethods: [
    [
      "paymentMethod": "bnpl",
      "processors": ["kueski"]
    ]
  ]
)

Resolução de prioridade de configuração

PrioridadeFonteComportamento
1 (Mais alta)paymentMethods em .initPaymentWidget()Fluxo de formulários diretos: Abre imediatamente no formulário do método de pagamento único especificado (ex.: Kueski), contornando o seletor de método.
2include_payment_options na criação do pedidoSeleção de múltiplos métodos: Exibe apenas os métodos de pagamento especificados durante a criação do pedido que estão ativos na sua conta.
3 (Fallback)Configuração no nível do merchant (/payment-methods)Seletor completo: Se omitido tanto na chamada do SDK quanto no payload do pedido, exibe todos os métodos de pagamento ativos configurados para sua conta de merchant.

Configurações do PayPal

Tipo de Fluxo (flowType)

Swift
deunaSDK.initPaymentWidget(
  orderToken: orderToken,
  behavior: WidgetBehavior(
    paymentMethods: [
      "flowType": "twoStep" // "twoStep" (summary first) or "singleStep" (direct)
    ]
  )
)

Compra Automática (express)

Quando os clientes já autorizaram pagamentos rápidos com o PayPal anteriormente, habilite o processamento imediato:

Swift
deunaSDK.initPaymentWidget(
  orderToken: orderToken,
  callbacks: callbacks,
  paymentMethods: [
    [
      "paymentMethod": "wallet",
      "processors": ["paypal_wallet"],
      "configuration": ["express": true]
    ]
  ]
)

Estilização dinâmica e atualização do pedido#

Personalize a aparência dinamicamente (setCustomStyle)

Atualize os estilos do widget dinamicamente (por exemplo, adaptando a marca após detecção do BIN do cartão):

Swift
deunaSDK.setCustomStyle(data: [
  "theme": [
    "colors": [
      "primaryTextColor": "#023047",
      "buttonPrimaryFill": "#FFB703",
      "buttonPrimaryText": "#000000"
    ]
  ]
])

Atualize totais do pedido (refetchOrder)

Ao oferecer promoções específicas de franquia (por exemplo, "20% de desconto com Mastercard"), escute onCardBinDetected, atualize o pedido no seu backend e notifique o widget:

Swift
callbacks: PaymentWidgetCallbacks(
  onCardBinDetected: { metadata in
    guard let brand = metadata?["cardBrand"] as? String, brand == "Mastercard" else { return }

    Task {
      await applyDiscountOnBackend(orderId, promoCode: "MASTERCARD_20")
      deunaSDK.refetchOrder { updatedOrder in
        print("Order refreshed with discount:", updatedOrder)
      }
    }
  }
)

Armazenamento de Pagamentos e Pagamento com Clique#

Payment Vault é um componente das soluções de pagamento da DEUNA que permite salvar cartões com segurança e pagar via Click to Pay sem processar checkouts regulares.

Exibir em um modal

Swift
deunaSDK.initElements(
  userToken: "<USER_TOKEN>", // optional if userInfo is provided
  userInfo: DeunaSDK.UserInfo(
    firstName: "Esteban", // optional if userToken is provided
    lastName: "Posada", // optional if userToken is provided
    email: "esteban@deuna.com" // required
  ),
  callbacks: ElementsCallbacks(
    onSuccess: { response in
      deunaSDK.close() // Close the Vault widget
      // YOUR CODE HERE: Handle card saved successfully
    },
    onError: { error in
      deunaSDK.close() // Close the Vault widget on error
      // YOUR CODE HERE: Handle error
    },
    onClosed: { action in
      // Widget closed: action == .userAction or .systemAction
      // YOUR CODE HERE: Handle widget dismissal
    },
    onEventDispatch: { type, response in
      // YOUR CODE HERE: Listen to widget events
    }
  ),
  orderToken: "YOUR_ORDER_TOKEN", // optional
  widgetExperience: ElementsWidgetExperience( // optional
    userExperience: ElementsWidgetExperience.UserExperience(
      showSavedCardFlow: true, // optional: show card saving toggle
      defaultCardFlow: true // optional: show toggle to save as default
    )
  )
)

Exibir incorporado (SwiftUI)

Swift
DeunaWidget(
  deunaSDK: deunaSDK,
  configuration: ElementsWidgetConfiguration(
    callbacks: ElementsCallbacks(
      onSuccess: { response in
        deunaSDK.dispose() // Explicitly release widget resources
        // YOUR CODE HERE: Handle success
      },
      onError: { error in
        // YOUR CODE HERE: Handle error
      },
      onEventDispatch: { type, response in
        // YOUR CODE HERE: Listen to widget events
      }
    ),
    userInfo: DeunaSDK.UserInfo(
      firstName: "Esteban",
      lastName: "Posada",
      email: "esteban@deuna.com"
    ),
    orderToken: "YOUR_ORDER_TOKEN",
    autoResizeConfig: AutoResizeConfig(initialHeight: 150)
  )
)

Clique para pagar

Swift
deunaSDK.initElements(
  userInfo: DeunaSDK.UserInfo( // mandatory for Click To Pay
    firstName: "Esteban",
    lastName: "Posada",
    email: "esteban@deuna.com"
  ),
  callbacks: ElementsCallbacks(
    onSuccess: { data in
      deunaSDK.close() // Close the widget
      // YOUR CODE HERE: Handle Click to Pay success
    },
    onError: { error in
      deunaSDK.close() // Close the widget
      // YOUR CODE HERE: Handle error
    },
    onClosed: { action in
      // YOUR CODE HERE: Handle widget dismissal
    },
    onEventDispatch: { type, data in
      // YOUR CODE HERE: Listen to widget events
    }
  ),
  types: [
    [
      "name": ElementsWidget.clickToPay // Pass this to render Click to Pay
    ]
  ]
)

Referência de Parâmetros

ParâmetroTipoModalEmbutidoDescrição
callbacksElementsCallbacks✅✅Obrigatório. Ouvintes de eventos (onSuccess, onError, onClosed, onEventDispatch).
userInfoDeunaSDK.UserInfo?✅✅Do cliente firstName, lastNamee email. Obrigatório para Click to Pay.
userTokenString?✅✅Opcional. Token de portador da DEUNA. Se passado, omita userInfo.
types[[String: Any]]?✅✅Opcional. Omita para renderizar a experiência padrão do Card Vault. Passe [["name": ElementsWidget.clickToPay]] para renderizar o Click to Pay.
orderTokenString?✅✅Opcional. Token único do pedido. Os detalhes do cliente podem ser extraídos de billing_address.
styleFileString?✅✅Opcional. UUID de personalização do tema.
widgetExperienceElementsWidgetExperience?✅✅Opcional. showSavedCardFlow (alternância de salvamento de cartão) e defaultCardFlow (alternância de salvar como padrão).
domainString?✅✅Opcional. Substitui o host (https://elements.deuna.com).
hidePayButtonBool❌✅Opcional. Oculta o botão quando incorporado. Use isValid e submit para botões personalizados.

Apple Pay nativo#

Verifique a configuração do merchant e a capacidade do dispositivo antes de renderizar um botão do Apple Pay.

Swift
let userInfo = DeunaSDK.UserInfo(email: "ada@example.com")
let params = GetWalletsAvailableParams(
  orderToken: "YOUR_ORDER_TOKEN",
  userInfo: userInfo
)

deunaSDK.getWalletsAvailable(params: params) { wallets, error in
  if let error = error {
    // YOUR CODE HERE: Handle wallet availability check error
    return
  }

  // Check if Apple Pay is available on this device and merchant account
  let isApplePayAvailable = wallets.contains(.applePay)
  // YOUR CODE HERE: Update Apple Pay button visibility in UI
}

Após a verificação de disponibilidade ter sucesso, inicie a sheet nativa do Apple Pay usando initElements:

Swift
deunaSDK.initElements(
  userInfo: userInfo,
  callbacks: ElementsCallbacks(
    onSuccess: { data in
      // YOUR CODE HERE: Handle Apple Pay authorization success
    },
    onError: { error in
      // YOUR CODE HERE: Handle Apple Pay error
    },
    onClosed: { action in
      // YOUR CODE HERE: Handle Apple Pay sheet dismissal
    }
  ),
  types: [
    ["name": "APPLE_PAY"]
  ],
  orderToken: "YOUR_ORDER_TOKEN"
)

A aplicação deve incluir a permissão do Apple Pay e um perfil de provisionamento contendo o identificador do comerciante. Consulte Apple Pague para a configuração completa.

Continue uma ação pendente#

Utilize o mesmo token de pedido quando a DEUNA informar que o pagamento requer um desafio ou redirecionamento 3DS suportado.

Swift
deunaSDK.initNextAction(
  orderToken: "YOUR_ORDER_TOKEN",
  callbacks: NextActionCallbacks(
    onSuccess: { order in
      deunaSDK.close()
      // YOUR CODE HERE: Handle 3DS or action completion
    },
    onError: { error in
      deunaSDK.close()
      // YOUR CODE HERE: Handle error
    },
    onClosed: { action in
      // YOUR CODE HERE: Handle modal dismissal
    }
  )
)

O SDK apresenta URLs externos suportados e retorna o controle para o widget. Utilize o estado do callback para a interface e o status de pagamento final da DEUNA para o fulfillment.

Abra um cupom#

Swift
deunaSDK.initVoucher(
  orderToken: "YOUR_ORDER_TOKEN",
  callbacks: VoucherCallbacks(
    onSuccess: { order in
      // YOUR CODE HERE: Handle voucher display
    },
    onError: { error in
      // YOUR CODE HERE: Handle error
    },
    onClosed: { action in
      // YOUR CODE HERE: Handle modal dismissal
    }
  )
)

As chamadas de retorno (callbacks) para vouchers seguem o mesmo ciclo de sucesso, erro, fechamento e envio de eventos como as outras experiências de pagamento.

Dados do dispositivo e fingerprinting antifraude#

O SDK iOS da DEUNA usa um arquitetura modular: ele não agrupa SDKs de fraude de terceiros por padrão. Adicione apenas o(s) provedor(es) específico(s) que você planeja usar. Se você não usar um provedor, não paga nenhuma penalidade de tamanho do app.

Provedores Suportados

ProvedorProduto SPMSubspec CocoaPodsParâmetros obrigatórios
MERCADOPAGODeunaSDKMercadoPagopod 'DeunaSDK/MercadoPago'(Nenhuma necessária - passe [:])
RISKIFIEDDeunaSDKRiskifiedpod 'DeunaSDK/Riskified'storeDomain
CYBERSOURCEDeunaSDKCybersourcepod 'DeunaSDK/Cybersource'orgId, merchantId (Opcional: fpServer)
SIGNIFYDDeunaSDKSignifydpod 'DeunaSDK/Signifyd'orgId (Opcional: fpServer)
KOUNTDeunaSDKKountpod 'DeunaSDK/Kount'merchantId, clientId, dataCollectorUrl, environment
SIFTDeunaSDKSiftpod 'DeunaSDK/Sift'accountId, beaconKey
ACCERTIFYDeunaSDKAccertifypod 'DeunaSDK/Accertify'Arquivos de configuração nos recursos do bundle do Xcode

Configuração de assets do bundle Accertify

A integração Accertify requer dois arquivos de configuração dentro do seu projeto Xcode. Certifique-se de que ambos os arquivos sejam adicionados ao seu target principal e incluídos em Copy Bundle Resources:

  1. server_keys_message_hosted.json: O arquivo de chaves de criptografia pública fornecido pela Accertify.
  2. InMobile.plist: Arquivo de lista de propriedades contendo os detalhes do seu merchant:
    • accountID (String): Seu GUID da conta
    • registrationURL (String): Endpoint de registro InMobile
    • logURL (String): Endpoint de log InMobile
    • serverKeyData (String): server_keys_message_hosted.json

Chamada direta via generateFraudId

Ligar deunaSDK.generateFraudId com os parâmetros para seus provedores contratados:

Swift
deunaSDK.generateFraudId(params: [
  "RISKIFIED": [
    "storeDomain": "yourdomain.com"
  ],
  "CYBERSOURCE": [
    "orgId": "your_org_id",
    "merchantId": "your_merchant_id"
  ],
  "MERCADOPAGO": [:],
  "ACCERTIFY": [:]
]) { fraudId in
  // fraudId is a Base64-encoded JSON string, or nil if providers failed or none configured
  guard let fraudId = fraudId else { return }
  print("Base64 Fraud ID:", fraudId)
}

Passe fraudCredentials diretamente para os widgets

Ao lançar widgets (initPaymentWidget, PaymentWidgetConfiguration, etc.), você pode passar sua configuração diretamente em fraudCredentials. O SDK gera o ID de fraude internamente no momento da compra:

Swift
deunaSDK.initPaymentWidget(
  orderToken: orderToken,
  callbacks: callbacks,
  fraudCredentials: [
    "RISKIFIED": [
      "storeDomain": "yourdomain.com"
    ],
    "CYBERSOURCE": [
      "orgId": "your_org_id",
      "merchantId": "your_merchant_id"
    ],
    "MERCADOPAGO": [:]
  ]
)

Notas de comportamento

  • Sem inchaço e seguro contra falhas: Se um provedor estiver incluído no dicionário de solicitação, mas seu framework ou subspec não foi vinculado, o SDK o ignora com segurança sem lançar exceção ou causar crash.
  • Execução paralela: Os provedores solicitados são perfilados simultaneamente em threads em segundo plano.
  • Comportamento de fallback: Se nenhum provedor válido estiver configurado ou disponível no dispositivo, o handler de conclusão recebe nil.

Referência do ciclo de vida e callbacks#

Callback / MétodoModalEmbutidoDescrição
onSuccess✅✅Operação de pagamento ou cofre de cartão concluída com sucesso. Recebe payload de pedido ou credencial. Chame deunaSDK.close() (modal) ou deunaSDK.dispose() (embedded).
onError✅✅Erro ocorrido durante a inicialização ou processamento do pagamento. Recebe PaymentsError ou ElementsError.
onClosed✅❌tipado. CloseAction.userAction (fechado manualmente) ou CloseAction.systemAction (fechado pelo cliente) ou close()).
onPaymentProcessing✅✅Acionado quando o cliente toca em pagar e o processamento do pagamento começa. Use para desabilitar botões e mostrar spinners de progresso.
onCardBinDetected✅✅Acionado quando um BIN de cartão é detectado ou limpo (nil Acionado quando um BIN de cartão é detectado ou limpo (retorna
onInstallmentSelected✅✅Acionado quando o cliente seleciona parcelas diferidas (nil Acionado quando o cliente seleciona um plano de parcelamento (retorna
onEventDispatch✅✅Acionado quando o cliente solicita o download de voucher ou recibo. CheckoutEvent ou ElementsEvent ocorrências com payloads de dados.
close()✅❌Descarta a apresentação modal ativa enquanto mantém a instância do SDK.
dispose()❌✅Libera o controlador embutido e o WebView quando a hierarquia de visualização é desmontada.

para registro personalizado e análises.onError)

Inspecione error.type para distinguir falhas de inicialização de recusas de processamento:

Swift
onError: { error in
  switch error.type {
  case .initializationFailed:
    // Widget failed to load; close presentation and notify user
    deunaSDK.close()
    showToast("Payment service temporarily unavailable")
  case .paymentError:
    // Transaction declined or processor error
    showRetry(error)
  @unknown default:
    showGenericError(error)
  }
}

Exemplos e código-fonte oficiais#

Veja WalletsScreen.swift para o Apple Pay nativo e EmbeddedScreen.swift para o ciclo de vida do SwiftUI.

Nesta seção