Réponses et appels de retour du SDK
Gérez de manière cohérente les appels de retour de succès, d'erreur, de fermeture, de redimensionnement, de BIN, d'installation et de traitement pour tous les SDK DEUNA.
Sur cette page
Chaque SDK DEUNA renvoie des résultats UI immédiats via des appels de retour. L'objet de succès exact dépend de l'expérience ouverte, tandis que les actions de fermeture, la détection de BIN et la sélection d'installations utilisent des contrats plus petits.
Anatomie de la réponse#
Matrice de notifications#
| Notification | Charge utile | Contrat |
|---|---|---|
onSuccess(data) | Visualiser le résultat | Les résultats de paiement et "Next Action" renvoient généralement des données de commande, tandis que "Elements" renvoie des données de credential. Traitez ces données comme des données client jusqu'à leur validation. |
onError(error) | Erreur SDK normalisée | Lire type, metadata.codeet metadata.messageLes erreurs natives peuvent également inclure une order. |
onClosed(action, metadata?) | Raison de fermeture | Utilisation Web userAction ou systemAction; les SDK natifs exposent leur action de fermeture de type. La fermeture n'est ni un succès ni un échec. |
onEventDispatch(event, payload) | Événement de cycle de vie brut | Uniquement pour l'analyse et le diagnostic. Le payload varie en fonction de l'expérience. |
onResize({height, width}) | Dimensions du pixel | Redimensionner les hôtes Web ou React Native intégrés. |
onCardBinDetected(data) | Sélection de BIN | Type Web et React Native {cardBin, cardBrand}; Les appels de rappel natifs exposent en JSON. |
onInstallmentSelected(data) | Sélection des échéances | Type Web et React Native {cardBin, installmentPlanOptionId}; Les appels de rappel natifs exposent en JSON. |
onPaymentProcessing() | Aucun payload | Empêcher les soumissions dupliquées pendant le traitement du paiement. |
Types Web et React Native#
type ClosedAction = 'userAction' | 'systemAction';
type SdkError = {
type: string;
metadata: {
code: string;
message: string;
};
};
type CardBinDetected = {
cardBin: string;
cardBrand: string;
};
type InstallmentSelected = {
cardBin: string;
installmentPlanOptionId: string;
};
type Dimensions = {
height: number;
width: number;
};Gérer les erreurs par catégorie, tout en conservant le code du fournisseur ou de l'expérience pour le diagnostic technique :
const callbacks = {
onSuccess: async (data) => {
setCheckoutState('verifying');
const verifiedOrder = await fetch(`/api/orders/${merchantOrderId}`).then(r => r.json());
renderFromAuthoritativeState(verifiedOrder);
},
onError: ({type, metadata}) => {
logSafeDiagnostic({type, code: metadata.code});
showRecoveryMessage(type, metadata.code);
},
onClosed: (action, metadata) => {
restorePaymentMethods();
if (metadata) logSafeDiagnostic({action, code: metadata.code});
},
};Types d'erreurs natifs#
Les SDK iOS et Android normalisent les erreurs de paiement en PaymentsError et type, facultatif metadata, et un résultat facultatif order snapshot.
| Catégorie | Android | iOS | Signification |
|---|---|---|---|
| Connectivité | NO_INTERNET_CONNECTION | noInternetConnection | L'appareil ne peut pas accéder au service. |
| Jeton | INVALID_ORDER_TOKEN | invalidOrderToken | Le jeton est vide ou invalide pour l'expérience. |
| Initialisation | INITIALIZATION_FAILED | initializationFailed | Le widget n'a pas pu être préparé ou présenté. |
| Récupération | ORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUND | orderCouldNotBeRetrieved, orderNotFound | La recherche de la commande a échoué. Réconcilier côté serveur avant de réessayer. |
| Paiement | PAYMENT_ERROR | paymentError | L'expérience de paiement a signalé une erreur. Consulter les métadonnées. |
| Navigation | — | errorWhileLoadingTheURL | iOS n'a pas pu charger l'URL du widget. |
| Client | — | userError | iOS a reçu une catégorie d'erreur destinée à l'utilisateur. |
| Récupération | UNKNOWN_ERROR | unknownError | Conserver les informations de diagnostic et afficher un chemin de récupération générique. |
callbacks.onError = { error ->
val code = error.metadata?.code ?: "UNKNOWN_ERROR"
logger.warn("DEUNA SDK error", mapOf("type" to error.type.name, "code" to code))
renderRecovery(error.type)
}callbacks.onError = { error in
let code = error.metadata?.code ?? "UNKNOWN_ERROR"
logger.warning("DEUNA SDK error: \(error.type) / \(code)")
renderRecovery(error.type)
}Le succès est spécifique à l'expérience#
| Expérience | Que onSuccess représente | Prochaine étape |
|---|---|---|
| Widget de paiement | Le widget a terminé son parcours d'achat et renvoie des données de commande. | Réconcilier la commande sur votre serveur avant la livraison. |
| Prochaine étape | L'action requise du client est terminée et renvoie des données de commande. | Récupérer la même commande ; ne créez pas une autre. |
| Éléments / Coffre-fort de paiement | Un flux de credential ou de wallet est terminé. | Envoyez uniquement les credentials ou résultats documentés à votre flux côté serveur. |
| Bon de réduction | La présentation ou l'action supportée d'un bon de réduction est terminée. | Affichez les instructions, puis attendez le statut de paiement asynchrone. |
Le modèle de commande évolue indépendamment du système de rappel des SDK. Utilisez le endpoint API afin de correspondre au schéma backend actuel plutôt que de copier des champs arbitraires provenant d'un payload client.
Gestion intégrée de la redimensionnement#
const host = document.querySelector('#deuna-widget');
await DeunaSDK.initPaymentWidget({
orderToken,
mode: 'target',
target: '#deuna-widget',
callbacks: {
onResize: ({height}) => {
host.style.height = `${Math.ceil(height)}px`;
},
onSuccess: verifyOrder,
onError: showRecovery,
},
});Assurez une hauteur minimale stable à l'hôte pendant le chargement de l'iframe, puis... onResize Mettez-le à jour. Sur les petits écrans, évitez une largeur fixe en pixels et permettez à l'hôte de remplir la fenêtre d'affichage.
Vérification de sécurité#
- Assurez-vous que les fonctions de rappel sont idempotentes; les signaux de cycle de vie peuvent se produire lors de la navigation ou des tentatives.
- Désactivez la soumission en double pendant
onPaymentProcessinget lorsquesubmit()est en attente. - Affichez une représentation lisible par l'utilisateur à partir d'une liste blanche. Ne divulguez pas les messages bruts du fournisseur par défaut.
- Journal
type, code d'erreur sécurisé, version du SDK, environnement et ID de corrélation du commerçant – sans informations d'identification ni données de carte. - Restaurer le focus lors de la fermeture d'une fenêtre modale et annoncer les erreurs via une zone accessible en temps réel.
- Vérifiez l'état actuel de la commande après une fermeture ambiguë, un délai d'attente ou une interruption du réseau.
Contrats de sources publiques#
Les formats de retour sont vérifiés par rapport à la configuration actuelle. Interfaces de rappel web, Interfaces de rappel React Native, Base de gestion des appels de retour pour iOSet Appels de retour partagés pour Android. Utilisez la version installée par votre application lors de l'utilisation d'un référentiel. main La branche est plus récente que votre version stable.