Aller au contenu principal
Sur cette page

Exigences#

Consultez les exigences pour intégrer le SDK iOS de DEUNA :

  • Version Swift: 5.8 ou supérieure
  • Version Xcode: 16.0 ou supérieure
  • Cible de déploiement: iOS 13.0 ou supérieur pour les expériences modales principales ; iOS 14.0 ou supérieur pour SwiftUI intégré DeunaWidget
  • Identifiants DEUNA: Compte actif et identifiants valides (contactez support@deuna.com si vous rencontrez des délais pour obtenir des identifiants)

Installation#

Il existe deux méthodes prises en charge pour installer le SDK iOS DEUNA :

Swift Package Manager (Recommandé)

  1. Dans Xcode, accédez à Fichier → Ajouter des dépendances de paquet...
  2. Dans la barre de recherche, saisissez l'URL du dépôt :
    Plain text
    https://github.com/deuna-developers/deuna-sdk-ios
  3. Épinglez la règle de dépendance du paquet à la version 2.12.6 (ou supérieure).
  4. Lorsque la boîte de dialogue Choisir les produits du paquet apparaît :
    • Sélectionnez DeunaSDK et liez-le à la cible de votre application.
    • Définissez tous les autres produits (DeunaSDKCybersource, DeunaSDKKount, DeunaSDKRiskified, DeunaSDKSift, DeunaSDKSignifyd, DeunaSDKMercadoPago, DeunaSDKAccertify) sur Aucun sauf si votre intégration utilise ce fournisseur anti-fraude spécifique.

Poissons de cacao

Si votre projet iOS utilise CocoaPods :

  1. Spécifiez la cible de déploiement minimale et ajoutez DeunaSDK à votre Podfile:
Fichier de pocheRuby
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. Exécutez :
Shell
pod install
  1. Désactiver le bac à sable des scripts utilisateur: Dans Xcode, accédez aux Paramètres de compilationde votre cible, recherchez User Script Sandboxing (ENABLE_USER_SCRIPT_SANDBOXING), et définissez-le sur Non.

Permissions requises pour les téléchargements de bons

Initialisation#

Swift
import DeunaSDK

Vous pouvez initialiser le SDK de deux manières selon l'architecture de votre application :

Instance partagée globale

Initialisez une fois au démarrage de l'application (par exemple, dans votre AppDelegate ou App initialiseur), et accédez-y partout via DeunaSDK.shared:

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

let deunaSDK = DeunaSDK.shared

Coordinateur ou instance d'écran

Créez et conservez une instance pour un écran ou coordinateur spécifique :

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

Ouvrir le widget de paiement#

Le Widget de Paiement propose plusieurs méthodes de paiement aux clients :

  • Cartes de crédit et de débit: Visa, Mastercard, American Express et les cartes co-brandées.
  • Méthodes de paiement alternatives (APM): OXXO, KueskiPay, Aplazo, Daviplata, Nequi, et plus.
  • Portefeuilles numériques: Apple Pay et PayPal.

Afficher dans une modale

Appeler initPaymentWidget sur votre instance 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"
)

Référence des paramètres

ParamètreTapezModalIntégréDescriptif
orderTokenString✅✅Obligatoire. Jeton unique pour la commande créée via l'API DEUNA.

Important: Ne définissez pas de redirect_url lors de la création de commande si vous souhaitez que onSuccess s'exécute dans l'application.
callbacksPaymentWidgetCallbacks✅✅Obligatoire. Callbacks écoutant les événements du widget (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch).
userTokenString?✅✅Facultatif. Jeton porteur DEUNA du client.

