Aller au contenu principal
Sur cette page

Le widget de paiement affiche les méthodes de paiement disponibles pour une commande existante et traite la méthode sélectionnée via DEUNA. Il prend en charge les cartes et les méthodes de paiement alternatives configurées sans exposer les informations sensibles aux scripts JavaScript du commerçant.

Avant de commencer#

Complétez Commencer avec le SDK WebCréez la commande sur votre backend et renvoyez uniquement son order_token au navigateur.

Ouvrir le widget de paiement#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  language: 'en',
  callbacks: {
    onSuccess: async () => {
      await DeunaSDK.close();
      await verifyOrderOnBackend();
    },
    onError: ({type, metadata}) => {
      showRecovery({type, code: metadata.code});
    },
    onClosed: (action, metadata) => {
      restorePaymentMethods(action, metadata);
    },
    onCardBinDetected: ({cardBin, cardBrand}) => {
      updateCardOffers(cardBin, cardBrand);
    },
    onInstallmentSelected: ({cardBin, installmentPlanOptionId}) => {
      rememberPlan(cardBin, installmentPlanOptionId);
    },
    onPaymentProcessing: () => disableDuplicateActions(),
    onEventDispatch: (event, payload) => trackSafeEvent(event, payload),
  },
});

Séquence d'intégration#

01 · server
Créer la commande
Calculez les totaux et obtenez le jeton de commande.
02 · browser
Ouvrir le widget de paiement
Transmettez le jeton et la configuration du client prise en charge.
03 · SDK
Traitez la méthode sélectionnée
Gérez la validation, le défi, le fournisseur et le comportement de cycle de vie.
04 · server
Vérifier et finaliser
Utilisez l'état de commande autoritaire.

Paramètres#

ParamètreObligatoireObjectif
orderTokenOuiToken retourné lorsque votre backend a créé la commande.
callbacksNon, recommandéSuccès, erreur, fermeture, redimensionnement, paiement, BIN, échéance et gestion des événements.
languageNonen, es, ou pt; sinon, les paramètres par défaut de DEUNA s'appliquent.
userTokenNonContexte utilisateur DEUNA authentifié pour les méthodes de paiement enregistrées.
paymentMethodsNonLimite ou ouvre directement les méthodes configurées. Ne codez pas les processeurs utilisés par le routage, sauf si nécessaire.
mode + targetNonAffichez à l'intérieur d'un élément correspondant au lieu de la fenêtre modale par défaut. Les deux sont nécessaires pour le mode cible.
hidePayButtonNonCachez l'action du widget lorsque votre page gère la soumission.
styleFileNonIdentifiant de thème/style géré par DEUNA ou ressource de style approuvée.
widgetExperienceNonThèmes et personnalisations de l'expérience utilisateur pris en charge.
behaviorNonComportement des flux pris en charge, tel que les cartes divisées ou les redirections de popup parent.
fraudCredentialsNonConfiguration du fournisseur de fraude approuvée uniquement.
sessionId, idempotencyKeyNonContrôle de la corrélation et des tentatives de doublon pour les flux pris en charge.
domainNonOverride de l'environnement contrôlé ; ne pas utiliser en production normale.

Modale ou intégrée#

La modale est la valeur par défaut. Pour le mode intégré :

HTML
<div id="deuna-payment" aria-label="Détails de paiement"></div>
JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  mode: 'target',
  target: '#deuna-payment',
  callbacks: {
    onResize: ({height}) => {
      document.querySelector('#deuna-payment').style.height = `${Math.ceil(height)}px`;
    },
    onSuccess: verifyOrderOnBackend,
    onError: showRecovery,
  },
});

Le sélecteur doit correspondre à un élément stable. Ne l'affichez pas à l'intérieur d'un élément qui est display: none en cours d'initialisation ou qui provoque un débordement.

Filtrer les méthodes de paiement#

Omettez paymentMethods pour permettre à la commande et à la configuration du commerçant de déterminer l'éligibilité. Fournissez une méthode pour ouvrir directement son formulaire, ou plusieurs méthodes pour restreindre le choix.

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  paymentMethods: [
    {paymentMethod: 'credit_card'},
    {paymentMethod: 'wallet', processors: ['click_to_pay']},
  ],
  callbacks,
});

Le routage peut choisir parmi les processeurs de cartes configurés, de sorte qu'un champ de saisie de carte de crédit n'a généralement pas besoin d'un processors list.

Contrôlez le bouton de soumission#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  hidePayButton: true,
  callbacks,
});

payButton.addEventListener('click', async () => {
  if (!(await DeunaSDK.isValid())) return;

  payButton.disabled = true;
  const result = await DeunaSDK.submit();
  if (result.status === 'error') showRecovery(result);
  payButton.disabled = false;
});

L'instance active expose également getWidgetState(), getSelectedPaymentMethod(), refetchOrder(), setOrderData(...), setCustomStyles(...)et close(). Utilisez uniquement les méthodes pertinentes pour l'expérience active et sérialisez les mises à jour afin qu'un ancien jeton de commande ne puisse pas écraser une nouvelle commande de paiement.

Paiements fractionnés et cartes#

Utilisez le comportement imbriqué documenté pour un flux de deux cartes configuré :

JavaScript
behavior: {
  paymentMethods: {
    creditCard: {
      splitPayments: {maxCards: 2},
    },
  },
}

Voir Diviser les paiements par carte pour la réconciliation et les tests. Utilisez onInstallmentSelected pour l'exact installmentPlanOptionId; ne jamais l'inférer à partir du texte visible.

Gestion des erreurs et des fermetures#

Diagramme de flux
1Widget outcome2-- No3Verify order onbackend4-- No, closed orinterrupted5Map type andmetadata code torecovery6Retrieve orderbefore retry7Render verifiedstate
Révision ou attente

Ne pas afficher les messages bruts des fournisseurs. Cartographier les types et codes connus vers des instructions client localisées, enregistrer des diagnostics sécurisés et utiliser un message de nouvelle tentative générique.