Passa al contenuto principale
In questa pagina

Requisiti#

Rivedi i requisiti per integrare l'SDK iOS di DEUNA:

  • Versione Swift: 5.8 o superiore
  • Versione Xcode: 16.0 o superiore
  • Target di distribuzione: iOS 13.0 o superiore per le esperienze modali core; iOS 14.0 o superiore per SwiftUI incorporato DeunaWidget
  • Credenziali DEUNA: Account attivo e credenziali valide (contatta support@deuna.com se riscontri ritardi nell'ottenimento delle credenziali)

Installazione#

Ci sono due metodi supportati per installare l'SDK iOS di DEUNA:

Swift Package Manager (Consigliato)

  1. In Xcode, vai su File → Aggiungi Dipendenze Pacchetto...
  2. Nella barra di ricerca, inserisci l'URL del repository:
    Plain text
    https://github.com/deuna-developers/deuna-sdk-ios
  3. Fissa la regola di dipendenza del pacchetto alla versione 2.12.6 (o superiore).
  4. Quando appare la finestra di dialogo Scegli Prodotti Pacchetto :
    • Seleziona DeunaSDK e collegalo al target della tua applicazione.
    • Imposta tutti gli altri prodotti (DeunaSDKCybersource, DeunaSDKKount, DeunaSDKRiskified, DeunaSDKSift, DeunaSDKSignifyd, DeunaSDKMercadoPago, DeunaSDKAccertify) su Nessuno a meno che la tua integrazione non utilizzi quel specifico provider anti-frode.

Cacaopoli

Se il tuo progetto iOS utilizza CocoaPods:

  1. Specifica il target di distribuzione minimo e aggiungi DeunaSDK a te 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. Esegui:
Shell
pod install
  1. Disabilita Sandbox Script Utente: In Xcode, vai alle Impostazioni di Compilazionedel tuo target, cerca User Script Sandboxing (ENABLE_USER_SCRIPT_SANDBOXING) e impostalo su No..

Permessi Richiesti per Download Voucher

Inizializzazione#

Swift
import DeunaSDK

Puoi inizializzare l'SDK in due modi a seconda dell'architettura della tua app:

Istanza condivisa globale

Inizializza una volta durante l'avvio dell'app (ad esempio, nel tuo AppDelegate o App inizializzatore) e accedi ovunque tramite DeunaSDK.shared:

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

let deunaSDK = DeunaSDK.shared

Coordinatore o istanza schermata

Crea e mantieni un'istanza per una specifica schermata o coordinatore:

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

Widget di pagamento aperto#

Il Payment Widget offre ai clienti più metodi di pagamento:

  • Carte di credito e di debito: Visa, Mastercard, American Express e carte co-branded.
  • Metodi di pagamento alternativi (APM): OXXO, KueskiPay, Aplazo, Daviplata, Nequi e altri.
  • Portafogli digitali: Apple Pay e PayPal.

Visualizza in una modale

Chiamata initPaymentWidget sulla tua istanza DeunaSDK :

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"
)

Riferimento parametri

ParametroTipoModaleIncorporatoDescrizione
orderTokenString✅✅Obbligatorio. Token univoco per l'ordine creato tramite API DEUNA.

Importante: Non definire un redirect_url nella creazione dell'ordine se vuoi che onSuccess venga eseguito in-app.
callbacksPaymentWidgetCallbacks✅✅Obbligatorio. Callback che ascoltano gli eventi del widget (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch).
userTokenString?✅✅Facoltativo. Token bearer DEUNA del cliente.

