Widget de bons de réduction
Présentez le bon de réduction et les instructions de paiement en espèces sur le Web, iOS, Android et React Native, puis validez le paiement de manière asynchrone.
Sur cette page
Le widget de réduction présente les instructions ou la référence générée pour un bon de réduction ou une méthode de paiement en espèces prise en charge. Il utilise un jeton de commande existant ; il ne crée pas ou ne paie pas une deuxième commande.
Cycle de vie du bon de réduction#
order_token to the platform SDK.Ouvrir le widget#
await DeunaSDK.initVoucherWidget({
orderToken,
language: 'en',
callbacks: {
onSuccess: (data) => showVoucherInstructions(data),
onError: (error) => showRecovery(error),
onClosed: () => showPaymentMethods(),
onPaymentProcessing: () => disableDuplicateActions(),
},
});await deunaSDK.initVoucherWidget({
orderToken,
mode: 'modal',
language: 'en',
callbacks: {
onSuccess: showVoucherInstructions,
onError: showRecovery,
onClosed: showPaymentMethods,
onDownloadFile: ({type, data}) => saveVoucher({type, data}),
},
});let callbacks = VoucherCallbacks()
callbacks.onSuccess = { data in showVoucherInstructions(data) }
callbacks.onError = { error in showRecovery(error) }
callbacks.onClosed = { _ in showPaymentMethods() }
deunaSDK.initVoucher(
orderToken: orderToken,
callbacks: callbacks,
language: "en"
)val callbacks = VoucherCallbacks().apply {
onSuccess = { data -> showVoucherInstructions(data) }
onError = { error -> showRecovery(error) }
onClosed = { showPaymentMethods() }
}
deunaSDK.initVoucherWidget(
context = this,
orderToken = orderToken,
callbacks = callbacks,
language = "en"
)Paramètres#
| Paramètre | Plateformes | Obligatoire | Objectif |
|---|---|---|---|
orderToken | Tous | Oui | Jeton pour la commande existante éligible au bon de réduction. |
callbacks | Tous | Oui | Succès, erreur, fermeture, événement et gestionnaires de paiement pris en charge. |
language | Tous | Non | Langue prise en charge du widget. Les types de widget Web acceptent actuellement en, es, ou pt. |
mode | Réagir à l'initié | Oui | modal ou le mode d'intégration embarquée pris en charge. |
fraudCredentials | Native + React Native | Non | Fournissez les informations d'identification du fournisseur uniquement lorsque le flux de fraude configuré l'exige. |
customUserAgent | iOS + Android | Non | Agent utilisateur WebView spécifique à l'application pour un besoin d'intégration approuvé. |
domain | Tous | Non | Paramètre d'environnement pour les tests contrôlés ; omettre dans les intégrations de production normales. |
État de finalisation et de paiement#
onSuccess signifie que l'expérience du bon de réduction a terminé son action client prise en charge. Le règlement du bon de réduction se produit généralement plus tard, en dehors de l'application. Conservez la commande en attente dans votre interface jusqu'à ce que votre backend observe l'état final via un webhook vérifié ou une récupération d'API.
| Situation | Message du client | Action du commerçant |
|---|---|---|
| Instructions affichées | "Utilisez ces instructions pour finaliser le paiement." | Conserver l'ID de la commande du commerçant et attendre un changement d'état. |
| Widget fermé | "Vous pouvez revenir à cette commande ultérieurement." | Ne pas annuler ou recréer automatiquement. Effectuer une réconciliation en premier. |
| Erreur réseau | "Nous n'avons pas pu charger le code promo." | Proposer une nouvelle tentative avec le même jeton de commande. |
| Code promo utilisé | "Paiement confirmé." | Valider uniquement après vérification côté serveur. |
| Code promo expiré ou rejeté | Expliquer l'étape suivante prise en compte. | Passer à un état terminal ou réessayable à partir de la réponse de l'API. |
Reçus et livraison de fichiers#
Une réponse de paiement de référence peut contenir un reference_processors tableau. Chaque entrée de processeur disponible peut fournir un code-barres, une date d'expiration, le nom du processeur et une URL de reçu HTML ou PDF hébergé. Étant donné que ce champ est un tableau, l'expérience de reçu hébergée peut présenter plusieurs reçus lorsque le paiement traité renvoie plusieurs références de processeurs.
Le processeur détermine quels champs de reçu sont présents. Ne pas synthétiser une URL PDF à partir d'un code-barres, ni supposer que chaque méthode de référence dispose à la fois des formats HTML et PDF.
| Plateforme | Télécharger les informations de propriété | Comportement d'intégration |
|---|---|---|
| Site Web | Widget et navigateur hébergés | Le widget présente l'action de reçu disponible. Le contrat actuel de rappel Web n'a pas de fonction de rappel de fichier dédiée. |
| Réagir à l'initié | Application du commerçant | onDownloadFile reçoit {type, data}. type est url lorsque le processeur fournit une URL de reçu, ou base64 lorsque l'SDK a capturé la vue actuelle du coupon. |
| Android | SDK natif | L'SDK télécharge l'URL de reçu fournie ou sauvegarde une version de secours lorsque le widget émet l'action de sauvegarde. Tester le comportement de stockage et de partage sur les versions Android prises en charge. |
| iOS | SDK natif | L'SDK télécharge l'URL de reçu fournie ou capture la vue actuelle comme sauvegarde. Tester l'expérience de sauvegarde/partage résultante sur les versions iOS prises en charge. |
Pour React Native, basculez sur le discriminateur au lieu de supposer que le payload est toujours un corps de fichier :
import {DownloadType} from '@deuna/react-native-sdk';
const onDownloadFile = async ({type, data}) => {
if (type === DownloadType.URL) {
await openTrustedReceiptUrl(data);
return;
}
await saveBase64VoucherImage(data);
};Validez toute URL avant de l'ouvrir ou de la récupérer, utilisez HTTPS, conservez les fichiers téléchargés dans un emplacement approprié et protégé ou sélectionné par l'utilisateur, et ne pas enregistrer le contenu des reçus. Un reçu enregistré est une preuve pour le client ; ce n'est pas une confirmation de règlement de paiement officielle.
Mobile et accessibilité#
- Afficher le code promo à partir d'un écran visible, et non d'un appel de fond.
- Assurer que les actions de téléchargement, de copie et de fermeture restent accessibles avec une taille de texte de 200 %.
- Sur React Native, demander uniquement les capacités de stockage ou de partage nécessaires à votre implémentation de sauvegarde.
- Restaurer le focus sur le contrôle qui a ouvert le modal et signaler les erreurs de chargement via l'API d'accessibilité de la plateforme.
- Tester avec de longs noms de commerçants, de longues instructions traduites et des appareils de petite taille.
Dépannage#
Le widget signale un jeton de commande invalide
Vérifier que la chaîne est non vide, qu'elle correspond à l'environnement sélectionné et qu'elle provient de la même commande que celle que vous souhaitez afficher. Ne communiquez pas votre clé API privée ou le corps de commande brut au client.
Aucune instruction concernant les bons de réduction n'est présente
Vérifiez que la commande et le mode de paiement sont configurés pour un processus de bons de réduction. Une commande de carte standard ne devient pas une commande de bons de réduction en ouvrant cet élément.
La fonction de rappel a été déclenchée, mais la commande est toujours en attente
Cela peut être attendu pour les méthodes de paiement en espèces et de bons de réduction. La fonction de rappel a terminé l'action de l'interface utilisateur, et non le règlement. Continuez à écouter l'état du backend vérifié.