Comunicação local entre o PDV, o serviço/SDK e o PINPad.
Integre TEF & PinPads
A sua operação física
potencializada com Iopay
Potencialize as suas vendas presenciais conectadas através de terminar TEF! Traga o poder do controle da gestão da tecnologia Iopay para a sua operação
Uma integração dividida em duas camadas bem definidas.
A captura presencial TEF acontece localmente entre Sua Aplicação, o componente Zoop e o PINPad. A operação de pagamentos, porém, continua integrada à IOPAY. Isso preserva uma única camada para conta, gestão transacional, ativação do terminal, eventos e webhooks.
Use o Zoop Desktop SDK ou o Zoop Desktop Server para captura TEF local. Continue usando IOPAY APIs + webhooks para o restante do ciclo operacional e transacional.
Credenciamento, conta, ativação do terminal, transacional e webhooks.
Mantém suas APIs e webhooks IOPAY e adiciona a captura TEF local.
Quem faz o quê na integração.
A separação abaixo evita que o uso do componente Zoop para captura local seja confundido com uma troca da integração principal da operação.
| Parte | Responsabilidade no projeto |
|---|---|
| Sua Aplicação | Integrar a captura TEF com o Zoop Desktop SDK ou Desktop Server e manter a integração com as APIs e webhooks IOPAY. |
| IOPAY | Credenciamento do estabelecimento, conta, ativação do terminal pelo portal, webhooks e fluxo transacional da operação. |
| SDK / Server Zoop | Camada local de captura TEF e comunicação entre Sua Aplicação e o PINPad. |
| PINPad / terminal | Dispositivo físico responsável pela interação com o cartão e com o portador durante a captura. |
Para este modelo de integração, sempre que o fluxo de ativação da Zoop pedir que um token seja confirmado no “dashboard”, a vinculação operacional deve ser concluída no portal IOPAY → Terminais de Pagamento → Adicionar Terminal.
SDK Embedded ou Desktop Server.
Há duas formas documentadas de implementar a camada local. As duas preservam a mesma arquitetura IOPAY para conta, ativação e eventos.
Biblioteca incorporada à Sua Aplicação. Indicada quando o PDV pode consumir diretamente o plugin e controlar a comunicação local com o terminal.
Serviço local em segundo plano. Sua Aplicação conversa
com ele por WebSocket, normalmente em
ws://localhost:1337.
Do projeto vazio ao primeiro pagamento em cinco passos.
Prepare o projeto e o terminal
Confirme com a IOPAY o terminal e o ambiente de testes. Configure o repositório Maven da Zoop, selecione o artefato correspondente à sua plataforma JVM, Android ou KMP e adicione as dependências auxiliares indicadas na documentação oficial. Use a versão acordada para o projeto.
implementation(
"br.zoop.pos.plugin:zoop-pos-plugin-desktop-jvm:X.Y.Z"
)
O download dos pacotes pode exigir usuário GitHub e um PAT com permissão de leitura. Esse acesso é apenas para desenvolvimento/distribuição do artefato e é separado da autenticação do terminal.
Inicialize sem credenciais de pagamento
Na primeira ativação, inicialize a Zoop sem o bloco de
credenciais e conecte o DesktopPlugin.
Em JVM, informe também os dados da aplicação quando
exigidos pela versão do SDK; o bloco
application não se aplica ao Android.
Zoop.initialize(context)
val desktopPlugin = DesktopPlugin(
Zoop.constructorParameters()
)
Zoop.plug(desktopPlugin)
Gere o token e vincule no portal IOPAY
Crie a requisição de ativação com
createDashboardActivationRequestBuilder(),
trate o tokenCallback e envie a requisição
com Zoop.post(). Mostre o token ao operador
e use-o no portal IOPAY em
Terminais de Pagamento → Adicionar Terminal.
Depois, aguarde a confirmação retornada pelo SDK.
val activationRequest =
ZoopFoundationPlugin
.createDashboardActivationRequestBuilder()
.tokenCallback(/* receber e exibir o token */)
.confirmCallback(/* persistir dados confirmados */)
.build()
Zoop.post(activationRequest)
Persista a ativação e autentique automaticamente
No confirmCallback, salve os dados devolvidos
pela ativação. Nas próximas inicializações, reutilize
marketplace, seller e
accessKey. A ativação é feita uma vez por
dispositivo enquanto esses dados permanecerem válidos
e disponíveis.
{
"marketplace": "<retornado-na-ativacao>",
"seller": "<retornado-na-ativacao>",
"accessKey": "<retornado-na-ativacao>"
}
Execute o primeiro pagamento
Antes de vender, confirme a presença da chave
transacional no PINPad. Em seguida, crie uma venda com
DesktopPlugin.createPaymentRequestBuilder(),
informe o valor em centavos, modalidade e parcelas
aplicáveis e trate mensagens, sucesso, falha e término
do fluxo.
Sua Aplicação não precisa solicitar nem inserir previamente chaves de pagamento para ativar cada terminal. Os dados técnicos usados nas inicializações seguintes são obtidos no fluxo de ativação e persistidos pela própria aplicação.
Zoop Desktop SDK integrado diretamente ao PDV.
Nesta abordagem, o componente de captura fica dentro de Sua Aplicação. O plugin conversa localmente com o PINPad, enquanto a operação continua vinculada à infraestrutura IOPAY.
Inicialização após a ativação
Depois que marketplace, seller e
accessKey tiverem sido recuperados e persistidos,
use esses valores em tempo de execução para inicializar novamente
o SDK. Eles não devem ser digitados manualmente pelo operador.
Zoop.initialize(context) {
credentials {
marketplace = storedMarketplace
seller = storedSeller
accessKey = storedAccessKey
}
}
val desktopPlugin = DesktopPlugin(
Zoop.constructorParameters()
)
Zoop.plug(desktopPlugin)
Estado da integração
Inicializa sem credenciais, gera token e aguarda vínculo pelo portal IOPAY.
Sua Aplicação armazena marketplace, seller e accessKey de forma protegida.
Os dados salvos são reutilizados sem nova digitação pelo operador.
O token nasce no SDK e o vínculo é concluído na IOPAY.
A ativação associa o dispositivo à conta correta. Esse passo deve ocorrer antes da primeira transação e precisa ser testado também após reiniciar Sua Aplicação.
Sua Aplicação solicita a ativação ao componente Zoop e recebe um token temporário.
O token é informado em Terminais de Pagamento → Adicionar Terminal.
O SDK retorna os dados que Sua Aplicação precisa persistir para inicializações futuras.
Armazene os dados retornados de forma protegida. Evite marketplace, seller e accessKey em telas de usuário, logs de aplicação, telemetria aberta ou dumps de debug.
Consulte a chave transacional antes de cobrar.
A chave transacional Zoop precisa existir no PINPad para que pagamentos com cartão sejam executados. Se estiver ausente, acione a IOPAY para coordenar a correção com o fornecedor do equipamento.
Não trate a ausência da chave como um erro recuperável apenas por software no PDV. O terminal precisa ser regularizado antes da transação.
Exemplo de cobrança por cartão
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)
Trate também as mensagens intermediárias do fluxo para exibir ao operador instruções como aproximação, inserção ou leitura do cartão. O retorno local permite que o PDV acompanhe o que está acontecendo no terminal.
O que persistir do resultado
Relacione a transação local ao pedido e à operação acompanhada pela IOPAY.
Preserve NSU e código de autorização retornados para conciliação e suporte.
Guarde os dados de comprovante disponibilizados pela versão do SDK em uso.
O callback onComplete indica que o fluxo
terminou, inclusive quando houve falha. Considere o
pagamento aprovado somente a partir do retorno de sucesso
correspondente e correlacione o resultado com a operação
transacional da IOPAY.
Alternativa via WebSocket local.
O Zoop Desktop Server roda como um serviço local e expõe um WebSocket para Sua Aplicação. Seu escopo continua sendo a captura TEF. Credenciamento, conta, webhooks e fluxo transacional permanecem nas plataformas IOPAY.
Instale e inicie o serviço
Obtenha o instalador nas releases oficiais da Zoop.
Nas instalações Windows e Linux descritas no guia,
prepare Java/JDK 17, valide com
java -version e mantenha o Server
em execução na estação conectada ao PINPad.
java -version
Conecte Sua Aplicação
Quando Sua Aplicação e o Desktop Server estiverem na mesma máquina, conecte ao endereço local abaixo. Trate abertura, mensagens, erros e encerramento do 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 a ativação
Envie {"type":"activation"}.
Quando o Server responder com status
token, apresente o campo
token e conclua a vinculação no
portal IOPAY. Aguarde o status
success.
{
"type": "activation"
}
No sucesso, persista marketplace,
seller e accessKey para
as próximas inicializações.
Inicialize com os dados recuperados
Envie a mensagem initialize usando
exatamente os valores armazenados após a ativação.
O campo devicePort é opcional; quando
omitido, o Server pode detectar o PINPad
automaticamente. Aguarde status: success
antes de permitir transações.
{
"type": "initialize",
"marketplace": "<valor recebido na ativacao>",
"seller": "<valor recebido na ativacao>",
"accessKey": "<valor recebido na ativacao>"
}
Implemente a captura no PDV
Use os esquemas JSON documentados pelo Desktop Server para comandos locais de captura e trate todos os retornos. A resposta local serve para conduzir a experiência no PINPad; a gestão transacional e os webhooks continuam pela IOPAY.
<valor recebido na ativacao> representa
os dados persistidos por Sua Aplicação. Eles não são
informações que o operador deve digitar a cada inicialização.
Sua Aplicação continua ouvindo a IOPAY.
Adicionar TEF não muda o contrato de integração assíncrona: Sua Aplicação continua recebendo pela IOPAY os webhooks de cada evento e transação conforme a integração contratada. O retorno local do SDK/Server complementa a experiência do PDV; ele não elimina a camada de eventos IOPAY.
Transações, atualizações operacionais e eventos da integração.
Mantém seu endpoint de webhook e correlaciona os eventos com pedido, terminal e transação local.
Modelo recomendado de correlação
Use um identificador próprio para ligar o pagamento ao pedido de Sua Aplicação quando disponível.
Preserve os identificadores retornados pelo fluxo local do terminal.
Atualize o estado da operação com os eventos recebidos pela integração IOPAY.
O componente TEF é local, mas Sua Aplicação não precisa abandonar o fluxo já existente de APIs e webhooks IOPAY. Continue validando os webhooks de cada evento e transação durante a homologação.
Exercite falhas antes de homologar.
Não valide apenas o cenário de aprovação. O piloto deve contemplar falhas de comunicação, token expirado, interrupção durante a captura, reinicialização da aplicação e cancelamentos.
Quando aplicável ao fluxo local, use os comandos documentados pelo SDK para interromper/cancelar uma operação em andamento.
O Server possui fluxos próprios de cancelamento e mensagens de estado. Trate início, seleção, sucesso, falha e término conforme a documentação da versão usada.
Valide o cancelamento também no fluxo transacional IOPAY. Antes de repetir uma cobrança após falha de comunicação, confirme o estado real da transação para evitar duplicidade.
Dados de ativação devem permanecer fora da interface e dos logs.
marketplace, seller e accessKey fazem parte da inicialização técnica do dispositivo. Sua Aplicação deve protegê-los e usá-los de forma automática após a ativação.
Use mecanismo local apropriado à plataforma e restrinja o acesso aos processos que realmente precisam dos dados.
Não grave accessKey ou dados equivalentes em logs, traces, mensagens de erro ou analytics.
A ativação é técnica. O operador não deve precisar copiar credenciais para vender.
Checklist antes de liberar o piloto.
Credenciamento, conta e fluxo transacional continuam pelas plataformas IOPAY, com webhooks validados para os eventos e transações da integração.
Confirme a vinculação em Terminais de Pagamento → Adicionar Terminal e reinicie Sua Aplicação para validar o uso dos dados salvos.
Exiba mensagens do SDK, diferencie sucesso de simples término do fluxo e preserve transactionId, NSU, código de autorização e comprovantes/dados de recibo.
Teste falha de comunicação, expiração do token, interrupção da captura e cancelamentos no fluxo IOPAY e na camada local quando aplicável.
Confirme a presença da chave transacional antes da primeira venda. Se ela estiver ausente, acione a IOPAY para coordenar a correção com o fornecedor.
Dados de ativação armazenados de forma protegida e ausentes de telas, logs e telemetria indevida.
Documentação oficial para implementação.
Use os guias abaixo como referência técnica da versão do componente instalada no projeto. Parâmetros, compatibilidade, versões e protocolos podem evoluir; valide sempre a documentação oficial durante a implementação.
Pronto para homologar o primeiro terminal?
Gere o token pelo SDK ou Desktop Server, vincule o terminal no portal IOPAY e valide o fluxo completo - captura local, transação e webhooks - antes de seguir para produção.

