Seamless SDK (Paiement Android)

Cette page fournit un guide d'intégration du SDK Seamless de Yuno pour les paiements Android.

👍

SDK recommandé

Nous recommandons d'utiliser le SDK Seamless Android  pour une intégration fluide. Cette option offre une solution de paiement flexible avec des composants d'interface utilisateur (UI) pré-construits et des options de personnalisation.

Ce SDK est idéal pour les commerçants qui :

  • Composants d'interface utilisateur de paiement pré-construits avec options de personnalisation
  • Ont besoin de personnaliser l'expérience de paiement tout en maintenant la conformité PCI
  • Exigent un équilibre entre la vitesse d'implémentation et la personnalisation

Le SDK Seamless inclut des fonctionnalités telles que :

  • Composants de l'interface utilisateur pour les paiements prédéfinis avec options de personnalisation
  • Support de multiples méthodes de paiement
  • Gestion avancée du statut de paiement
  • Gestion complète des erreurs

Pour les commerçants nécessitant un contrôle complet de l'interface utilisateur ou des fonctionnalités plus avancées, veuillez considérer l'utilisation de notre Full SDK.

Prérequis

Avant de commencer l'intégration du SDK Android de Yuno, assurez-vous que votre projet répond aux exigences techniques. De plus, les pré-requis suivants doivent être en place :

  • Vous devez disposer d'un compte Yuno actif.
  • Vous avez besoin de vos identifiants API Yuno (account_id, public-api-keyet  private-secret-key), que vous pouvez obtenir dans la  Section Développeurs du tableau de bord Yuno. Ces identifiants sont requis pour authentifier les requêtes auprès de l'API Yuno, utilisée pour :
    • Créer un customer, requis avant d'initier les paiements
    • Créer un checkout_session, qui initialise le flux de paiement
    • Créer le paiement associé à la session
📘

Vérifier la version du SDK

Consultez les Notes de version ou le dépôt du Yuno Android SDK pour vérifier la version actuelle du SDK disponible.

Étape 1 : Créer un client

Créez un client en utilisant le endpoint Créer un client avant d'initier les paiements. Cette étape est requise pour :

  • Identifier la personne effectuant le paiement
  • Activer la fonctionnalité de carte enregistrée (si activée)
  • Suivre l'historique des paiements

L'identifiant du client rretourné par cet endpoint sera utilisé lors de la création de la checkout_session.

Étape 2 : Créer une session de paiement

Créez une nouvelle checkout_session à l'aide du endpoint  Créer une session de paiement pour initialiser le flux de paiement. Assurez-vous de :

  • Inclure l'ID du client obtenu à l'étape précédente
  • Conservez l'ID de la checkout_session retourné pour l'utiliser à l'Étape 6
💳

Contrôle de l'authentification par rapport à la capture par envoi payment_method.detail.card.capture dans la session de paiement : false = autoriser uniquement, true = capturer immédiatement.

Paramètres clés

ParamètresRequisDescription
amountOuiL'objet montant de la transaction principale contenant la currency (code ISO 4217) et la value (montant numérique dans cette devise).
alternative_amountNonUne représentation de la devise alternative du montant de la transaction avec la même structure que amount (currency  et  value). Utile pour les scénarios multi-devises, comme l'affichage des prix aux clients dans leur devise préférée (par exemple, USD) tout en traitant le paiement dans la devise locale (par exemple, COP).
🚧

Utilisation de la session de paiement

Le champ checkout_session est unique pour chaque tentative de paiement et ne peut pas être réutilisée.

Étape 3 : Ajouter le SDK à votre projet

Ajoutez la source du dépôt :

maven { url "https://yunopayments.jfrog.io/artifactory/snapshots-libs-release" }

Incluez le code suivant dans le fichier build.gradle pour ajouter la dépendance du SDK Yuno à l'application :

dependencies {
    implementation 'com.yuno.payments:android-sdk:{last_version}'
}

Étape 4 : Configurer les permissions