Importante: Affinché le carte salvate appaiano, l'email collegata a userToken devono corrispondere al billing_address.email della creazione dell'ordine.
styleFileString?✅✅Facoltativo. UUID fornito da DEUNA per applicare il branding del tema personalizzato (colori, tipografia, logo).
paymentMethods[[String: Any]]?✅✅Facoltativo. Array che definisce un singolo metodo di pagamento per il flusso di moduli diretti (es. [["paymentMethod": "bnpl", "processors": ["kueski"]]]).
languageString?✅✅Facoltativo. Codice lingua ("es", "en", "pt"). Sostituisce la configurazione predefinita del merchant.
behaviorWidgetBehavior?✅✅Facoltativo. Personalizzazione del flusso, come WidgetBehavior(paymentMethods: ["flowType": "twoStep"]) per PayPal, o Split Payments WidgetBehavior(paymentMethods: ["creditCard": ["splitPayments": ["maxCards": 2]]]).
fraudCredentials[String: Any]?✅✅Facoltativo. Credenziali del provider antifrode (es. ["RISKIFIED": ["storeDomain": "yourdomain.com"]]).
domainString?✅✅Facoltativo. Sostituisce l'host base predefinito (https://pay.deuna.io).
hidePayButtonBool❌✅Facoltativo. Nasconde il pulsante di pagamento integrato in modalità embedded quando la tua applicazione renderizza un pulsante nativo.

Esperienze disponibili#

EsperienzaMetodoTipo di configurazioneInformazioni di input essenziali
Widget di pagamentoinitPaymentWidget(...)PaymentWidgetConfigurationorderToken, PaymentWidgetCallbacks
Vault di pagamentoinitElements(...)ElementsWidgetConfigurationElementsCallbacks; types Può essere omesso
Clicca per pagareinitElements(...)ElementsWidgetConfigurationtypes: [["name": ElementsWidget.clickToPay]]
Prossimo passoinitNextAction(...)NextActionWidgetConfigurationToken per l'ordine che richiede un'altra azione
VoucherinitVoucher(...)VoucherWidgetConfigurationToken per l'ordine del buono

Integrare un widget con SwiftUI#

Su iOS 14 o successivo, usa DeunaWidget per rendere l'esperienza di pagamento incorporata nella tua gerarchia 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
        )
      )
    }
  }
}

Incorporamento con ridimensionamento automatico e gestione tastiera

Per impostazione predefinita, DeunaWidget riempie il suo contenitore a un'altezza fissa. Quando passi autoResizeConfig: AutoResizeConfig(initialHeight: 100), il widget passa alla modalità di ridimensionamento automatico: cresce e si riduce dinamicamente per adattarsi all'altezza del contenuto WebView.

Quando incorporato all'interno di un ScrollView, usa ScrollViewFinder per catturare il sottostante UIScrollView e collegare onScrollNeeded in modo che i campi focalizzati scorrano automaticamente sopra la tastiera:

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) {}
}

Pulsante di pagamento personalizzato (hidePayButton)

Se la tua applicazione rende il proprio pulsante nativo al di fuori del widget, passa hidePayButton: true ed esegui i pagamenti 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"] ?? "")
    }
  }
}
MetodoDescrizioneValore di ritorno
deunaSDK.isValid { valid in ... }Convalida l'input dell'utente nel modulo di pagamento attivo.Bool
deunaSDK.submit { result in ... }Invia il pagamento equivalente al clic sul pulsante del widget.[String: Any] (status: "success" o status: "error")

Filtra e configura i metodi di pagamento#

Flusso dei moduli diretti (paymentMethods)

Le architetture di checkout DEUNA supportano l'avvio diretto in un singolo modulo di pagamento, uno schema noto come flusso dei moduli.

Sebbene paymentMethods è un tipo array, i motori di checkout attualmente supportano solo un elemento in questa lista. Fornire un singolo metodo di pagamento apre il widget direttamente nel modulo di quel metodo (ad esempio Kueski Pay BNPL), bypassando il selettore dei metodi.

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

Risoluzione della priorità di configurazione

PrioritàFonteComportamento
1 (Più alta)paymentMethods in .initPaymentWidget()Flusso dei moduli diretti: Si apre immediatamente nel modulo del singolo metodo di pagamento specificato (ad esempio, Kueski), saltando il selettore dei metodi.
2include_payment_options nella creazione dell'ordineSelezione multi-metodo: Visualizza solo i metodi di pagamento specificati durante la creazione dell'ordine che sono attivi sul tuo account.
3 (Fallback)Configurazione a livello merchant (/payment-methods)Selettore completo: Se omesso sia nella chiamata SDK che nel payload dell'ordine, visualizza tutti i metodi di pagamento attivi configurati per il tuo account merchant.