Important: Pour que les cartes enregistrées apparaissent, l'email lié au userToken doit correspondre à billing_address.email de la création de commande.
styleFileString?✅✅Facultatif. UUID fourni par DEUNA pour appliquer une personnalisation de thème (couleurs, typographie, logo).
paymentMethods[[String: Any]]?✅✅Facultatif. Tableau définissant une seule méthode de paiement pour le flux de formulaires directs (par ex. [["paymentMethod": "bnpl", "processors": ["kueski"]]]).
languageString?✅✅Facultatif. Code de langue ("es", "en", "pt"). Remplace la configuration par défaut du marchand.
behaviorWidgetBehavior?✅✅Facultatif. Personnalisation du flux, comme WidgetBehavior(paymentMethods: ["flowType": "twoStep"]) pour PayPal, ou Paiements fractionnés WidgetBehavior(paymentMethods: ["creditCard": ["splitPayments": ["maxCards": 2]]]).
fraudCredentials[String: Any]?✅✅Facultatif. Identifiants du fournisseur de fraude (par ex. ["RISKIFIED": ["storeDomain": "yourdomain.com"]]).
domainString?✅✅Facultatif. Remplace l'hôte de base par défaut (https://pay.deuna.io).
hidePayButtonBool❌✅Facultatif. Masque le bouton de paiement intégré en mode intégré lorsque votre application affiche un bouton natif.

Expériences disponibles#

ExpérienceMéthodeType de configurationInformations importantes
Widget de paiementinitPaymentWidget(...)PaymentWidgetConfigurationorderToken, PaymentWidgetCallbacks
Coffre-fort de paiementinitElements(...)ElementsWidgetConfigurationElementsCallbacks; types Peut être omis
Cliquez pour payerinitElements(...)ElementsWidgetConfigurationtypes: [["name": ElementsWidget.clickToPay]]
Prochaine étapeinitNextAction(...)NextActionWidgetConfigurationJeton pour la commande nécessitant une autre action
Bon de réductioninitVoucher(...)VoucherWidgetConfigurationJeton pour la commande de la carte cadeau

Intégrer un widget avec SwiftUI#

Sur iOS 14 ou ultérieur, utilisez DeunaWidget pour afficher l'expérience de paiement intégrée dans votre hiérarchie 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
        )
      )
    }
  }
}

Intégration avec redimensionnement automatique et gestion du clavier

Par défaut, DeunaWidget remplit son conteneur à une hauteur fixe. Lors du passage de autoResizeConfig: AutoResizeConfig(initialHeight: 100), le widget passe en mode de redimensionnement automatique : il grandit et rétrécit dynamiquement pour correspondre à la hauteur du contenu WebView.

Lorsqu'il est intégré à l'intérieur d'un ScrollView, utilisez ScrollViewFinder pour capturer le UIScrollView sous-jacent et connecter onScrollNeeded afin que les champs ciblés défilent automatiquement au-dessus du clavier :

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

Bouton de paiement personnalisé (hidePayButton)

Si votre application affiche son propre bouton natif en dehors du widget, passez hidePayButton: true et exécutez les paiements manuellement en utilisant isValid et 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éthodeDescriptifValeur de retour
deunaSDK.isValid { valid in ... }Valide la saisie de l'utilisateur dans le formulaire de paiement actif.Bool
deunaSDK.submit { result in ... }Soumet le paiement équivalent à un clic sur le bouton du widget.[String: Any] (status: "success" ou status: "error")

Filtrer et configurer les méthodes de paiement#

Flux de formulaires directs (paymentMethods)

Les architectures de paiement DEUNA prennent en charge le lancement direct dans un formulaire de paiement individuel — un modèle connu sous le nom de flux de formulaires.

Bien que paymentMethods est un type tableau, les moteurs de paiement prennent actuellement en charge un seul élément dans cette liste. Fournir un seul moyen de paiement ouvre le widget directement dans le formulaire de cette méthode (par ex. Kueski Pay BNPL), en contournant le sélecteur de méthode.

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

Résolution de priorité de configuration

PrioritéSourceComportement
1 (Priorité la plus élevée)paymentMethods dans .initPaymentWidget()Flux de formulaires directs : Ouvre immédiatement le formulaire du moyen de paiement unique spécifié (par exemple, Kueski), en contournant le sélecteur de méthode.
2include_payment_options dans la création de commandeSélection multi-méthodes : Affiche uniquement les moyens de paiement spécifiés lors de la création de la commande qui sont actifs sur votre compte.
3 (Fallback)Configuration au niveau marchand (/payment-methods)Sélecteur complet : Si omis à la fois dans l'appel SDK et dans le payload de commande, affiche tous les moyens de paiement actifs configurés pour votre compte marchand.

