SDK iOS
Installez le SDK iOS de DEUNA et intégrez les flux de type modal, embarqué, portefeuille, code promo et "prochain pas".
Sur cette page
- Exigences
- Installation
- Initialisation
- Ouvrir le widget de paiement
- Expériences disponibles
- Intégrer un widget avec SwiftUI
- Filtrer et configurer les méthodes de paiement
- Style dynamique et rafraîchissement de commande
- Coffre-fort de paiement et Paiement en un clic
- Apple Pay natif
- Poursuivre une action en attente
- Ouvrir un bon de réduction
- Données de fraude-appareil et empreinte numérique
- Référence des callbacks et du cycle de vie
- Exemples et code source officiels
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é)
- Dans Xcode, accédez à Fichier → Ajouter des dépendances de paquet...
- Dans la barre de recherche, saisissez l'URL du dépôt :
Plain text
https://github.com/deuna-developers/deuna-sdk-ios - Épinglez la règle de dépendance du paquet à la version
2.12.6(ou supérieure). - Lorsque la boîte de dialogue Choisir les produits du paquet apparaît :
- Sélectionnez
DeunaSDKet 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.
- Sélectionnez
Poissons de cacao
Si votre projet iOS utilise CocoaPods :
- Spécifiez la cible de déploiement minimale et ajoutez
DeunaSDKà votrePodfile:
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- Exécutez :
pod install- 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#
import DeunaSDKVous 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:
DeunaSDK.initialize(
environment: .sandbox, // .sandbox or .production
publicApiKey: "YOUR_PUBLIC_API_KEY"
)
let deunaSDK = DeunaSDK.sharedCoordinateur ou instance d'écran
Créez et conservez une instance pour un écran ou coordinateur spécifique :
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 :
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ètre | Tapez | Modal | Intégré | Descriptif |
|---|---|---|---|---|
orderToken | String | ✅ | ✅ | 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. |
callbacks | PaymentWidgetCallbacks | ✅ | ✅ | Obligatoire. Callbacks écoutant les événements du widget (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch). |
userToken | String? | ✅ | ✅ | 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. |
styleFile | String? | ✅ | ✅ | 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"]]]). |
language | String? | ✅ | ✅ | Facultatif. Code de langue ("es", "en", "pt"). Remplace la configuration par défaut du marchand. |
behavior | WidgetBehavior? | ✅ | ✅ | 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"]]). |
domain | String? | ✅ | ✅ | Facultatif. Remplace l'hôte de base par défaut (https://pay.deuna.io). |
hidePayButton | Bool | ❌ | ✅ | Facultatif. Masque le bouton de paiement intégré en mode intégré lorsque votre application affiche un bouton natif. |
Expériences disponibles#
| Expérience | Méthode | Type de configuration | Informations importantes |
|---|---|---|---|
| Widget de paiement | initPaymentWidget(...) | PaymentWidgetConfiguration | orderToken, PaymentWidgetCallbacks |
| Coffre-fort de paiement | initElements(...) | ElementsWidgetConfiguration | ElementsCallbacks; types Peut être omis |
| Cliquez pour payer | initElements(...) | ElementsWidgetConfiguration | types: [["name": ElementsWidget.clickToPay]] |
| Prochaine étape | initNextAction(...) | NextActionWidgetConfiguration | Jeton pour la commande nécessitant une autre action |
| Bon de réduction | initVoucher(...) | VoucherWidgetConfiguration | Jeton 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.
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 :
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:
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éthode | Descriptif | Valeur 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.
deunaSDK.initPaymentWidget(
orderToken: orderToken,
callbacks: callbacks,
paymentMethods: [
[
"paymentMethod": "bnpl",
"processors": ["kueski"]
]
]
)Résolution de priorité de configuration
| Priorité | Source | Comportement |
|---|---|---|
| 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. |
| 2 | include_payment_options dans la création de commande | Sé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)
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 :
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) :
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 :
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
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)
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
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ètre | Tapez | Modal | Intégré | Descriptif |
|---|---|---|---|---|
callbacks | ElementsCallbacks | ✅ | ✅ | Obligatoire. Écouteurs d'événements (onSuccess, onError, onClosed, onEventDispatch). |
userInfo | DeunaSDK.UserInfo? | ✅ | ✅ | Client firstName, lastNameet email. Requis pour Click to Pay. |
userToken | String? | ✅ | ✅ | 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. |
orderToken | String? | ✅ | ✅ | Facultatif. Jeton de commande unique. Les détails du client peuvent être extraits de billing_address. |
styleFile | String? | ✅ | ✅ | Facultatif. UUID de personnalisation du thème. |
widgetExperience | ElementsWidgetExperience? | ✅ | ✅ | Facultatif. showSavedCardFlow (bouton de sauvegarde de carte) et defaultCardFlow (bouton de sauvegarde par défaut). |
domain | String? | ✅ | ✅ | Facultatif. Remplace l'hôte (https://elements.deuna.com). |
hidePayButton | Bool | ❌ | ✅ | 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.
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:
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.
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#
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
| Fournisseur | Produit SPM | Sous-spécification CocoaPods | Paramètres requis |
|---|---|---|---|
MERCADOPAGO | DeunaSDKMercadoPago | pod 'DeunaSDK/MercadoPago' | (Aucune requise - passez [:]) |
RISKIFIED | DeunaSDKRiskified | pod 'DeunaSDK/Riskified' | storeDomain |
CYBERSOURCE | DeunaSDKCybersource | pod 'DeunaSDK/Cybersource' | orgId, merchantId (Optionnel : fpServer) |
SIGNIFYD | DeunaSDKSignifyd | pod 'DeunaSDK/Signifyd' | orgId (Optionnel : fpServer) |
KOUNT | DeunaSDKKount | pod 'DeunaSDK/Kount' | merchantId, clientId, dataCollectorUrl, environment |
SIFT | DeunaSDKSift | pod 'DeunaSDK/Sift' | accountId, beaconKey |
ACCERTIFY | DeunaSDKAccertify | pod '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:
server_keys_message_hosted.json: Le fichier des clés de chiffrement publiques fourni par Accertify.InMobile.plist: Fichier de liste de propriétés contenant vos informations de marchand :accountID(String) : Votre GUID de compteregistrationURL(String) : Point de terminaison d'enregistrement InMobilelogURL(String) : Point de terminaison de journalisation InMobileserverKeyData(String) :server_keys_message_hosted.json
Appel direct via generateFraudId
Appeler deunaSDK.generateFraudId avec les paramètres de vos fournisseurs sous contrat :
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 :
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éthode | Modal | Inté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 :
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.