SDK iOS
Instale o SDK iOS da DEUNA e integre os fluxos de pagamento modal, embutido, carteira e próximo passo.
Nesta página
- Requisitos
- Instalação
- Inicialização
- Abrir widget de pagamento
- Experiências disponíveis
- Incorpore um widget com SwiftUI
- Filtrar e configurar métodos de pagamento
- Estilização dinâmica e atualização do pedido
- Armazenamento de Pagamentos e Pagamento com Clique
- Apple Pay nativo
- Continue uma ação pendente
- Abra um cupom
- Dados do dispositivo e fingerprinting antifraude
- Referência do ciclo de vida e callbacks
- Exemplos e código-fonte oficiais
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)
- No Xcode, navegue até Arquivo → Adicionar Dependências de Pacote...
- Na barra de pesquisa, insira a URL do repositório:
Plain text
https://github.com/deuna-developers/deuna-sdk-ios - Fixar a regra de dependência do pacote para a versão
2.12.6(ou superior). - Quando o Escolher Produtos do Pacote aparecer:
- Selecione
DeunaSDKe 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.
- Selecione
CocoaPods
Se seu projeto iOS usa CocoaPods:
- Especifique o target de implantação mínimo e adicione
DeunaSDKpara o seuPodfile:
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- Execute:
pod install- 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#
import DeunaSDKVocê 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:
DeunaSDK.initialize(
environment: .sandbox, // .sandbox or .production
publicApiKey: "YOUR_PUBLIC_API_KEY"
)
let deunaSDK = DeunaSDK.sharedCoordenador ou instância de tela
Crie e mantenha uma instância para uma tela ou coordenador específico:
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:
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âmetro | Tipo | Modal | Embutido | Descrição |
|---|---|---|---|---|
orderToken | String | ✅ | ✅ | 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. |
callbacks | PaymentWidgetCallbacks | ✅ | ✅ | Obrigatório. Callbacks que escutam eventos do widget (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch). |
userToken | String? | ✅ | ✅ | 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. |
styleFile | String? | ✅ | ✅ | 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"]]]). |
language | String? | ✅ | ✅ | Opcional. Código de idioma ("es", "en", "pt"). Substitui a configuração padrão do lojista. |
behavior | WidgetBehavior? | ✅ | ✅ | 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"]]). |
domain | String? | ✅ | ✅ | Opcional. Substitui o host base padrão (https://pay.deuna.io). |
hidePayButton | Bool | ❌ | ✅ | Opcional. Oculta o botão de pagamento integrado no modo incorporado quando seu aplicativo renderiza um botão nativo. |
Experiências disponíveis#
| Experiência | Método | Tipo de configuração | Entrada importante |
|---|---|---|---|
| Widget de pagamento | initPaymentWidget(...) | PaymentWidgetConfiguration | orderToken, PaymentWidgetCallbacks |
| Cofre de Pagamentos | initElements(...) | ElementsWidgetConfiguration | ElementsCallbacks; types pode ser omitido |
| Clique para pagar | initElements(...) | ElementsWidgetConfiguration | types: [["name": ElementsWidget.clickToPay]] |
| Próxima Ação | initNextAction(...) | NextActionWidgetConfiguration | Token para o pedido que requer outra ação |
| Voucher | initVoucher(...) | VoucherWidgetConfiguration | Token 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.
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:
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:
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étodo | Descrição | Valor 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.
deunaSDK.initPaymentWidget(
orderToken: orderToken,
callbacks: callbacks,
paymentMethods: [
[
"paymentMethod": "bnpl",
"processors": ["kueski"]
]
]
)Resolução de prioridade de configuração
| Prioridade | Fonte | Comportamento |
|---|---|---|
| 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. |
| 2 | include_payment_options na criação do pedido | Seleçã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)
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:
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):
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:
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
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)
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
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âmetro | Tipo | Modal | Embutido | Descrição |
|---|---|---|---|---|
callbacks | ElementsCallbacks | ✅ | ✅ | Obrigatório. Ouvintes de eventos (onSuccess, onError, onClosed, onEventDispatch). |
userInfo | DeunaSDK.UserInfo? | ✅ | ✅ | Do cliente firstName, lastNamee email. Obrigatório para Click to Pay. |
userToken | String? | ✅ | ✅ | 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. |
orderToken | String? | ✅ | ✅ | Opcional. Token único do pedido. Os detalhes do cliente podem ser extraídos de billing_address. |
styleFile | String? | ✅ | ✅ | Opcional. UUID de personalização do tema. |
widgetExperience | ElementsWidgetExperience? | ✅ | ✅ | Opcional. showSavedCardFlow (alternância de salvamento de cartão) e defaultCardFlow (alternância de salvar como padrão). |
domain | String? | ✅ | ✅ | Opcional. Substitui o host (https://elements.deuna.com). |
hidePayButton | Bool | ❌ | ✅ | 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.
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:
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.
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#
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
| Provedor | Produto SPM | Subspec CocoaPods | Parâmetros obrigatórios |
|---|---|---|---|
MERCADOPAGO | DeunaSDKMercadoPago | pod 'DeunaSDK/MercadoPago' | (Nenhuma necessária - passe [:]) |
RISKIFIED | DeunaSDKRiskified | pod 'DeunaSDK/Riskified' | storeDomain |
CYBERSOURCE | DeunaSDKCybersource | pod 'DeunaSDK/Cybersource' | orgId, merchantId (Opcional: fpServer) |
SIGNIFYD | DeunaSDKSignifyd | pod 'DeunaSDK/Signifyd' | orgId (Opcional: fpServer) |
KOUNT | DeunaSDKKount | pod 'DeunaSDK/Kount' | merchantId, clientId, dataCollectorUrl, environment |
SIFT | DeunaSDKSift | pod 'DeunaSDK/Sift' | accountId, beaconKey |
ACCERTIFY | DeunaSDKAccertify | pod '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:
server_keys_message_hosted.json: O arquivo de chaves de criptografia pública fornecido pela Accertify.InMobile.plist: Arquivo de lista de propriedades contendo os detalhes do seu merchant:accountID(String): Seu GUID da contaregistrationURL(String): Endpoint de registro InMobilelogURL(String): Endpoint de log InMobileserverKeyData(String):server_keys_message_hosted.json
Chamada direta via generateFraudId
Ligar deunaSDK.generateFraudId com os parâmetros para seus provedores contratados:
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:
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étodo | Modal | Embutido | Descriçã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:
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.