Configurations PayPal

Type de flux (flowType)

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

Achat automatique (express)

Lorsque les clients ont précédemment autorisé des paiements rapides avec PayPal, activez le traitement immédiat :

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

Style dynamique et rafraîchissement de commande#

Personnalisez dynamiquement l'apparence (setCustomStyle)

Mettez à jour les styles du widget dynamiquement (par ex. adaptation de la marque lors de la détection du BIN de carte) :

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

Rafraîchissez les totaux de commande (refetchOrder)

Lorsque vous proposez des promotions spécifiques à une franchise (par ex., "20 % de réduction avec Mastercard"), écoutez onCardBinDetected, mettez à jour la commande sur votre backend, et notifiez le 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)
      }
    }
  }
)

Coffre-fort de paiement et Paiement en un clic#

Payment Vault est un composant des solutions de paiement DEUNA qui permet de sauvegarder des cartes de manière sécurisée et de payer via Click to Pay sans traiter les paiements classiques.

Afficher dans une 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
    )
  )
)

Afficher intégré (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)
  )
)

Cliquez pour payer

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

Référence des paramètres

ParamètreTapezModalIntégréDescriptif
callbacksElementsCallbacks✅✅Obligatoire. Écouteurs d'événements (onSuccess, onError, onClosed, onEventDispatch).
userInfoDeunaSDK.UserInfo?✅✅Client firstName, lastNameet email. Requis pour Click to Pay.
userTokenString?✅✅Facultatif. Jeton porteur DEUNA. S'il est fourni, omettez userInfo.
types[[String: Any]]?✅✅Facultatif. Omettez pour afficher l'expérience Card Vault par défaut. Fournissez [["name": ElementsWidget.clickToPay]] pour afficher Click to Pay.
orderTokenString?✅✅Facultatif. Jeton de commande unique. Les détails du client peuvent être extraits de billing_address.
styleFileString?✅✅Facultatif. UUID de personnalisation du thème.
widgetExperienceElementsWidgetExperience?✅✅Facultatif. showSavedCardFlow (bouton de sauvegarde de carte) et defaultCardFlow (bouton de sauvegarde par défaut).
domainString?✅✅Facultatif. Remplace l'hôte (https://elements.deuna.com).
hidePayButtonBool❌✅Facultatif. Masque le bouton en mode intégré. Utilisez isValid et submit pour des boutons personnalisés.

Apple Pay natif#

Vérifiez la configuration du marchand et la capacité de l'appareil avant d'afficher un bouton 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
}

Après la réussite de la vérification de disponibilité, lancez la feuille native Apple Pay en utilisant 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'application doit inclure l'entitlement Apple Pay et un profil de provisionnement contenant l'identifiant du commerçant. Voir Apple Payer pour la configuration complète.

Poursuivre une action en attente#

Utilisez le même jeton de commande lorsque DEUNA signale que le paiement nécessite un défi ou une redirection 3DS pris en charge.

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 présente les URL externes supportées et retourne le contrôle au widget. Utilisez l'état de callback pour l'interface et l'état de paiement final DEUNA pour la fulfillment.

Ouvrir un bon de réduction#

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

Les notifications de remboursement fonctionnent selon le même cycle de réussite, d'erreur, de fermeture et de déclenchement d'événements que les autres expériences de paiement.

Données de fraude-appareil et empreinte numérique#

Le SDK iOS DEUNA utilise un architecture modulaire: il ne regroupe pas les SDK de fraude tiers par défaut. Ajoutez uniquement le(s) fournisseur(s) spécifique(s) que vous prévoyez d'utiliser. Si vous n'utilisez pas un fournisseur, vous ne subissez aucune pénalité de taille d'application.

Fournisseurs pris en charge