Configurazioni PayPal

Tipo di flusso (flowType)

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

Acquisto automatico (express)

Quando i clienti hanno precedentemente autorizzato pagamenti rapidi con PayPal, abilita l'elaborazione immediata:

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

Stile dinamico e aggiornamento dell'ordine#

Personalizza dinamicamente l'aspetto (setCustomStyle)

Aggiorna gli stili del widget dinamicamente (ad esempio adattando il branding al rilevamento del BIN della carta):

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

Aggiorna i totali dell'ordine (refetchOrder)

Quando offri promozioni specifiche per franchising (ad esempio, "20% di sconto con Mastercard"), ascolta onCardBinDetected, aggiorna l'ordine sul tuo backend e notifica il 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)
      }
    }
  }
)

Archiviazione dei pagamenti e Click to Pay#

Payment Vault è un componente delle soluzioni di pagamento DEUNA che consente di salvare le carte in modo sicuro e di pagare tramite Click to Pay senza elaborare checkout regolari.

Visualizza in una modale

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
    )
  )
)

Visualizza incorporato (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)
  )
)

Clicca per pagare

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
    ]
  ]
)

Riferimento parametri

ParametroTipoModaleIncorporatoDescrizione
callbacksElementsCallbacks✅✅Obbligatorio. I listener di eventi (onSuccess, onError, onClosed, onEventDispatch).
userInfoDeunaSDK.UserInfo?✅✅Cliente firstName, lastNamee email. Obbligatorio per Click to Pay.
userTokenString?✅✅Facoltativo. Token bearer DEUNA. Se fornito, ometti userInfo.
types[[String: Any]]?✅✅Facoltativo. Ometti per visualizzare l'esperienza Card Vault predefinita. Fornisci [["name": ElementsWidget.clickToPay]] per visualizzare Click to Pay.
orderTokenString?✅✅Facoltativo. Token ordine univoco. I dettagli del cliente possono essere estratti da billing_address.
styleFileString?✅✅Facoltativo. UUID per la personalizzazione del tema.
widgetExperienceElementsWidgetExperience?✅✅Facoltativo. showSavedCardFlow (interruttore per il salvataggio della carta) e defaultCardFlow (interruttore per salvare come predefinito).
domainString?✅✅Facoltativo. Sostituisce l'host (https://elements.deuna.com).
hidePayButtonBool❌✅Facoltativo. Nasconde il pulsante quando incorporato. Usa isValid e submit per pulsanti personalizzati.

Apple Pay nativo#

Controlla la configurazione del merchant e la capacità del dispositivo prima di rendere un pulsante 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
}

Dopo che la disponibilità ha successo, avvia il foglio nativo 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"
)

L'applicazione deve includere l'entitlement di Apple Pay e un profilo di provisioning contenente l'identificatore del commerciante. Fare riferimento a Paga di Apple Per la configurazione completa.

Continuare un'azione in sospeso#

Utilizzare lo stesso token d'ordine quando DEUNA segnala che il pagamento richiede una sfida o reindirizzamento 3DS supportato.

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
    }
  )
)

L'SDK presenta gli URL esterni supportati e ritorna il controllo al widget. Utilizzare lo stato del callback per l'interfaccia e lo stato finale del pagamento DEUNA per l'evasione.

Aprire un buono#

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
    }
  )
)

Le callback per voucher seguono lo stesso ciclo di vita di successo, errore, chiusura ed invio di eventi come le altre esperienze di pagamento.

Dati del dispositivo antifrode e fingerprinting#

L'SDK iOS di DEUNA utilizza un modulare: non include gli SDK antifrode di terze parti per impostazione predefinita. Aggiungere solo il/i provider specifico/i che si intende utilizzare. Se non usi un provider, non paghi alcuna penalità per le dimensioni dell'app.

Provider supportati