Le SDK Yuno nécessite des permissions réseau. Assurez-vous que la permission INTERNET est incluse dans votre AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Étape 5 : Initialiser le SDK

Récupérez vos clés API publiques depuis le Tableau de bord Yuno.

Si vous n'avez pas implémenté une classe Application personnalisée, créez-en une. Dans la méthode onCreate() de votre classe d'application, appelez la fonction d'initialisation (Yuno.initialize) :

class CustomApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Yuno.initialize(
            this,
            PUBLIC_API_KEY,
            config = YunoConfig()
        )
    }
}

Utilisez l'endpoint  YunoConfig pour définir des configurations supplémentaires pour le SDK. Le tableau suivant énumère et décrit les options de personnalisation :

OptionDescription
cardFlowDéfinit le flux du formulaire de la carte. L'option par défaut est CardFormType.ONE_STEP. Consulter la section  Options de rendu  pour plus d'informations.
saveCardEnabledActive la case à cocher Enregistrer la carte pour les flux de cartes. Pour plus d'informations, consultez la section Sauvegarder la carte.
languageDéfinit la langue à utiliser dans les formulaires de paiement. Vous pouvez choisir l'une des options linguistiques disponibles :
  • Es (Espagnol)
  • En (Anglais)
  • Po (Portugais)
  • Ph (Philippin)
  • In (Indonésien)
  • Ma (Malais)
  • Th (Thaïlandais)
  • zh-TW (chinois (traditionnel, taïwanais))
  • zh-CN (chinois (simplifié, Chine))
  • vi (vietnamien)
  • fr (français)
  • pl (polonais)
  • it (Italien)
  • de (allemand)
  • ru (russe)
  • tr (turc)
  • nl (néerlandais)
  • sv (suédois)
  • ko (coréen)
  • ja (japonais)
stylesPermet la personnalisation de l'interface utilisateur à l'échelle du SDK. Utilisez-le pour définir des styles visuels globaux (famille de polices, apparence des boutons) via un objet YunoStyles . Pour plus d'informations, consultez la page styles .
numéroDeCartePlaceholderCe champ facultatif vous permet de personnaliser le texte de remplacement pour le champ du numéro de carte. Il prend en charge les caractères alphanumériques, les espaces et les caractères UTF-8 pour la localisation. Si aucun texte n'est fourni, le SDK utilise le texte de remplacement par défaut (« Numéro de carte »). Cette personnalisation n'affecte pas le formatage de la carte, le masquage, la logique BIN ou la validation.
Masquer le nom du titulaire de la carteCe champ facultatif vous permet de masquer le champ du nom du titulaire de la carte dans le formulaire de carte. Lorsqu'il est défini sur true, le champ du nom du titulaire de la carte n'est pas affiché. Lorsqu'il n'est pas spécifié ou défini sur false, le champ du nom du titulaire de la carte s'affiche (comportement par défaut). Le fait de masquer ce champ n'a aucune incidence sur le PAN, la date d'expiration, la collecte du CVV, la logique BIN ou les validations 3DS/fournisseur. Le commerçant est tenu de s'assurer que le nom du titulaire de la carte est fourni lorsque son fournisseur de services de paiement l'exige.

Le bloc de code suivant montre un exemple de YunoConfig:

classe de données YunoConfig(
    val cardFlow : CardFormType  CardFormType.ONE_STEP,
    val saveCardEnabled : Boolean = false,
    val language : YunoLanguage? = null,
      val styles : YunoStyles? = null,
    val cardNumberPlaceholder : String? = null, // Facultatif : texte de remplacement personnalisé pour le champ du numéro de carte
    val hideCardholderName: Boolean? = null // Facultatif : définir sur true pour masquer le champ du nom du titulaire de la carte
)

Étape 6 : Démarrer le paiement

Appelez la fonction startCheckout dans la méthode onCreate() de l'activité qui intègre le SDK pour lancer un nouveau processus de paiement avec le SDK Seamless :

