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

TEF local + operação IOPAY
APP
Camada do integrador Sua Aplicação PDV + APIs + webhooks IOPAY
seu sistema
IO
Camada central Plataformas IOPAY Conta · transacional · ativação · webhooks
IOPAY
SDK
Captura local Desktop SDK / Server Comunicação TEF com o terminal
local
PIN
Dispositivo físico PINPad / terminal Interação com cartão e portador
TEF
01 · Visão geral

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.

✓
Regra principal da arquitetura

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.

Captura presencial Zoop SDK / Server

Comunicação local entre o PDV, o serviço/SDK e o PINPad.

Camada central IOPAY

Credenciamento, conta, ativação do terminal, transacional e webhooks.

Integração cliente Sua Aplicação

Mantém suas APIs e webhooks IOPAY e adiciona a captura TEF local.

02 · Responsabilidades

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.
IO
“Dashboard” na documentação Zoop

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.

03 · Escolha da integração

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.

A
Principal Zoop Desktop SDK

Biblioteca incorporada à Sua Aplicação. Indicada quando o PDV pode consumir diretamente o plugin e controlar a comunicação local com o terminal.

B
Alternativa documentada Zoop Desktop Server

Serviço local em segundo plano. Sua Aplicação conversa com ele por WebSocket, normalmente em ws://localhost:1337.

04 · Quickstart

Do projeto vazio ao primeiro pagamento em cinco passos.

01

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.

Gradle · exemplo JVM
implementation(
    "br.zoop.pos.plugin:zoop-pos-plugin-desktop-jvm:X.Y.Z"
)
!
GitHub Packages ≠ credencial de pagamento

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.

02

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.

Kotlin · primeira ativação
Zoop.initialize(context)

val desktopPlugin = DesktopPlugin(
    Zoop.constructorParameters()
)

Zoop.plug(desktopPlugin)
03

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.

Kotlin · estrutura da ativação
val activationRequest =
    ZoopFoundationPlugin
        .createDashboardActivationRequestBuilder()
        .tokenCallback(/* receber e exibir o token */)
        .confirmCallback(/* persistir dados confirmados */)
        .build()

Zoop.post(activationRequest)
04

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.

Estrutura lógica · armazenamento seguro
{
  "marketplace": "<retornado-na-ativacao>",
  "seller": "<retornado-na-ativacao>",
  "accessKey": "<retornado-na-ativacao>"
}
05

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.

✓
Sem digitação manual de credenciais de pagamento

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.

05 · SDK Embedded

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.

Kotlin · inicialização posterior
Zoop.initialize(context) {
    credentials {
        marketplace = storedMarketplace
        seller = storedSeller
        accessKey = storedAccessKey
    }
}

val desktopPlugin = DesktopPlugin(
    Zoop.constructorParameters()
)

Zoop.plug(desktopPlugin)

Estado da integração

Primeira execução Ativação

Inicializa sem credenciais, gera token e aguarda vínculo pelo portal IOPAY.

Persistência Dados recebidos

Sua Aplicação armazena marketplace, seller e accessKey de forma protegida.

Próximas execuções Auto inicialização

Os dados salvos são reutilizados sem nova digitação pelo operador.

06 · Ativação

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.

1
Gerar token

Sua Aplicação solicita a ativação ao componente Zoop e recebe um token temporário.

2
Portal IOPAY

O token é informado em Terminais de Pagamento → Adicionar Terminal.

3
Confirmação

O SDK retorna os dados que Sua Aplicação precisa persistir para inicializações futuras.

!
Não exponha os dados da ativação

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.

07 · Primeiro pagamento

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.

!
PINPad sem chave transacional não está pronto para venda

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

Kotlin · Desktop SDK
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

Identificação transactionId

Relacione a transação local ao pedido e à operação acompanhada pela IOPAY.

Autorização NSU + código

Preserve NSU e código de autorização retornados para conciliação e suporte.

Comprovantes Dados de recibo

Guarde os dados de comprovante disponibilizados pela versão do SDK em uso.

i
Não use “fim do fluxo” como sinônimo de aprovação

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.

08 · Desktop Server

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.

01

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.

Terminal
java -version
02

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.

WebSocket
ws://localhost:1337
JavaScript · exemplo de conexão
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();
};
03

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.

JSON · ativação
{
  "type": "activation"
}

No sucesso, persista marketplace, seller e accessKey para as próximas inicializações.

04

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.

JSON · initialize
{
  "type": "initialize",
  "marketplace": "<valor recebido na ativacao>",
  "seller": "<valor recebido na ativacao>",
  "accessKey": "<valor recebido na ativacao>"
}
05

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.

i
Os marcadores do JSON são preenchidos em runtime

<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.

09 · APIs & webhooks

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.

Camada de eventos IOPAY

Transações, atualizações operacionais e eventos da integração.

Endpoint configurado Sua Aplicação

Mantém seu endpoint de webhook e correlaciona os eventos com pedido, terminal e transação local.

Modelo recomendado de correlação

Pedido referenceId

Use um identificador próprio para ligar o pagamento ao pedido de Sua Aplicação quando disponível.

Captura transactionId / NSU

Preserve os identificadores retornados pelo fluxo local do terminal.

Evento assíncrono Webhook IOPAY

Atualize o estado da operação com os eventos recebidos pela integração IOPAY.

✓
Uma única camada de eventos para Sua Aplicação

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.

10 · Erros & cancelamentos

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.

SDK Cancelamento cooperativo

Quando aplicável ao fluxo local, use os comandos documentados pelo SDK para interromper/cancelar uma operação em andamento.

Desktop Server Comandos JSON

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.

!
Cancelamento da operação × status transacional

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.

11 · Segurança

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.

Persistência Armazenamento protegido

Use mecanismo local apropriado à plataforma e restrinja o acesso aos processos que realmente precisam dos dados.

Observabilidade Sem segredo em log

Não grave accessKey ou dados equivalentes em logs, traces, mensagens de erro ou analytics.

UX operacional Sem digitação recorrente

A ativação é técnica. O operador não deve precisar copiar credenciais para vender.

12 · Homologação

Checklist antes de liberar o piloto.

✓
Operação centralizada na IOPAY

Credenciamento, conta e fluxo transacional continuam pelas plataformas IOPAY, com webhooks validados para os eventos e transações da integração.

✓
Terminal associado à conta correta

Confirme a vinculação em Terminais de Pagamento → Adicionar Terminal e reinicie Sua Aplicação para validar o uso dos dados salvos.

✓
Resultado do pagamento tratado corretamente

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.

✓
Erros e cancelamentos exercitados

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.

✓
PINPad preparado

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.

✓
Persistência segura

Dados de ativação armazenados de forma protegida e ausentes de telas, logs e telemetria indevida.

13 · Referências

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.