SDK Swift
Utilisez notre SDK natif Swift pour établir un canal sécurisé entre votre application iOS et notre serveur tout en garantissant un transfert sécurisé des données de vos clients.
Notre SDK natif vous aide à communiquer avec l'API Client. Il offre :
- Des wrappers pratiques pour les réponses API.
- La gestion de tous les détails concernant le chiffrement des informations de paiement.
- La mise en cache des logos et images des produits de paiement pour fournir des informations supplémentaires sur les produits de paiement.
- Une mise en forme conviviale des données de paiement, telles que les numéros de carte et les dates d'expiration.
- La validation des entrées.
- Des vérifications pour déterminer à quel émetteur une carte est associée.
Nous vous encourageons toujours à cibler l'URL de base de l'API la plus à jour lors de l'envoi de requêtes à notre plateforme. Consultez notre guide dédié pour un aperçu complet.
Notre application d'exemple simule l'interface utilisateur pour l'ensemble du flux de paiement basé sur l'interaction entre l'application et notre plateforme. Retrouvez le code source du SDK et de l'application d'exemple sur GitHub, y compris les instructions d'installation.
Pour comprendre comment utiliser ce SDK, consultez la documentation suivante :
- Intégration mobile/client – Familiarisez-vous avec les différents concepts.
- Référence de l'API Client – Le SDK enveloppe l'API Client et (entre autres) expose les réponses des appels au service web sous forme d'objets. Comprendre l'API Client vous aidera également à comprendre ces objets SDK.
- Le SDK sur GitHub – Le SDK contient une application d'exemple fonctionnelle, qui peut vous aider à comprendre comment l'utiliser au mieux.
- Ce document actuel vous aidera à comprendre le flux global lors de la création de pages de paiement avec le SDK.
Pourquoi utiliser le SDK Swift
Notre SDK Swift vous aide à intégrer les paiements dans les applications iOS plus rapidement et avec moins d'efforts. Il gère de nombreux détails techniques pour vous, vous n'avez donc pas à travailler directement avec l'API Client pour les tâches courantes. Voici quelques-uns des principaux avantages de l'utilisation de notre SDK :
- Moins de code à écrire et à maintenir – Le SDK inclut des fonctionnalités prêt-à-l'emploi, ce qui réduit le temps de développement et la maintenance continue.
- Authentification simple et sécurisée – Le SDK s'occupe de la logique d'authentification et de sécurité, rendant la configuration plus rapide et plus sûre.
- Intégration plus stable dans le temps – La plupart des modifications de la plateforme sont gérées dans le SDK, minimisant l'impact sur le code de votre application.
- Configuration plus rapide et support plus facile – L'utilisation du SDK crée des intégrations plus standardisées, rendant l'intégration plus rapide et le support plus efficace.
Si votre projet nécessite un contrôle strict des dépendances, des besoins en fonctionnalités minimales ou une configuration très légère, utiliser le SDK pourrait ajouter du code et des fonctionnalités dont vous n'avez pas réellement besoin. Dans ces cas, travailler directement avec l'API pourrait être plus simple et plus efficace.
Intégration du SDK
Pour effectuer des paiements, vous devez d'abord intégrer le SDK à votre projet. Vous pouvez trouver toutes les versions du SDK dans notre dépôt. Nous avons préparé ci-dessous les exigences et les instructions d'installation pour le SDK.
Exigences
La version minimale de Swift supportée par la bibliothèque est 5.5. Cependant, comme la bibliothèque SDK Swift est conçue pour la distribution, vous pouvez également l'utiliser avec toutes les versions ultérieures de Xcode et Swift.
Installation
Vous pouvez installer le SDK de plusieurs manières :
Gestionnaire de paquets Swift (recommandé)
Vous pouvez ajouter le SDK Swift avec Swift Package Manager en configurant votre projet comme suit :
- Accédez aux paramètres de votre projet et cliquez sur l'onglet "Package Dependencies".
- Cliquez sur "+" pour ajouter une nouvelle dépendance de paquet Swift.
- Entrez l'URL GitHub suivante dans la barre de recherche : https://github.com/wl-online-payments-direct/sdk-client-swift
- Vous pouvez également définir une version du paquet que vous souhaitez inclure. L'option par défaut est la dernière version de la branche principale.
- Cliquez sur "Add package".
Le paquet sera également ajouté automatiquement en tant que dépendance à vos cibles.
CocoaPods (obsolète)
Nous ne diffusons plus notre bibliothèque via CocoaPods en raison de problèmes techniques. Cependant, vous pouvez toujours utiliser une ancienne version publiée là-bas. Gardez à l'esprit que nous ne fournissons plus de support pour celle-ci, donc nous ne pouvons pas garantir qu'elle fonctionnera.
Vous pouvez ajouter le SDK Swift à votre projet en tant que pod en ajoutant ce qui suit à votre Podfile:
pod 'OnlinePaymentsKit'
Le podspec gère automatiquement les dépendances.
Ensuite, exécutez la commande suivante :
pod install
XCFramework
Pour une intégration directe de la XCFramework :
- Téléchargez la XCFramework depuis la page des releases.
- Ajoutez la XCFramework à votre projet :
- Faites glisser OnlinePaymentsKit.xcframework dans la section "Frameworks, Libraries and Embedded Content" de votre cible.
- Configurez-la sur "Embed & Sign".
Toutes les dépendances (Alamofire, CryptoSwift) sont intégrées statiquement dans l'XCFramework, vous n'avez donc pas besoin de les ajouter séparément.
Carthage
Ajoutez ce qui suit à votre Cartfile pour ajouter le SDK Swift avec Carthage :
github "wl-online-payments-direct/sdk-client-swift"
Ensuite, exécutez la commande suivante :
carthage update --use-xcframeworks
Ensuite, naviguez vers le répertoire Carthage/Build (situé au même endroit que le fichier .xcodeproj ou .xcworkspace). Vous y trouverez le bundle .xcframework à l'intérieur.
Faites glisser le .xcframework dans la section "Framework, Libraries, and Embedded Content" de la cible souhaitée. Assurez-vous qu'il est réglé sur "Embed & Sign".
Compatibilité avec Objective-C
Vous pouvez également utiliser le SDK Swift dans des projets Objective-C en utilisant CocoaPods ou Carthage. Lorsque vous ajoutez le kit de paiements en ligne en tant que dépendance, vous pouvez l'utiliser facilement en ajoutant l'instruction d'importation suivante à l'endroit où vous souhaitez utiliser le SDK : @import OnlinePaymentsKit;
Exemples d'applications
Nous avons fourni une application d'exemple en SwiftUI et UIKit que vous pouvez utiliser comme base pour votre propre mise en œuvre. Si vous appréciez son apparence et son fonctionnement, vous n'avez besoin d'apporter aucune modification. Vous pouvez télécharger les applications d'exemple ci-dessous :
Après avoir intégré avec succès le SDK à votre projet, vous pouvez procéder à son intégration avec l'ensemble du système de paiement. Le processus de paiement complet se compose des étapes suivantes :
- Initialisation du SDK
- Récupération des méthodes de paiement possibles
- Récupération et affichage des détails de la méthode de paiement
- Validation des données fournies
- Chiffrement et transfert des données de paiement
- Finalisation de la transaction
1. Initialiser le SDK
Tout d'abord, vous devez créer une instance de l'OnlinePaymentsSdk, permettant la communication entre l'API du serveur et le client. Votre application doit disposer de son propre serveur, agissant comme un intermédiaire entre notre client et l'API du serveur.
Étant donné que le client initie le paiement dans votre application, votre application cliente demande à votre application serveur de créer une Session. Lorsqu'une application serveur reçoit une demande, elle peut créer une Session via CreateSession à partir du SDK serveur.
Essayez notre API Explorer pour envoyer une requête CreateSession.
Après avoir configuré et connecté votre application à l'API du serveur, vous recevez une réponse contenant des informations sur la Session créée. Une réponse typique ressemble à ceci :
{clientSessionId: "47e9dc332ca24273818be2a46072e006",customerId: "9991-0d93d6a0e18443bd871c89ec6d38a873",clientApiUrl: "https://clientapi.com",assetUrl: "https://assets.com"}
Chaque Session a une durée de vie fixe de 3 heures. Si elle expire, vous devez créer une nouvelle Session.
Après avoir créé un SessionData, vous devrez également configurer votre objet PaymentContext comme indiqué ci-dessous. Il contient des informations telles que la devise, le pays, le montant, etc.
let sessionData = SessionData(clientSessionId: "47e9dc332ca24273818be2a46072e006",customerId: "9991-0d93d6a0e18443bd871c89ec6d38a873",clientApiUrl: "https://clientapi.com",assetUrl: "https://assets.com")let amountOfMoney = AmountOfMoney(amount: 1298, // in centscurrencyCode: "EUR" //three-letter currency code as defined in ISO 4217)let paymentContext = PaymentContext(amountOfMoney: amountOfMoney,isRecurring: false, // true, if it is a recurring paymentcountryCode: "NL" //two-letter country code as defined in ISO 3166-1 alpha-2)
Vous pouvez utiliser tout cela pour créer une instance du SDK, que vous utiliserez pour de futures interactions.
let configuration = SdkConfiguration(appIdentifier: "My Application/v2.0.4",loggingEnabled: true // set this to false in production)let sdk = try OnlinePaymentsSdk(sessionData: sessionData,configuration: configuration)
Différentes méthodes de paiement sont disponibles pour différents objets PaymentContext. Si vous modifiez une variable, vous devez recommencer le processus. Seule la SessionData peut rester la même si le même client a effectué le paiement.
2. Récupérer les méthodes de paiement possibles
La prochaine étape consiste à obtenir et afficher les options de paiement possibles. Étant donné que les éléments de paiement sont des instances de BasicPaymentProduct, votre application peut utiliser ces éléments pour créer un écran qui les répertorie. Il suffit de récupérer et d'afficher les listes de BasicPaymentProduct et AccountOnFile pour permettre à votre client de faire un choix.
Utilisez notre application exemple pratique comme base pour votre propre implémentation.
sdk.basicPaymentProducts(forContext: paymentContext,success: { basicPaymentProducts in// Display the contents of basicPaymentProducts & accountsOnFile to your customer},failure: { error in// Inform the customer that something went wrong while retrieving the available Payment Products})
Vous pouvez ignorer cette étape si vous souhaitez utiliser un produit de paiement spécifique.
3. Récupérer et afficher les détails des moyens de paiement
Pour certains moyens de paiement, les clients peuvent autoriser notre plateforme à stocker leurs identifiants afin de faciliter les paiements récurrents. Nous appelons les données stockées un account on file (Card On File) ou un token. Vous pouvez réutiliser ce compte enregistré/jeton pour des paiements ultérieurs si vos clients ont choisi la même méthode de paiement.
La liste des produits de paiement disponibles que le SDK reçoit de l'API Client contient également les comptes enregistrés pour chaque produit de paiement. Votre application peut présenter cette liste à l'utilisateur.
En fonction de la méthode choisie par le client, considérez différents flux de données :
Si le client choisit une forme de paiement native, vous devez utiliser le SDK du fournisseur de paiement. Vous devrez gérer la réponse uniquement lors de la dernière étape pour informer le client de l'état de son paiement. En savoir plus sur les paiements natifs dans ce chapitre dédié.
Pour les paiements avec un fournisseur de paiement tiers, vous recevez des données avec l'adresse de redirection dans les propriétés du paiement. Redirigez vos clients dans leur navigateur vers le portail de paiement tiers pour continuer le processus de paiement. Après le paiement réussi, votre application doit gérer la redirection vers l'application client.
Le processus de paiement standard est un paiement par carte. Une fois que le client a sélectionné le produit de paiement souhaité, récupérez le PaymentProduct enrichi détaillant quelles informations le client doit fournir pour autoriser le paiement. Ensuite, affichez les champs d'informations requis à votre client.
sdk.paymentProduct(withId: 1, // replace with the id of the payment product that should be fetchedpaymentContext: paymentContext,success: { paymentProduct in// Display the fields to your customer},failure: { error in// Handle failure of retrieving a Payment Product by id})
Utilisez notre application d'exemple pour vous inspirer afin de créer votre propre écran.
4. Valider les données fournies
Après que votre client a saisi ses informations de paiement, votre application doit valider les données reçues. Mais avant la validation, vous devrez d'abord sauvegarder les données saisies par le client pour les champs d'informations requis dans une instance de PaymentRequest. Cette classe possède une propriété tokenize utilisée pour indiquer si l'application doit stocker les identifiants du client pour des paiements récurrents.
Utilisez l'exemple de code suivant pour les demandes de paiement sans comptes enregistrés :
let paymentRequest = PaymentRequest(paymentProduct: paymentProduct)
Alternativement, adaptez l'exemple de code en fournissant à la fois le compte enregistré et le produit de paiement correspondant :
let paymentRequest = PaymentRequest(paymentProduct: paymentProduct)paymentRequest.accountOnFile = accountOnFile
Une fois que vous avez configuré une demande de paiement, fournissez les valeurs pour les champs du produit de paiement. Utilisez les identifiants des champs, tels que "cardNumber", "cvv", "cardholderName", et "expiryDate", pour définir les valeurs des champs pour la demande de paiement :
try paymentRequest.field(id: "cardNumber").setValue(value: "12451254457545")try paymentRequest.field(id: "cvv").setValue(value: "123")try paymentRequest.field(id: "expiryDate").setValue(value: "1230")try paymentRequest.field(id: "cardholderName").setValue(value: "John Doe")
Vous devez maintenant valider les données reçues à l’aide de la liste de validateurs disponible. Pour ce faire, effectuez la validation sur le PaymentRequest en validant à la fois les field values et la payment request.
// validate all fields in the payment requestlet validationResult = paymentRequest.validate()// check if the payment request is validif validationResult.isValid {// payment request is valid} else {// payment request has errorsvalidationResult.errors.forEach { error in// do something with the ValidationError, like displaying it to the user}}
N'oubliez pas que l'interface de saisie des données doit être entièrement transparente et compréhensible pour vos clients. Donc, s'il y a des erreurs de validation, vous devez leur fournir des retours d'information à ce sujet. Vous recevez des informations d'erreur lors de la validation d'un champ de paiement ou de la validation de la demande de paiement, vous pouvez donc les utiliser pour afficher des messages d'erreur appropriés. Chaque erreur de validation fait référence au champ défectueux correspondant.
5. Chiffrer et transférer les données de paiement
Après la validation du PaymentRequest chiffrez la requête comme illustré dans l’extrait ci-dessous :
sdk.encryptPaymentRequest(paymentRequest,success: { encryptedRequest in// Forward the encryptedRequest.encryptedCustomerInput to your server},failure: { error in// Handle failure of encrypting Payment Request})
Voir une description plus détaillée du processus de chiffrement dans ce chapitre dédié.
6. Finaliser la transaction
Après avoir chiffré les données du client, envoyez l’objet chiffré à votre serveur et utilisez-le pour effectuer une requête CreatePayment avec le SDK serveur. Ensuite, fournissez-lui les données chiffrées afin de finaliser le paiement.
La réponse à la demande CreatePayment peut nécessiter des actions supplémentaires de la part du client, spécifiées dans l'objet MerchantAction. Dans la plupart des cas, cela implique de rediriger le client vers une partie externe (par exemple, pour une vérification 3-D Secure). Une fois que vos clients ont terminé cette vérification, notre plateforme traite la transaction réelle. Consultez la documentation du SDK serveur pour plus d'informations.
Enfin, vous devez transmettre l'information à votre application cliente pour afficher le résultat de la transaction à vos clients.
Trouvez une vue d'ensemble complète du flux de paiement dans le guide d'intégration Intégration mobile/client.
Objets SDK
L'SDK Swift comprend plusieurs objets. Choisissez l'objet qui vous intéresse dans la liste ci-dessous pour en savoir plus à son sujet :
- OnlinePaymentsSdk
- PaymentContext
- BasicPaymentProducts
- BasicPaymentProduct
- AccountOnFile
- PaymentProduct
- PaymentProductField
- PaymentRequest
- StringFormatter
OnlinePaymentsSdk
Une instance de OnlinePaymentsSdk est requise pour toutes les interactions avec le SDK. Le fragment de code suivant montre comment initialiser OnlinePaymentsSdk. Vous obtenez les détails de la session en effectuant un appel Create Client Session en utilisant l'API Serveur.
let sessionData = SessionData(clientSessionId: "47e9dc332ca24273818be2a46072e006",customerId: "9991-0d93d6a0e18443bd871c89ec6d38a873",clientApiUrl: "https://clientapi.com",assetUrl: "https://assets.com")let configuration = SdkConfiguration(appIdentifier: "Swift Example Application/v2.0.4")let sdk = try OnlinePaymentsSdk(sessionData: sessionData,configuration: configuration)
Toutes les méthodes que l'OnlinePaymentsSdk propose sont des wrappers autour de l'API Client. Elles créent la requête et convertissent la réponse en objets Swift qui peuvent contenir des fonctions de commodité.
PaymentContext
PaymentContext est un objet qui contient le contexte/paramètres du paiement à venir. Certaines méthodes de l'instance Session en ont besoin en tant qu'argument. Cet objet peut contenir les détails suivants :
public class PaymentContext {var countryCode: String // ISO 3166-1 alpha-2 country codevar amountOfMoney: AmountOfMoney // contains the total amount and the ISO 4217 currency codevar isRecurring: Bool // Set `true` when payment is recurring. Default false.}
BasicPaymentProducts
Cet objet contient les produits de paiement disponibles pour le paiement en cours. Utilisez la fonction sdk.basicPaymentProducts pour récupérer les données.
L’objet que vous recevrez est BasicPaymentProducts, qui contient une liste de tous les BasicPaymentProducts disponibles ainsi que leurs AccountOnFiles associés.
L’extrait de code ci-dessous montre comment obtenir l’instance BasicPaymentProducts.
sdk.basicPaymentProducts(forContext: paymentContext,success: { basicPaymentProducts in// Display the contents of basicPaymentProducts & accountsOnFile to your customer},failure: { error in// Inform the customer that something went wrong while retrieving the available Payment Products})
BasicPaymentProduct
Le SDK propose deux types d'objets pour représenter les informations sur les produits de paiement :
- BasicPaymentProduct
- PaymentProduct
Les instances de BasicPaymentProduct contiennent uniquement les informations nécessaires pour afficher une liste simple de produits de paiement à choisir par le client.
L'objet PaymentProduct contient des informations supplémentaires sur chaque produit de paiement. Un exemple serait les champs de formulaire spécifiques que le client doit remplir. Vous utilisez généralement cet objet lors de la création d'un formulaire demandant les détails de paiement du client. Consultez la section PaymentProduct pour plus d'informations.
Voici un exemple de comment obtenir les noms d'affichage et les ressources pour le produit Visa (id : 1).
let basicPaymentProduct = basicPaymentProducts.paymentProduct(withId: 1)let id = basicPaymentProduct.id // 1let label = basicPaymentProduct.label // VISAlet logoPath = basicPaymentProduct.logo // https://assets.com/path/to/visa/logo.gif
AccountOnFile
Une instance d'AccountOnFile représente les informations sur un produit de carte stocké pour le client actuel. Vous devez fournir les ID AccountOnFile disponibles pour le paiement actuel dans le corps de la requête de l'appel CreateSession de l'API Serveur si vous souhaitez permettre au client d'utiliser une méthode de paiement précédemment tokenisée.
Si le client souhaite utiliser un AccountOnFile existant pour un paiement, vous devez ajouter l'AccountOnFile sélectionné à la PaymentRequest. L'extrait de code ci-dessous montre comment récupérer les données d'affichage pour un compte enregistré. Vous pouvez afficher cette étiquette et le logo du produit de paiement correspondant au client.
// All available accounts on file for the payment productlet allAccountsOnFile = basicPaymentProduct.accountsOnFile// Get the specific account on file for the payment productlet accountOnFile = basicPaymentProduct.accountOnFile(withId: "123")// Shows a mask-based formatted value for the obfuscated cardNumber.// The mask that is used is defined in the displayHints of this accountOnFile// If the mask for the "cardNumber" field is {{9999}} {{9999}} {{9999}} {{9999}}, then the result would be **** **** **** 7412let maskedValue = accountOnFile.getValue(forField: "cardNumber")
PaymentProduct
BasicPaymentProduct contient uniquement les informations de base du produit de paiement dont les clients ont besoin pour les distinguer. Cependant, lorsqu'ils sélectionnent un produit de paiement ou un compte enregistré, ils doivent fournir des informations complémentaires. Le système nécessite des informations obligatoires telles que le numéro de compte bancaire, le numéro de la carte de crédit et la date d'expiration pour traiter le paiement. Les instances de BasicPaymentProduct ne contiennent aucune information sur ces champs.
Ainsi, lorsque vous avez besoin d'informations détaillées sur le paiement, appelez l'objet PaymentProduct. Cet objet contient plusieurs instances de PaymentProductField. Chaque PaymentProductField transporte une information requise pour traiter le paiement (par exemple, numéro de compte bancaire, numéro de carte de crédit).
Utilisez l'instance de OnlinePaymentsSdk pour récupérer l'instance de PaymentProduct, comme montré dans le extrait de code ci-dessous.
sdk.paymentProduct(withId: 1, // replace with the id of the payment product that should be fetchedpaymentContext: paymentContext,success: { paymentProduct in// Display the fields to your customer},failure: { error in// Handle failure of retrieving a Payment Product by id})
PaymentProductField
Les instances PaymentProductField représentent des champs individuels de produit de paiement (par exemple, numéro de compte bancaire, numéro de carte de crédit). Chaque champ possède les éléments suivants :
- Un identifiant
- Un type
- Une définition des restrictions applicables à la valeur du champ
- Une validation intégrée pour les valeurs saisies
- Des informations sur la manière dont le champ doit être affiché au client
Dans l'exemple de code ci-dessous, le système récupère le champ avec l'identifiant "cvv" à partir d'un produit de paiement. Le système vérifie ensuite les restrictions de données pour déterminer si c'est un champ obligatoire ou optionnel. Enfin, le système examine si les valeurs fournies par le client doivent être visibles ou masquées dans l'interface utilisateur.
let cvvField = paymentProduct.field(id: "cvv")let isRequired = cvvField.isRequired // states if value is required for this fieldlet shouldObfuscate = cvvField.shouldObfuscate // states if the field value should be obfuscated
PaymentRequest
Une fois que le client sélectionne un produit de paiement et que le système récupère une instance de PaymentProduct, une demande de paiement peut être construite. Vous devez utiliser la classe PaymentRequest comme conteneur pour toutes les valeurs que le client fournit.
let paymentRequest = PaymentRequest(paymentProduct: paymentProduct)
Tokeniser la PaymentRequest
Une PaymentRequest comporte une propriété tokenize. Vous pouvez l'utiliser pour indiquer si une demande de paiement doit être stockée en tant que compte enregistré pour de futurs paiements. Le fragment de code ci-dessous montre comment construire une demande de paiement lorsque vous souhaitez la stocker en tant que compte enregistré.
let paymentRequest = PaymentRequest(paymentProduct: paymentProduct) // when you do not pass the tokenize value, it will be false// you can supply tokenize via the constructorlet paymentRequest = PaymentRequest(paymentProduct: paymentProduct, tokenize: true)// or by accessing the request's tokenize propertypaymentRequest.tokenize = true
Par défaut, tokenize est réglé sur false.
Si le client sélectionne un compte enregistré, vous devez fournir à la fois le compte enregistré et le produit de paiement correspondant lors de la création de la requête de paiement. Vous pouvez récupérer les instances de AccountOnFile à partir des instances de BasicPaymentProduct et PaymentProduct.
// you can supply accountOnFile via the constructorlet paymentRequest = PaymentRequest(paymentProduct: paymentProduct,accountOnFile: accountOnFile // when you do not pass the accountOnFile value, it will be nil)// or by accessing the request's accountOnFile propertypaymentRequest.accountOnFile = accountOnFile
Définir les valeurs des champs pour la PaymentRequest
Une fois que vous avez créé une demande de paiement, vous pouvez fournir les valeurs pour les champs de la demande de paiement comme suit :
try paymentRequest.setValue(id: "cardNumber", value: "1245 1254 4575 45")try paymentRequest.setValue(id: "cvv", value: "123")try paymentRequest.setValue(id: "expiryDate", value: "12/25")
Les identifiants des champs, tels que "cardNumber" et "cvv", sont utilisés pour définir les valeurs des champs à l'aide de la demande de paiement.
setValue renverra une erreur si vous fournissez un identifiant de champ invalide.
Vous pouvez également utiliser l'API Fluent pour définir une valeur de champ.
try paymentRequest.field(id: "cardNumber").setValue(value: "1245 1254 4575 45")
Valider la PaymentRequest
Une fois que toutes les valeurs ont été fournies, la demande de paiement peut être validée. La validation utilise les DataRestrictions définies dans les champs du PaymentProduct ajouté à la PaymentRequest. La fonction validate() retourne un résultat de validation, indiquant si la requête est valide et si elle contient des erreurs de validation.
S'il n'y a pas d'erreurs, vous pouvez chiffrer la demande de paiement et l'envoyer à notre plateforme via votre serveur. S'il y a des erreurs de validation, vous devriez fournir au client un retour d'information sur ces erreurs.
// validate all fields in the payment requestlet validationResult = paymentRequest.validate()// check if the payment request is validif validationResult.isValid {// payment request is valid} else {// payment request has errorsvalidationResult.errors.forEach { error in// do something with the ValidationError, like displaying it to the user}}
Chiffrer la PaymentRequest
La PaymentRequest est prête pour le chiffrement uniquement après que les conditions suivantes ont été remplies :
- Le PaymentProduct a été configuré
- Les valeurs des PaymentRequestField ont été fournies et validées
- Les propriétés AccountOnFile ou tokenize sélectionnées ont été définies (facultatif)
L'sdk.encryptPaymentRequest gère le chiffrement de la PaymentRequest Cela renverra une EncryptedRequest contenant l'entrée client chiffrée et les informations méta du client encodées.
sdk.encryptPaymentRequest(paymentRequest,success: { encryptedRequest in// Forward the encryptedRequest.encryptedCustomerInput to your server},failure: { error in// Handle failure of encrypting Payment Request})
Bien que vous puissiez utiliser vos propres algorithmes de chiffrement pour crypter une demande de paiement, nous vous conseillons d'utiliser la fonctionnalité de chiffrement offerte par le SDK.
StringFormatter
La SDK propose la classe StringFormatter pour aider à formater les valeurs de champ en fonction des masques. Elle vous permet de formater les valeurs des champs et d'appliquer ou de désappliquer des masques sur une chaîne.
let formatter = StringFormatter()let mask = "{{9999}} {{9999}} {{9999}} {{9999}}"let value = "1234567890123456"// apply masked valuelet maskedValue = formatter.formatString(string: value, mask: mask) // "1234 5678 9012 3456"// remove masked valuelet unmaskedValue = formatter.unformatString(string: value, mask: mask) // "1234567890123456"
Fonctionnalités supplémentaires
Le SDK a beaucoup plus à offrir. Jetez un œil aux fonctionnalités suivantes, car elles vous aideront à créer la solution parfaite.
- Chiffrer les données sensibles
- Valider les données
- Appliquer la vérification IIN
- Mettre en œuvre des paiements natifs
Chiffrer les données sensibles
L'un des plus grands atouts du SDK est son outil de chiffrement. Il offre une excellente sécurité lors du transfert de données sensibles (c'est-à-dire les numéros de carte, la date d'expiration, le code CVC). Tout le processus de chiffrement/transfert ressemble à ceci :
Le SDK est conçu pour simplifier ce processus. Voici ce que vous devez faire :
- Utilisez sdk.encryptPaymentRequest pour chiffrer les informations de paiement fournies dans la PaymentRequest.
- Le sdk.encryptPaymentRequest renvoie la EncryptedRequest contenant les données du client chiffrées.
- Récupérez l'entrée client chiffrée à partir de la EncryptedRequest.
- Envoyez l'entrée client chiffrée à votre serveur.
- Envoyez les données chiffrées de votre serveur en utilisant la requête CreatePayment. Fournissez les données chiffrées dans le champ encryptedCustomerInput.
- Envoyez le résultat de la transaction à l'application cliente.
Ne stockez pas les données cryptées. Transférez-les directement via l'API du serveur vers notre plateforme après le chiffrement.
sdk.encryptPaymentRequest(paymentRequest,success: { encryptedRequest in// Forward the encryptedCustomerInput to your server},failure: { error in// Handle failure of encrypting Payment Request})
Le SDK effectue tout le travail difficile, y compris :
- Demander une clé publique à l'API Client
- Effectuer le chiffrement
- Encoder le résultat en BASE-64 en une seule chaîne
Vous avez seulement besoin de vous assurer que l'objet PaymentRequest contient toutes les informations saisies par l'utilisateur.
Bien que les données de paiement soient chiffrées sur les appareils de vos clients, elles restent hors du champ de votre certification PCI-DSS, car vous ne pouvez pas être responsable de la sécurité d'un appareil que vous ne contrôlez pas.
Pour minimiser au maximum le risque pour les données de carte et le niveau de sécurité, nous vous recommandons vivement de respecter les consignes suivantes :
- Utilisez le mécanisme de chiffrement de notre SDK Client (clés publiques et privées), qui est conforme aux exigences du PCI DSS. Chiffrer les données de carte sur les appareils de vos clients à l'aide de la clé publique de notre plateforme garantit que votre serveur e-commerce ne traitera pas les données de carte en clair. Par conséquent, le type PCI requis pour cette méthode d'intégration est SAQ A.
- Développez votre application mobile conformément aux exigences du PCI Security Standards Council, telles que décrites dans cette FAQ.
Valider les données
Chaque champ PaymentProductField dispose de DataRestrictions appropriées. L'objet DataRestrictions contient des informations sur tous les champs obligatoires et vérifie si les valeurs saisies respectent la condition de correction. Avec une liste de validateurs abstraits, il possède également une propriété isRequired. Cette propriété indique si les restrictions données sont obligatoires ou non.
Vous pouvez valider une entrée particulière aussi facilement que via la validation de PaymentRequest. En cas d'erreurs, le champ Errors affichera une liste d'erreurs.
Il contient les validateurs suivants :
- Expiration Date : Vérifie si la date d'expiration de la carte saisie n'est pas antérieure à la date actuelle et si elle ne dépasse pas une plage de vingt-cinq ans dans le futur.
- Email Address : Vérifie le format de l'adresse email fournie par le client.
- Fixed List : Vérifie si la valeur saisie figure dans la liste des possibilités.
- IBAN : Valide l'IBAN fourni par le client.
- Length : Vérifie si la valeur saisie est plus longue que la valeur minimale et si elle ne dépasse pas la valeur maximale.
- Luhn : La formule de somme de contrôle utilisée pour valider diverses numéros d'identification, comme les numéros de carte de crédit.
- Range : Vérifie si la valeur est supérieure à la valeur minimale et si elle n'est pas supérieure à la valeur maximale.
- Regex : Vérifie si la valeur saisie correspond à l'expression régulière.
- TermsAndConditions : Le validateur booléen pour le champ d'acceptation des termes et conditions.
Chaque validateur retourne une erreur appropriée, indiquant un champ qui ne répond pas aux conditions, et un message que vous pouvez facilement traduire.
Appliquer la vérification IIN
Les six premiers chiffres d'un numéro de carte de paiement sont connus sous le nom de Numéro d'Identité de l'Émetteur (IIN). Vous pouvez vérifier le produit de paiement et le réseau associés à l'IIN saisi dès que le client entre les six premiers chiffres de son numéro de carte. Utilisez l'appel sdk.iinDetails pour récupérer ces informations et vérifier si vous pouvez accepter ce type de carte.
Vous pouvez utiliser une instance d'OnlinePaymentsSdk pour vérifier quel produit de paiement est associé à un IIN. Vous faites cela avec la fonction iinDetails. Le résultat de cette vérification est une instance de IINDetailsResponse. Cette classe possède les éléments suivants :
- Une propriété status indiquant le résultat de la vérification
- Propriété paymentProductId indiquant quel produit de paiement est associé à l'IIN.
Vous pouvez utiliser le paymentProductId renvoyé pour récupérer le PaymentProduct et afficher le logo approprié au client.
La propriété status de IINDetailsResponse est représentée par l'énumération IINStatus. Les valeurs de l'énumération IINStatus sont :
- supported indique que l'IIN est associé à un produit de paiement pris en charge par notre plateforme.
- unknown indique que l'IIN n'est pas reconnu.
- notEnoughDigits indique que moins de six chiffres ont été fournis, et qu'il est impossible d'effectuer la vérification de l'IIN.
- existingButNotAllowed indique que l'IIN fourni est reconnu, mais que le produit correspondant n'est pas autorisé pour le paiement ou le commerçant actuel.
sdk.iinDetails(forPartialCardNumber: "123456",paymentContext: paymentContext,success: { iinDetailsResponse in// check the status of the associated payment productlet iinStatus = iinDetailsResponse.status},failure: { error in// Handle failure of retrieving IIN details})
Certaines cartes sont en co-marquage et peuvent être traitées comme une carte locale (avec une marque locale) ou une carte internationale (avec une marque internationale). Les détails du premier produit de paiement que vos clients peuvent utiliser pour la transaction sont toujours stockés dans les champs de niveau supérieur de la réponse IINDetailsResponse.
Cependant, si la co-marquage s'applique, la liste des instances de IINDetail contient toutes les marques associées à la carte. Cela inclut le produit de paiement stocké dans les champs de niveau supérieur. Utilisez cette liste pour permettre aux clients de choisir leur marque préférée. Si vous n'êtes pas configuré pour traiter ces cartes locales, la liste de IINDetails retournera vide.
Mettre en œuvre des paiements natifs
Notre système prend en charge les paiements natifs pour les appareils mobiles, en particulier Google Pay pour Android et Apple Pay
pour iOS. Cependant, cela ne signifie pas qu'ils seront disponibles sur tous les appareils.
Si le client reçoit un produit de paiement responsable du paiement natif, le SDK vérifie automatiquement si l'appareil peut gérer le paiement. Si l'appareil ne remplit pas ces conditions, ce paiement est masqué. En tant qu'utilisateur de notre produit, cette procédure signifie que vous n'avez pas à vous soucier de vérifier la validité de l'opération.
Pour les appareils iOS, vous vérifiez d'abord si le système répond à la version minimale (8.0). Ensuite, vous utilisez le PKPaymentAuthorizationViewController pour vérifier si la transaction peut être effectuée.
Consultez notre guide Apple Pay pour plus d'informations.