startCheckout(
 checkoutSession: "checkout_session",
  country_code: "US",
 callbackPaymentState: ((String?) -> Unit)?,
  merchantSessionId: String? = null
)
ParamètresDescription
checkoutSessionLe champ checkout_session liée au paiement.
country_codeCode du pays où le paiement est effectué. Consultez la Couverture des pays pour une liste complète des pays pris en charge et de leurs codes.
callbackPaymentStateUne fonction qui retourne le processus de paiement actuel. Facultatif si vous n'avez pas besoin du résultat.
merchantSessionIdIdentifiant facultatif pour le suivi de la session du commerçant. La valeur par défaut est null.

Les états de paiement possibles retournés par callbackPaymentState sont :

const val PAYMENT_STATE_SUCCEEDED = "SUCCEEDED"
const val PAYMENT_STATE_FAIL = "FAIL"
const val PAYMENT_STATE_PROCESSING = "PROCESSING"
const val PAYMENT_STATE_REJECT = "REJECT"
const val PAYMENT_STATE_INTERNAL_ERROR = "INTERNAL_ERROR"
const val PAYMENT_STATE_STATE_CANCELED_BY_USER = "CANCELED"

Le tableau suivant fournit des informations supplémentaires sur les états possibles :

ÉtatDescriptionAction supplémentaire requise
SUCCEEDEDLa transaction ou le processus de paiement a été complété avec succès.Non.
FAILLa transaction a échoué en raison d'erreurs (validation des données, échec de connexion serveur, problèmes techniques/réseau).Oui. Recherchez la cause de la défaillance (validation, réseau, serveur) et prenez des mesures correctives.
PROCESSINGLa transaction est en cours, en attente d'approbation ou de vérification.Non.
REJECTLa transaction a été rejetée pour des raisons telles qu'une insuffisance de fonds ou un soupçon d'activité frauduleuse.Oui. Informer l'utilisateur du rejet, fournir la raison si possible, et suggérer des actions.
INTERNAL_ERRORUne erreur interne inattendue s'est produite dans le système qui gère le processus de paiement.Oui. Nécessite une intervention technique pour examiner le système, résoudre les problèmes internes et réessayer ou informer l'utilisateur.
CANCELEDL'utilisateur a volontairement annulé la transaction ou abandonné le processus de paiement.Non.

Validation du statut de paiement

Cette section explique comment le SDK gère le statut des paiements lorsque les utilisateurs annulent ou quittent les flux de paiement, et comment le statut du SDK est lié au statut des paiements backend dans ces scénarios.

Synchroniser les modes de paiement (Google Pay)

Pour les méthodes de paiement synchronisées telles que Google Pay, lorsqu'un utilisateur annule ou ferme l'interface utilisateur du portefeuille avant de recevoir la réponse du prestataire de services de paiement (PSP) :

  • Statut du SDK: Retours CANCELED (CANCELLED)
  • Statut du paiement backend: Restes PENDING jusqu'à l'expiration du délai PSP ou l'annulation par le commerçant
  • Important: Le SDK ne renverra pas REJECT ou PROCESSING dans ce scénario

Cela garantit que le paiement backend reste en attente et peut être correctement traité par le système du commerçant.

Modes de paiement asynchrones (PIX et méthodes basées sur les QR codes)

Pour les méthodes de paiement asynchrones telles que PIX, lorsqu'un utilisateur ferme la fenêtre du code QR (clique sur X) avant d'avoir terminé le paiement :

  • Statut du SDK: Retours PROCESSING, éventuellement avec un sous-statut tel que CLOSED_BY_USER
  • Statut du paiement backend: Restes PENDING et le code QR reste valide jusqu'à son expiration.
  • Réutilisation de la session de paiement: la réouverture de la même session de paiement permet d'afficher le même code QR valide.
  • Pas d'annulation automatique: le paiement PIX n'est pas automatiquement annulé lorsque l'utilisateur ferme la fenêtre QR.

Ce comportement permet aux utilisateurs de revenir au flux de paiement et de terminer la transaction à l'aide du même code QR avant son expiration.