FornitoreProdotto SPMSubspec CocoaPodsParametri obbligatori
MERCADOPAGODeunaSDKMercadoPagopod 'DeunaSDK/MercadoPago'(Nessuna richiesta - passa [:])
RISKIFIEDDeunaSDKRiskifiedpod 'DeunaSDK/Riskified'storeDomain
CYBERSOURCEDeunaSDKCybersourcepod 'DeunaSDK/Cybersource'orgId, merchantId (Opzionale: fpServer)
SIGNIFYDDeunaSDKSignifydpod 'DeunaSDK/Signifyd'orgId (Opzionale: fpServer)
KOUNTDeunaSDKKountpod 'DeunaSDK/Kount'merchantId, clientId, dataCollectorUrl, environment
SIFTDeunaSDKSiftpod 'DeunaSDK/Sift'accountId, beaconKey
ACCERTIFYDeunaSDKAccertifypod 'DeunaSDK/Accertify'File di configurazione nelle risorse del bundle Xcode

Configurazione degli asset del bundle Accertify

L'integrazione Accertify richiede due file di configurazione all'interno del tuo progetto Xcode. Assicurati che entrambi i file siano aggiunti al tuo target principale e inclusi sotto Copy Bundle Resources:

  1. server_keys_message_hosted.json: Il file delle chiavi di crittografia pubbliche fornito da Accertify.
  2. InMobile.plist: File property list contenente i dettagli del tuo merchant:
    • accountID (String): Il tuo GUID dell'account
    • registrationURL (String): Endpoint di registrazione InMobile
    • logURL (String): Endpoint di log InMobile
    • serverKeyData (String): server_keys_message_hosted.json

Chiamata diretta tramite generateFraudId

Chiamata deunaSDK.generateFraudId con i parametri per i tuoi provider contrattuali:

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)
}

Passa fraudCredentials direttamente ai widget

Quando lanci i widget (initPaymentWidget, PaymentWidgetConfiguration, ecc.), puoi passare la tua configurazione direttamente in fraudCredentials. L'SDK genera l'ID di frode internamente al momento dell'acquisto:

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

Note sul comportamento

  • Zero-bloat & Crash-safe: Se un provider è incluso nella richiesta del dizionario ma il suo framework o subspec non è stato collegato, l'SDK lo ignora in modo sicuro senza generare eccezioni o crash.
  • Esecuzione parallela: I provider richiesti profilano contemporaneamente su thread in background.
  • Comportamento di fallback: Se non sono configurati o disponibili sul dispositivo provider validi, il gestore di completamento riceve nil.

Riferimento a callback e ciclo di vita#

Callback / MetodoModaleIncorporatoDescrizione
onSuccess✅✅Operazione di pagamento o archiviazione carta completata con successo. Riceve il payload dell'ordine o delle credenziali. Chiama deunaSDK.close() (modal) o deunaSDK.dispose() (incorporato).
onError✅✅Errore verificatosi durante l'inizializzazione o l'elaborazione del pagamento. Riceve un PaymentsError o ElementsError.
onClosed✅❌tipizzato. CloseAction.userAction (chiuso manualmente) o CloseAction.systemAction (chiuso dal cliente) o close()).
onPaymentProcessing✅✅Attivato quando il cliente tocca paga e inizia l'elaborazione del pagamento. Usalo per disabilitare i pulsanti e mostrare gli indicatori di progresso.
onCardBinDetected✅✅Attivato quando viene rilevato o cancellato un BIN di carta (nil Attivato quando viene rilevato o cancellato un BIN di carta (restituisce
onInstallmentSelected✅✅Attivato quando il cliente seleziona rate differite (nil Attivato quando il cliente seleziona un piano di rateizzazione (restituisce
onEventDispatch✅✅Attivato quando il cliente richiede il download del voucher o della ricevuta. CheckoutEvent o ElementsEvent occorrenze con payload di dati.
close()✅❌Chiude la presentazione modale attiva mantenendo l'istanza dell'SDK.
dispose()❌✅Rilascia il controller incorporato e la WebView quando la gerarchia delle view viene smontata.

per registrazione personalizzata e analisi.onError)

Ispeziona error.type per distinguere gli errori di inizializzazione dai rifiuti di elaborazione:

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)
  }
}

Esempi e codice sorgente ufficiali#

Vedi WalletsScreen.swift per Apple Pay nativo e EmbeddedScreen.swift per il ciclo di vita di SwiftUI.

In questa sezione