Passa al contenuto principale
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#

01 · widget
Emettere un risultato locale
L'esperienza attiva invoca un callback.
02 · app
Aggiornare l'interfaccia
Mostrare stato di conferma, recupero, caricamento o chiusura.
03 · backend
Riconciliare l'ordine
Recuperare lo stato corrente o elaborare un webhook verificato.
04 · business
Agire una sola volta
Completare, riprovare o scalare da uno stato autoritativo.

Matrice dei callback#

CallbackPagamentoContratto
onSuccess(data)Risultato dell'esperienzaPayment 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 normalizzatoLeggi type, metadata.codee metadata.messageGli errori di pagamento nativi possono includere anche order.
onClosed(action, metadata?)Motivo della chiusuraUtilizzato 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 grezzoSolo per analisi e diagnostica. Il payload varia a seconda dell'esperienza.
onResize({height, width})Dimensioni dei pixelRidimensionare gli host Web o React Native integrati.
onCardBinDetected(data)Selezione BINWeb e React Native type {cardBin, cardBrand}; Le callback native espongono in formato JSON.
onInstallmentSelected(data)Selezione del piano di pagamentoWeb e React Native type {cardBin, installmentPlanOptionId}; Le callback native espongono in formato JSON.
onPaymentProcessing()Nessun payloadBlocca la duplicazione della richiesta durante l'elaborazione del pagamento.

Tipi Web e React Native#

Forme di callback pubblicheJavaScript
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:

JavaScript
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.

CategoriaAndroidiOSSignificato
ConnettivitàNO_INTERNET_CONNECTIONnoInternetConnectionIl dispositivo non riesce a raggiungere il servizio.
TokenINVALID_ORDER_TOKENinvalidOrderTokenIl token è vuoto o non valido per l'esperienza.
InizializzazioneINITIALIZATION_FAILEDinitializationFailedIl widget non è stato preparato o visualizzato.
RecuperoORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUNDorderCouldNotBeRetrieved, orderNotFoundLa ricerca dell'ordine non è riuscita. Riconcilia sul backend prima di riprovare.
PagamentoPAYMENT_ERRORpaymentErrorL'esperienza di pagamento ha segnalato un errore. Leggi i metadati.
Navigazione—errorWhileLoadingTheURLiOS non è riuscito a caricare l'URL del widget.
Cliente—userErroriOS ha ricevuto una categoria di errore per l'utente.
FallbackUNKNOWN_ERRORunknownErrorConserva le informazioni diagnostiche e mostra un percorso di ripristino generico.
AndroidKotlin
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)
}
iOSSwift
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#

EsperienzaCosa onSuccess rappresentaPasso successivo
Widget di pagamentoIl 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 passoL'azione richiesta del cliente è stata completata e restituisce dati a forma di ordine.Recupera lo stesso ordine; non crearne uno nuovo.
Elementi / PortafoglioUn flusso di credenziali o portafoglio è stato completato.Invia solo le credenziali o i risultati documentati al tuo flusso backend.
VoucherLa 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#

JavaScript
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 onPaymentProcessing e mentre submit() è 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".