Saltar al contenido principal
En esta página

Cada SDK de DEUNA devuelve resultados de la interfaz de usuario inmediatos a través de callbacks. El objeto de éxito exacto depende de la experiencia abierta, mientras que los errores, las acciones de cierre, la detección de BIN y la selección de instalación utilizan contratos más pequeños.

Anatomía de la respuesta#

01 · widget
Emitir un resultado local
El ciclo de vida activo invoca un callback.
02 · app
Actualizar la interfaz
Mostrar estado de confirmación, recuperación, carga o cierre.
03 · backend
Reconciliar el pedido
Obtener el estado actual o procesar un webhook verificado.
04 · business
Realizar una acción
Completar, reintentar o escalar desde el estado autorizado.

Matriz de callbacks#

CallbackCarga útilContrato
onSuccess(data)Ver el resultadoLos pagos y la siguiente acción suelen devolver datos del pedido; Elements devuelve datos de credenciales. Trátelos como datos del cliente hasta que se validen.
onError(error)Error normalizado del SDKLeer type, metadata.codey metadata.messageLos errores nativos de pago también pueden incluir una order.
onClosed(action, metadata?)Razón de cierreUso en la web userAction o systemAction; los SDK nativos exponen su acción de cierre. El cierre no es un éxito ni un fallo.
onEventDispatch(event, payload)Evento de ciclo de vidaSolo para análisis y diagnóstico. El payload varía según la experiencia.
onResize({height, width})Dimensiones del píxelRedimensionar hosts web o React Native incrustados.
onCardBinDetected(data)Selección de BINTipo web y React Native {cardBin, cardBrand}; los callbacks nativos exponen JSON.
onInstallmentSelected(data)Selección de cuotasTipo web y React Native {cardBin, installmentPlanOptionId}; los callbacks nativos exponen JSON.
onPaymentProcessing()Sin payloadBloquear la duplicación de la solicitud mientras el pago está en curso.

Tipos web y React Native#

Formas de callback públicasJavaScript
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;
};

Manejar los errores por categoría, manteniendo el código del proveedor o de la experiencia para el diagnóstico de soporte:

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});
  },
};

Tipos de error nativos#

Los SDKs de iOS y Android normalizan los errores de pago en PaymentsError con type, opcional metadata, y un opcional order snapshot.

CategoríaandroideiOSSignificado
ConectividadNO_INTERNET_CONNECTIONnoInternetConnectionEl dispositivo no puede acceder al servicio.
fichaINVALID_ORDER_TOKENinvalidOrderTokenEl token está vacío o es inválido para la experiencia.
InicializaciónINITIALIZATION_FAILEDinitializationFailedEl widget no se pudo preparar o mostrar.
RecuperaciónORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUNDorderCouldNotBeRetrieved, orderNotFoundNo se pudo encontrar el pedido. Reconciliar en el backend antes de intentar de nuevo.
PagoPAYMENT_ERRORpaymentErrorLa experiencia de pago reportó un error. Consulte los metadatos.
Navegación—errorWhileLoadingTheURLiOS no pudo cargar la URL del widget.
Cliente—userErroriOS recibió una categoría de error para el usuario.
AlternativaUNKNOWN_ERRORunknownErrorConserve los diagnósticos seguros y muestre una ruta de recuperación genérica.
androideKotlin
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)
}

El éxito es específico de la experiencia#

Experiencia¿Qué onSuccess representaSiguiente paso
Widget de pagoEl widget completó su flujo de compra y devuelve datos con forma de pedido.Reconcilie el pedido en su backend antes de la entrega.
Siguiente AcciónLa acción requerida del cliente se completó y devuelve datos con forma de pedido.Recupere el mismo pedido; no cree otro.
Elementos / Almacén de pagosSe completó un flujo de credenciales o billetera.Envie únicamente las credenciales o el resultado documentados a su flujo de backend.
valeSe completó la presentación del cupón o su acción compatible.Muestre las instrucciones, luego espere el estado de pago asíncrono autorizado.

El modelo de pedido evoluciona independientemente del flujo de llamadas de retorno del SDK. Utilice la referencia del punto final de la API para el esquema de backend actual en lugar de copiar campos arbitrarios de un payload del cliente.

Manejo de redimensionamiento incorporado#

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,
  },
});

Asegurar una altura mínima estable para el host mientras se carga el iframe, y luego permitir onResize actualizarlo. En pantallas pequeñas, evitar un ancho fijo en píxeles y permitir que el host ocupe todo el espacio de la pantalla.

Lista de verificación para un manejo seguro#

  • Mantener las funciones de devolución (callback) idempotentes; las señales de ciclo de vida pueden ocurrir cerca de la navegación o los reintentos.
  • Deshabilitar la doble presentación durante onPaymentProcessing y mientras submit() esté pendiente.
  • Mostrar texto legible por el usuario proveniente de una lista de aprobación. No exponer mensajes brutos del proveedor de forma predeterminada.
  • Registrar type, código de error seguro, versión del SDK, entorno y un ID de correlación del comerciante, pero no credenciales ni datos de tarjetas.
  • Restaurar el foco al cerrar un modal y anunciar errores a través de una región de notificación accesible.
  • Verificar el estado actual del pedido después de un cierre ambiguo, un tiempo de espera o una interrupción de la red.

Contratos de código abierto#

Las formas de devolución se verifican en comparación con las actuales Interfaces de devolución web, Interfaces de devolución React Native, Base de devolución para iOSy Devoluciones compartidas para Android. Utilice la versión instalada por su aplicación cuando se trata de un repositorio. main La rama es más reciente que la versión que has marcado como principal.