Risposte e callback del SDK
Gestire in modo coerente i callback di successo, errore, chiusura, ridimensionamento, BIN, rateizzazione e elaborazione, in tutti i DEUNA SDK.
In questa pagina
Ogni DEUNA SDK restituisce risultati immediati nell'interfaccia utente tramite callback. L'oggetto di successo esatto dipende dall'esperienza aperta, mentre errori, azioni di chiusura, rilevamento BIN e selezione della rateizzazione utilizzano contratti più piccoli.
Struttura della risposta#
Matrice dei callback#
| Callback | Pagamento | Contratto |
|---|---|---|
onSuccess(data) | Risultato dell'esperienza | Payment e Next Action restituiscono dati dell'ordine; Elements restituisce dati dei credenziali. Trattare questi dati come dati client fino alla riconciliazione. |
onError(error) | Errore SDK normalizzato | Leggi type, metadata.codee metadata.messageGli errori di pagamento nativi possono includere anche order. |
onClosed(action, metadata?) | Motivo della chiusura | Utilizzato per userAction o systemAction; le SDK native espongono la loro azione di chiusura. La chiusura non è un successo o un fallimento. |
onEventDispatch(event, payload) | Evento di ciclo di vita grezzo | Solo per analisi e diagnostica. Il payload varia a seconda dell'esperienza. |
onResize({height, width}) | Dimensioni dei pixel | Ridimensionare gli host Web o React Native integrati. |
onCardBinDetected(data) | Selezione BIN | Web e React Native type {cardBin, cardBrand}; Le callback native espongono in formato JSON. |
onInstallmentSelected(data) | Selezione del piano di pagamento | Web e React Native type {cardBin, installmentPlanOptionId}; Le callback native espongono in formato JSON. |
onPaymentProcessing() | Nessun payload | Blocca la duplicazione della richiesta durante l'elaborazione del pagamento. |
Tipi Web e 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;
};Gestisci gli errori per categoria, mantenendo il codice del provider o dell'esperienza per la diagnostica di supporto:
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});
},
};Tipi di errore nativi#
Gli SDK per iOS e Android normalizzano gli errori di pagamento in PaymentsError con type, opzionale metadatae un opzionale order snapshot.
| Categoria | Android | iOS | Significato |
|---|---|---|---|
| Connettività | NO_INTERNET_CONNECTION | noInternetConnection | Il dispositivo non riesce a raggiungere il servizio. |
| Token | INVALID_ORDER_TOKEN | invalidOrderToken | Il token è vuoto o non valido per l'esperienza. |
| Inizializzazione | INITIALIZATION_FAILED | initializationFailed | Il widget non è stato preparato o visualizzato. |
| Recupero | ORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUND | orderCouldNotBeRetrieved, orderNotFound | La ricerca dell'ordine non è riuscita. Riconcilia sul backend prima di riprovare. |
| Pagamento | PAYMENT_ERROR | paymentError | L'esperienza di pagamento ha segnalato un errore. Leggi i metadati. |
| Navigazione | — | errorWhileLoadingTheURL | iOS non è riuscito a caricare l'URL del widget. |
| Cliente | — | userError | iOS ha ricevuto una categoria di errore per l'utente. |
| Fallback | UNKNOWN_ERROR | unknownError | Conserva le informazioni diagnostiche e mostra un percorso di ripristino generico. |
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)
}Il successo è specifico per l'esperienza#
| Esperienza | Cosa onSuccess rappresenta | Passo successivo |
|---|---|---|
| Widget di pagamento | Il widget ha completato il suo percorso di acquisto e restituisce dati a forma di ordine. | Riconcilia l'ordine sul tuo backend prima della spedizione. |
| Prossimo passo | L'azione richiesta del cliente è stata completata e restituisce dati a forma di ordine. | Recupera lo stesso ordine; non crearne uno nuovo. |
| Elementi / Portafoglio | Un flusso di credenziali o portafoglio è stato completato. | Invia solo le credenziali o i risultati documentati al tuo flusso backend. |
| Voucher | La presentazione o l'azione supportata di un buono è stata completata. | Mostra le istruzioni, quindi attendi lo stato di pagamento asincrono autorizzato. |
Il modello dell'ordine si evolve in modo indipendente dal flusso di callback dell'SDK. Utilizza il endpoint API di riferimento per lo schema backend corrente, anziché copiare campi arbitrari da un payload del client.
Gestione integrata del ridimensionamento#
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,
},
});Fornire all'host un'altezza minima stabile mentre l'iframe viene caricato, quindi consentire onResize di aggiornarla. Su schermi piccoli, evitare una larghezza fissa in pixel e consentire all'host di riempire l'area di visualizzazione.
Controllo di sicurezza#
- Mantenere le funzioni di callback idempotenti; i segnali di ciclo di vita possono verificarsi durante la navigazione o i tentativi di ripristino.
- Disabilitare la duplicazione durante
onPaymentProcessinge mentresubmit()è in attesa. - Visualizzare una copia leggibile dall'utente da un elenco consentito. Non esporre i messaggi del provider grezzi per impostazione predefinita.
- Log
type, codice di errore sicuro, versione SDK, ambiente e ID di correlazione del commerciante – non credenziali o dati della carta. - Ripristina il focus quando una finestra modale si chiude e comunica gli errori tramite una regione di notifica accessibile.
- Verificare lo stato attuale dell'ordine dopo una chiusura ambigua, un timeout o un'interruzione di rete.
Contratti di origine pubblica#
Le forme di callback vengono verificate rispetto allo stato corrente. Interfacce di callback web, Interfacce di callback per React Native, Base di callback per iOSe Callback condivisi per Android. Utilizzare la versione installata dalla tua applicazione quando si utilizza un repository. main Ramo più recente rispetto alla versione "pinned".