Comunicación local entre el PDV, el servicio/SDK y el PINPad
Integra TEF.
Tu operación presencial
potenciada con IOPAY
¡Aumentar tus ventas presenciales conectadas al finalizar TEF! Llevar el poder del control de la gestión de la tecnología Iopay a su operación
Una integración dividida en dos capas bien definidas
La captura en presencia de TEF ocurre localmente entre Tu Aplicaciónel componente Zoop y el PINPad El pago, sin embargo, sigue integrado en IOPAY Esto preserva una sola capa para la gestión de transacciones, activación de la terminal, eventos y webhooks
Use Zoop Desktop SDK o Zoop Desktop Server para Captura de TEF local. Sigue usando IOPAY APIs + webhooks para el resto del ciclo operativo y transaccional
Credenciación, cuenta, activación de terminal, transacción y webhooks
Mantén tus APIs y webhooks IOPAY y añade la captura local TEF
Quién hace qué en la integración
La separación a continuación evita que el uso del componente Zoop para captura local sea confundido con un cambio de la integración principal de la operación
| Parte | Responsabilidad en el proyecto |
|---|---|
| Tu Aplicación | Integrar la captura TEF con el Zoop Desktop SDK o Desktop Server y mantener la integración con las APIs y webhooks IOPAY |
| IOPAY | Credenciación de establecimiento, cuenta, activación del terminal por el portal, webhooks y flujo transaccional de la operación |
| SDK / servidor Zoop | Local de captura de TEF y comunicación entre su aplicación y el PINPad |
| PINPad / terminal | Dispositivo físico responsable de interactuar con la tarjeta y con el portador durante la captura |
Para este modelo de integración, siempre que el flujo de activación de Zoop solicite que un token sea confirmado en el — dashboard — , el enlace operativo debe completarse en portal IOPAY → Terminals de pago → Añadir Terminal.
SDK Embedded o Desktop Server
Hay dos formas documentadas de implementar la capa local Los dos conservan la misma arquitectura IOPAY para cuenta, activación y eventos
Biblioteca incorporada a su aplicación Indicado cuando el PDV puede consumir directamente el plugin y controlar la comunicación local con el terminal
Servicio local en segundo plano Su aplicación habla con él por WebSocket, normalmente en
ws://localhost:1337.
Desde el proyecto vacío al primer pago en cinco pasos
Prepare el proyecto y el terminal
Confirmar con IOPAY el terminal y el entorno de prueba Configurar el repositorio Maven de Zoop, seleccionar el artefacto correspondiente a su plataforma — JVM, Android o KMP — y agregar las dependencias auxiliares indicadas en la documentación oficial Usa la versión acordada para el proyecto
implementation(
"br.zoop.pos.plugin:zoop-pos-plugin-desktop-jvm:X.Y.Z"
)
La descarga de paquetes puede requerir un usuario GitHub y un PAT con permiso de lectura Este acceso es sólo para el desarrollo/distribución del artefacto y está separado de la autenticación de la terminal
Inicia sin credenciales de pago
En la primera activación, inicia Zoop sin el bloque de credenciales y conecta el DesktopPlugin. En JVM, también informe los datos de la aplicación cuando lo requiera la versión del SDK; el bloque
application no se aplica a Android
Zoop.initialize(context)
val desktopPlugin = DesktopPlugin(
Zoop.constructorParameters()
)
Zoop.plug(desktopPlugin)
Gerenciando el token y vinculando en el portal IOPAY
Crear la solicitud de activación con
createDashboardActivationRequestBuilder()trata el tokenCallback y envíe la solicitud con Zoop.post(). Mostrar el token al operador y usarlo en el portal IOPAY en
Terminal de pago → Añadir terminal. A continuación, espera la confirmación devuelta por el SDK
val activationRequest =
ZoopFoundationPlugin
.createDashboardActivationRequestBuilder()
.tokenCallback(/* receber e exibir o token */)
.confirmCallback(/* persistir dados confirmados */)
.build()
Zoop.post(activationRequest)
Persiste en la activación y autentique automáticamente
No es confirmCallbacksalvar los datos devueltos por la activación En las próximas inicializaciones, reutilice
marketplace, seller y
accessKey. La activación se realiza una vez por dispositivo mientras estos datos permanezcan válidos y disponibles
{
"marketplace": "<retornado-na-ativacao>",
"seller": "<retornado-na-ativacao>",
"accessKey": "<retornado-na-ativacao>"
}
Ejecutar el primer pago
Antes de vender, confirma la presencia de la clave de transacción en el PINPad A continuación, crea una venta con
DesktopPlugin.createPaymentRequestBuilder()Informar el valor en centavos, modalidad y parcelas aplicables y tratar mensajes, éxito, fracaso y finalización del flujo
Su aplicación no necesita solicitar ni introducir previamente claves de pago para activar cada terminal Los datos técnicos utilizados en las inicializaciones siguientes se obtienen en el flujo de activación y persisten por la aplicación misma
Zoop Desktop SDK integrado directamente en el PDV
En este enfoque, el componente de captura se encuentra dentro de su aplicación El plugin habla localmente con el PINPad, mientras que la operación sigue vinculada a la infraestructura IOPAY
Iniciación después de la activación
Después de que marketplace, seller y
accessKey si se han recuperado y persistido, utilice estos valores en tiempo de ejecución para reiniciar el SDK No deben ser digitados manualmente por el operador
Zoop.initialize(context) {
credentials {
marketplace = storedMarketplace
seller = storedSeller
accessKey = storedAccessKey
}
}
val desktopPlugin = DesktopPlugin(
Zoop.constructorParameters()
)
Zoop.plug(desktopPlugin)
Estado de integración
Inicia sin credenciales, genera tokens y espera enlace por el portal IOPAY
Su aplicación almacena marketplace, vendedor y accessKey de forma segura
Los datos guardados se reutilizan sin nueva digitación por el operador
El token nace en el SDK y el enlace se completa en IOPAY
La activación asocia el dispositivo a la cuenta correcta Este paso debe ocurrir antes de la primera transacción y debe probarse también después de reiniciar su aplicación
Su aplicación solicita la activación del componente Zoop y recibe un token temporal
El token se informa en Terminales de pago → Añadir terminal
El SDK devuelve los datos que su aplicación necesita persistir para futuras inicializaciones
Arreglar los datos devueltos de forma protegida Evitar marketplace, vendedor y accessKey en pantallas de usuario, registros de aplicaciones, telemetría abierta o depósitos de desarreglos
Consulte la clave de transacción antes de cobrar
La clave de transacción Zoop debe existir en el PINPad para que se ejecuten pagos con tarjeta Si está ausente, activa IOPAY para coordinar la corrección con el proveedor del equipo
No trates la ausencia de la clave como un error que solo puede recuperarse por software en el PDV El terminal necesita ser regularizado antes de la transacción
Ejemplo de cobro por tarjeta
val paymentRequest = DesktopPlugin
.createPaymentRequestBuilder()
.amount(1000) // R$ 10,00 — valor em centavos
.option(Option.CREDIT)
.installments(2)
.referenceId("pedido-84217")
.callback(/* tratar sucesso e falha */)
.build()
Zoop.post(paymentRequest)
Trabaja también los mensajes intermedios del flujo para mostrar al operador instrucciones como acercar, insertar o leer la tarjeta El retorno local permite al PDV seguir lo que está sucediendo en la terminal
Lo que persiste del resultado
Relaciona la transacción local con la solicitud y la operación acompañada por IOPAY
Preserve NSU and authorization code returned for reconciliation and support
Guardar los datos de comprobante disponibles en la versión del SDK en uso
El llamado de vuelta onComplete indica que el flujo ha terminado, incluso cuando hubo falla Considere el pago aprobado solo a partir del correspondiente retorno de éxito y correlacione el resultado con la operación de IOPAY
Alternativa a través de WebSocket local
Zoop Desktop Server se ejecuta como un servicio local y expone un WebSocket para su aplicación Su alcance sigue siendo la captura TEF Acreditación, cuenta, webhooks y flujo de transacciones permanecen en las plataformas IOPAY
Instalar y iniciar el servicio
Obtener el instalador en los lanzamientos oficiales de Zoop En las instalaciones de Windows y Linux descritas en la guía, prepare Java/JDK 17, validar con
java -version y mantenga el servidor en ejecución en la estación conectada al PINPad
java -version
Conecta tu aplicación
Cuando su aplicación y el servidor de escritorio estén en la misma máquina, conecte a la dirección local de abajo Trabajar con la apertura, mensajes, errores y cierre del socket
ws://localhost:1337
const socket = new WebSocket('ws://localhost:1337');
socket.onopen = () => {
console.log('Desktop Server conectado');
};
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
handleZoopMessage(message);
};
socket.onerror = (error) => {
handleSocketError(error);
};
socket.onclose = () => {
handleSocketClosed();
};
Inicie la activación
Envía {"type":"activation"}. Cuando el servidor responde con estado
tokenPresenta el campo
token y concluye el enlace en el portal IOPAY Guardar el estado
success.
{
"type": "activation"
}
En el éxito, persista marketplace,
seller y accessKey para las próximas inicializaciones
Iniciar con los datos recuperados
Envía el mensaje initialize utilizando exactamente los valores almacenados después de la activación. El campo devicePort es opcional; cuando se omite, el servidor puede detectar el PINPad automáticamente. Espera un poco. status: success
antes de permitir las transacciones
{
"type": "initialize",
"marketplace": "<valor recebido na ativacao>",
"seller": "<valor recebido na ativacao>",
"accessKey": "<valor recebido na ativacao>"
}
Implementar la captura en el VDP
Utilice los esquemas JSON documentados por el servidor de escritorio para comandos locales de captura y trate todas las devoluciones La respuesta local sirve para conducir la experiencia en PINPad; la gestión de transacciones y los webhooks continúan por IOPAY
<valor recebido na ativacao> representa los datos persistidos por su aplicación No son información que el operador debe escribir en cada inicialización
Tu Aplicación sigue recibiendo eventos de IOPAY.
Agregar TEF no cambia el contrato de integración asíncrona: Su aplicación sigue recibiendo por IOPAY los webhooks de cada evento y transacción según la integración contratada La devolución local del SDK/Server complementa la experiencia del PDV; no elimina la capa de eventos IOPAY
Transacciones, actualizaciones operativas y eventos de integración
Mantén tu webhook endpoint y correlaciona los eventos con la solicitud, terminal y transacción local
Modelo de correlación recomendado
Use un identificador propio para conectar el pago a la solicitud de su aplicación cuando esté disponible
Preserva los identificadores devueltos por el flujo local de la terminal
Actualizar el estado de la operación con los eventos recibidos por la integración IOPAY
El componente TEF es local, pero su aplicación no necesita abandonar el flujo ya existente de APIs y webhooks IOPAY Continuar validando los webhooks de cada evento y transacción durante la homologación
Exercita fallas antes de homologar
No válida sólo el escenario de aprobación El piloto debe contemplar fallas de comunicación, token expirado, interrupción durante la captura, reinicio de la aplicación y cancelaciones
Cuando se aplica al flujo local, use los comandos documentados por el SDK para interrumpir/cancelar una operación en curso
El servidor tiene sus propios flujos de cancelación y mensajes de estado Trata el inicio, la selección, el éxito, el fracaso y la finalización de acuerdo con la documentación de la versión utilizada
Valida la cancelación también en el flujo transaccional IOPAY Antes de repetir un cobro después de fallas de comunicación, confirme el estado real de la transacción para evitar duplicidades
Datos de activación deben permanecer fuera de la interfaz y de los registros
marketplace, vendedor y accessKey son parte del arranque técnico del dispositivo Su aplicación debe protegerlos y usarlos automáticamente después de su activación
Usa un mecanismo local apropiado para la plataforma y restringe el acceso a los procesos que realmente necesitan los datos
No grabar accessKey o datos equivalentes en logs, traces, mensajes de error o análisis
La activación es técnica El operador no debe tener que copiar credenciales para vender
Checklist antes de liberar al piloto
Acreditación, cuenta y flujo transaccional continúan por las plataformas IOPAY, con webhooks validados para los eventos y transacciones de integración
Confirmar la vinculación en Terminales de pago → Añadir terminal y reiniciar su aplicación para validar el uso de los datos guardados
Mostrar mensajes del SDK, diferenciar el éxito de la simple terminación del flujo y preservar transactionId, NSU, código de autorización y comprobantes/datos de recibo
Teste de falla de comunicación, caducidad del token, interrupción de captura y cancelaciones en el flujo IOPAY y en la capa local cuando corresponda
Confirmar la presencia de la clave transaccional antes de la primera venta Si está ausente, haga clic en IOPAY para coordinar la corrección con el proveedor
Datos de activación almacenados de forma protegida y ausentes de pantallas, registros y telemetría indebida
Documentación oficial para la implementación
Use las guías siguientes como referencia técnica de la versión del componente instalado en el proyecto Parámetros, compatibilidad, versiones y protocolos pueden evolucionar; siempre valida la documentación oficial durante la implementación
El flujo se ha estructurado a partir de la guía técnica IOPAY de integración TEF y de las referencias públicas de Zoop Usa la versión homologada para el proyecto y confirma los parámetros completos en las guías oficiales en el momento de la implementación
¿Listo para homologar el primer terminal?
Generar el token por el SDK o Desktop Server, vincular el terminal en el portal IOPAY y validar el flujo completo — captura local, transacción y webhooks — antes de seguir a la producción

