Respuestas y callbacks del SDK
Manejar de forma consistente los callbacks de éxito, error, cierre, redimensionamiento, BIN, instalación y procesamiento en todos los SDK de DEUNA.
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#
Matriz de callbacks#
| Callback | Carga útil | Contrato |
|---|---|---|
onSuccess(data) | Ver el resultado | Los 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 SDK | Leer type, metadata.codey metadata.messageLos errores nativos de pago también pueden incluir una order. |
onClosed(action, metadata?) | Razón de cierre | Uso 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 vida | Solo para análisis y diagnóstico. El payload varía según la experiencia. |
onResize({height, width}) | Dimensiones del píxel | Redimensionar hosts web o React Native incrustados. |
onCardBinDetected(data) | Selección de BIN | Tipo web y React Native {cardBin, cardBrand}; los callbacks nativos exponen JSON. |
onInstallmentSelected(data) | Selección de cuotas | Tipo web y React Native {cardBin, installmentPlanOptionId}; los callbacks nativos exponen JSON. |
onPaymentProcessing() | Sin payload | Bloquear la duplicación de la solicitud mientras el pago está en curso. |
Tipos web y 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;
};Manejar los errores por categoría, manteniendo el código del proveedor o de la experiencia para el diagnóstico de soporte:
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ía | androide | iOS | Significado |
|---|---|---|---|
| Conectividad | NO_INTERNET_CONNECTION | noInternetConnection | El dispositivo no puede acceder al servicio. |
| ficha | INVALID_ORDER_TOKEN | invalidOrderToken | El token está vacío o es inválido para la experiencia. |
| Inicialización | INITIALIZATION_FAILED | initializationFailed | El widget no se pudo preparar o mostrar. |
| Recuperación | ORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUND | orderCouldNotBeRetrieved, orderNotFound | No se pudo encontrar el pedido. Reconciliar en el backend antes de intentar de nuevo. |
| Pago | PAYMENT_ERROR | paymentError | La experiencia de pago reportó un error. Consulte los metadatos. |
| Navegación | — | errorWhileLoadingTheURL | iOS no pudo cargar la URL del widget. |
| Cliente | — | userError | iOS recibió una categoría de error para el usuario. |
| Alternativa | UNKNOWN_ERROR | unknownError | Conserve los diagnósticos seguros y muestre una ruta de recuperación genérica. |
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)
}El éxito es específico de la experiencia#
| Experiencia | ¿Qué onSuccess representa | Siguiente paso |
|---|---|---|
| Widget de pago | El 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ón | La 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 pagos | Se completó un flujo de credenciales o billetera. | Envie únicamente las credenciales o el resultado documentados a su flujo de backend. |
| vale | Se 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#
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
onPaymentProcessingy mientrassubmit()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.