Widget de cupones
Presentar el cupón y las instrucciones de pago en efectivo en Web, iOS, Android y React Native, y confirmar el pago de forma asíncrona.
En esta página
El widget del cupón presenta las instrucciones o la referencia generada para un cupón o método de pago en efectivo compatible. Utiliza un token de pedido existente; no crea ni paga un segundo pedido.
Ciclo de vida del cupón#
order_token to the platform SDK.Abrir el widget#
await DeunaSDK.initVoucherWidget({
orderToken,
language: 'en',
callbacks: {
onSuccess: (data) => showVoucherInstructions(data),
onError: (error) => showRecovery(error),
onClosed: () => showPaymentMethods(),
onPaymentProcessing: () => disableDuplicateActions(),
},
});await deunaSDK.initVoucherWidget({
orderToken,
mode: 'modal',
language: 'en',
callbacks: {
onSuccess: showVoucherInstructions,
onError: showRecovery,
onClosed: showPaymentMethods,
onDownloadFile: ({type, data}) => saveVoucher({type, data}),
},
});let callbacks = VoucherCallbacks()
callbacks.onSuccess = { data in showVoucherInstructions(data) }
callbacks.onError = { error in showRecovery(error) }
callbacks.onClosed = { _ in showPaymentMethods() }
deunaSDK.initVoucher(
orderToken: orderToken,
callbacks: callbacks,
language: "en"
)val callbacks = VoucherCallbacks().apply {
onSuccess = { data -> showVoucherInstructions(data) }
onError = { error -> showRecovery(error) }
onClosed = { showPaymentMethods() }
}
deunaSDK.initVoucherWidget(
context = this,
orderToken = orderToken,
callbacks = callbacks,
language = "en"
)Parámetros#
| Parámetro | Plataformas | Requerido | Propósito |
|---|---|---|---|
orderToken | Todos | Sí | Token para el pedido existente elegible para el cupón. |
callbacks | Todos | Sí | Éxito, error, cerrar, evento y manejadores de procesamiento de pagos compatibles. |
language | Todos | No | Idioma compatible del widget. Los tipos de Web actualmente aceptan en, eso pt. |
mode | Reaccionar nativo | Sí | modal o el modo de renderizador integrado compatible. |
fraudCredentials | Nativo + React Native | No | Credenciales del proveedor solo cuando el flujo de fraude configurado lo requiere. |
customUserAgent | iOS + Android | No | Agente de usuario WebView específico de la aplicación para una necesidad de integración aprobada. |
domain | Todos | No | Sobreescritura del entorno para pruebas controladas; omitir en integraciones de producción normales. |
Finalización y estado de pago#
onSuccess significa que la experiencia del cupón ha completado su acción del cliente compatible. El cobro del cupón suele ocurrir más tarde, fuera de la aplicación. Mantenga el pedido pendiente en su interfaz hasta que su parte posterior observe el estado final a través de un webhook verificado o una recuperación de API.
| Situación | Mensaje del cliente | Acción del comerciante |
|---|---|---|
| Instrucciones mostradas | "Utilice estas instrucciones para completar el pago." | Persistir el ID del pedido del comerciante y esperar un cambio de estado. |
| Widget cerrado | "Puede volver a este pedido más tarde." | No cancelar ni recrear automáticamente. Reconciliar primero. |
| Error de red | "No pudimos cargar el cupón." | Ofrecer un reintento con el mismo token de pedido. |
| Cupón pagado | "Pago confirmado." | Complete solo después de la verificación en el backend. |
| Vale expirado o rechazado | Explique el siguiente paso admitido. | Vaya a un estado terminal o intencional desde la respuesta de la API. |
Recibos y entrega de archivos#
Una respuesta de pago de referencia puede contener un reference_processors array. Cada entrada de procesador disponible puede proporcionar un código de barras, fecha de vencimiento, nombre del procesador y la URL del recibo HTML o PDF alojado. Debido a que este campo es un array, la experiencia de recibos alojados puede presentar múltiples recibos cuando el pago procesado devuelve múltiples referencias de procesadores.
El procesador determina qué campos de la factura están presentes. No se debe generar una URL de PDF a partir de un código de barras ni asumir que todos los métodos de referencia tienen formatos HTML y PDF.
| Ver abajo. Esta es la que afecta a tu factura. | Descargar la propiedad | Comportamiento de integración |
|---|---|---|
| Web | Widget y navegador alojados | El widget muestra la acción disponible para la factura. El contrato actual de devolución web no tiene una devolución de archivo dedicada. |
| Reaccionar nativo | Aplicación del comerciante | onDownloadFile recibe {type, data}. type es url cuando el procesador proporciona una URL de factura, o base64 cuando el SDK captura la vista actual del cupón. |
| androide | SDK nativo | El SDK descarga la URL de factura proporcionada o guarda una copia de seguridad cuando el widget emite la acción de guardar. Pruebe el comportamiento de almacenamiento y compartición en versiones de Android compatibles. |
| iOS | SDK nativo | El SDK descarga la URL de factura proporcionada o captura la vista actual como respaldo. Pruebe la experiencia resultante de guardar/compartir en versiones de iOS compatibles. |
Para React Native, verifique el discriminador en lugar de asumir que el payload es siempre un cuerpo de archivo:
import {DownloadType} from '@deuna/react-native-sdk';
const onDownloadFile = async ({type, data}) => {
if (type === DownloadType.URL) {
await openTrustedReceiptUrl(data);
return;
}
await saveBase64VoucherImage(data);
};Valide cualquier URL antes de abrirla o recuperarla, utilice HTTPS, mantenga los archivos descargados en una ubicación protegida o seleccionada por el usuario, y no registre el contenido de la factura. Una factura guardada es evidencia para el cliente; no es una confirmación de pago autoritativa.
Móvil y accesibilidad#
- Presente el Vale desde una pantalla visible, no desde una llamada de retorno de fondo.
- Mantenga las acciones de descarga, copia y cierre accesibles con un tamaño de texto del 200%.
- En React Native, solicite solo la capacidad de almacenamiento o compartir necesaria para su implementación de guardado.
- Devuelva el foco al control que abrió el modal y anuncie los errores de carga a través de la API de accesibilidad de la plataforma.
- Pruebe la referencia con nombres de comerciantes largos, instrucciones localizadas largas y dispositivos estrechos.
Resolución de problemas#
El widget informa de un token de pedido inválido
Verifique que la cadena no esté vacía, pertenezca al entorno seleccionado y provenga del mismo pedido que desea mostrar. No intercambie una clave API privada ni el cuerpo del pedido con el cliente.
No aparecen instrucciones para el vale
Verifique que la confirmación del pedido y el método de pago estén configurados para un flujo de vales. Un pedido de tarjeta estándar no se convierte en un pedido de vale simplemente abriendo este widget.
Se ha disparado la llamada de retorno, pero el pedido sigue pendiente.
Esto es normal para los métodos de pago en efectivo y vales. La llamada de retorno completó la acción de la interfaz de usuario, no el procesamiento del pago. Siga escuchando el estado verificado del backend.