Paiements asynchrones expirés

Si un code QR PIX expire naturellement :

  • Statut du backend: Mis à jour vers EXPIRED
  • Statut du SDK: Les rappels SDK et endpoints d'interrogation endpoints EXPIRED de manière cohérente

Cela garantit que les commerçants reçoivent des informations précises sur le statut lorsqu'un moyen de paiement a expiré.

Étape 7 : Obtenir un token à usage unique (OTT) du paiement

Appeler la méthode startPaymentSeamlessLite pour démarrer un processus de paiement :

startPaymentSeamlessLite(
 paymentSelected: PaymentSelected,
 callbackPaymentState: ((String?) -> Unit)?,
 showPaymentStatus: Boolean,
)

Le tableau suivant décrit les paramètres permettant de lancer le paiement :

ParamètresDescription
paymentSelectedSpécifie le mode de paiement, soit via un token sécurisé, soit via un type de paiement sélectionné.
callbackPaymentStateParamètre facultatif. Cette fonction gère les mises à jour d'état.
showPaymentStatusParamètre facultatif. S true, affiche l'écran de résultat par défaut du SDK.

Vous recevrez le statut de paiement via callbackPaymentState, indiquant si le paiement a réussi ou si un problème est survenu.

Étape 8 : Créer le paiement

Appeler la méthode startPaymentSeamlessLite avec la méthode de paiement sélectionnée pour terminer le processus de paiement :

startPaymentSeamlessLite(
 paymentSelected: PaymentSelected,
 callbackPaymentState: ((String?) -> Unit)?,
 showPaymentStatus: Boolean,
)

Fonctionnalités Complémentaires

Le SDK Android de Yuno fournit des services et des configurations supplémentaires que vous pouvez utiliser pour améliorer l'expérience de vos clients. Utilisez la personnalisation du SDK pour changer l'apparence du SDK afin qu'il corresponde à votre marque ou pour configurer le loader.

styles

Avec l'option de personnalisation styles , vous pouvez définir des styles visuels globaux via un objet YunoStyles . Il vous permet d'appliquer une image de marque cohérente dans tout le SDK en personnalisant l'apparence des boutons et la typographie.

classe de données YunoStyles(
    val buttonStyles: YunoButtonStyles? = null,
    val fontFamily: FontFamily? = null
)
ParamètresDescription
buttonStylesPersonnalise les boutons principaux affichés dans le SDK.
fontFamilyDéfinit la famille de polices utilisée sur tous les éléments de texte du SDK.

Le champ YunoButtonStyles vous permet de définir des paramètres spécifiques pour l'apparence des boutons :

data class YunoButtonStyles(
    val backgroundColor : Couleur ? = null,
    val contentColor : Couleur ? = null,
    val cornerRadius : Dp ? = null,
    val elevation : Dp ? = null,
    val padding : Dp ? = null,
    val fontFamily : FontFamily ? = null,
    val fontSize : TextUnit ? = null,
    val fontStyle : FontStyle ? = null
)

Utilisez l'endpoint  YunoConfig décrite à l'étape 5, pour appliquer l'option de personnalisation des  styles .

Loader

La fonctionnalité du loader est contrôlée par le paramètre keepLoader dans la classe de données YunoConfig qui est documentée en ligne dans la section de configuration du SDK ci-dessus.

Sauvegarde de carte pour les futurs paiements

Vous pouvez également afficher une case à cocher pour sauvegarder ou enregistrer des cartes en utilisant cardSaveEnable: true. Les exemples suivants montrent la case à cocher pour les deux rendus de formulaire de carte :

Options de rendu

Vous pouvez choisir entre deux options de rendu de formulaire de carte. Les captures d'écran suivantes montrent la différence entre cardFormType ONE_STEP  et  STEP_BY_STEP:

📘

Accès à l'Application Démo

En plus des exemples de code fournis, vous pouvez consulter le dépôt Yuno pour l'implémentation complète des SDK Android de Yuno.