FournisseurProduit SPMSous-spécification CocoaPodsParamètres requis
MERCADOPAGODeunaSDKMercadoPagopod 'DeunaSDK/MercadoPago'(Aucune requise - passez [:])
RISKIFIEDDeunaSDKRiskifiedpod 'DeunaSDK/Riskified'storeDomain
CYBERSOURCEDeunaSDKCybersourcepod 'DeunaSDK/Cybersource'orgId, merchantId (Optionnel : fpServer)
SIGNIFYDDeunaSDKSignifydpod 'DeunaSDK/Signifyd'orgId (Optionnel : fpServer)
KOUNTDeunaSDKKountpod 'DeunaSDK/Kount'merchantId, clientId, dataCollectorUrl, environment
SIFTDeunaSDKSiftpod 'DeunaSDK/Sift'accountId, beaconKey
ACCERTIFYDeunaSDKAccertifypod 'DeunaSDK/Accertify'Fichiers de configuration dans les ressources du bundle Xcode

Configuration des ressources du bundle Accertify

L'intégration Accertify nécessite deux fichiers de configuration dans votre projet Xcode. Assurez-vous que les deux fichiers sont ajoutés à votre cible principale et inclus sous Copy Bundle Resources:

  1. server_keys_message_hosted.json: Le fichier des clés de chiffrement publiques fourni par Accertify.
  2. InMobile.plist: Fichier de liste de propriétés contenant vos informations de marchand :
    • accountID (String) : Votre GUID de compte
    • registrationURL (String) : Point de terminaison d'enregistrement InMobile
    • logURL (String) : Point de terminaison de journalisation InMobile
    • serverKeyData (String) : server_keys_message_hosted.json

Appel direct via generateFraudId

Appeler deunaSDK.generateFraudId avec les paramètres de vos fournisseurs sous contrat :

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

Passez fraudCredentials directement aux widgets

Lors du lancement des widgets (initPaymentWidget, PaymentWidgetConfiguration, etc.), vous pouvez passer votre configuration directement dans fraudCredentials. Le SDK génère l'ID de fraude en interne au moment de l'achat :

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

Notes sur le comportement

  • Zéro surcharge et résistant aux plantages: Si un fournisseur est inclus dans la requête du dictionnaire mais que son framework ou sa sous-spécification n'a pas été lié, le SDK l'ignore en toute sécurité sans lever d'exception ni planter.
  • Exécution parallèle: Les profils des fournisseurs demandés s'exécutent simultanément sur des threads d'arrière-plan.
  • Comportement de repli: Si aucun fournisseur valide n'est configuré ou disponible sur l'appareil, le gestionnaire d'achèvement reçoit nil.

Référence des callbacks et du cycle de vie#

Rappel / MéthodeModalIntégréDescriptif
onSuccess✅✅Opération de paiement ou de coffre-fort de carte terminée avec succès. Reçoit la charge utile de commande ou d'identification. Appelez deunaSDK.close() (modal) ou deunaSDK.dispose() (intégré).
onError✅✅Erreur survenue pendant l'initialisation ou le traitement du paiement. Reçoit un PaymentsError ou ElementsError.
onClosed✅❌typé. CloseAction.userAction (fermé manuellement) ou CloseAction.systemAction (fermé par le client) ou close()).
onPaymentProcessing✅✅Déclenché lorsque le client appuie sur payer et que le traitement du paiement commence. Utilisez pour désactiver les boutons et afficher les indicateurs de progression.
onCardBinDetected✅✅Déclenché lorsqu'un BIN de carte est détecté ou effacé (nil Déclenché lorsqu'un BIN de carte est détecté ou effacé (retourne
onInstallmentSelected✅✅Déclenché lorsque le client sélectionne des échéances différées (nil Déclenché lorsque le client sélectionne un plan de paiement échelonné (retourne
onEventDispatch✅✅Déclenché lorsque le client demande le téléchargement d'un bon ou d'un reçu. CheckoutEvent ou ElementsEvent occurrences avec des charges utiles de données.
close()✅❌Ferme la présentation modale active tout en conservant l'instance du SDK.
dispose()❌✅Libère le contrôleur intégré et la WebView lorsque la hiérarchie de vues est démontée.

pour la journalisation personnalisée et l'analyse.onError)

Inspectez error.type pour distinguer les échecs d'initialisation des refus de traitement :

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

Exemples et code source officiels#

Voir WalletsScreen.swift pour Apple Pay natif et EmbeddedScreen.swift pour le cycle de vie SwiftUI.

Dans cette section