Este projeto Γ© uma demo de integraΓ§Γ£o com a Z-API, uma API para WhatsApp, construΓda com Spring Boot seguindo rigorosamente o padrΓ£o de Clean Architecture.
A aplicaΓ§Γ£o expΓ΅e endpoints simples para:
- Obter o QR Code de conexΓ£o da instΓ’ncia;
- Desconectar a instΓ’ncia;
- Obter dados do dispositivo conectado;
- Enviar mensagens de texto, imagem e vΓdeo via WhatsApp;
- Sincronizar e armazenar chats automaticamente da Z-API.
O projeto usa SQLite como banco de dados local, com uma tabela chats para armazenar informaΓ§Γ΅es de contatos/conversas.
- Java 17+
- Spring Boot 3.2.x
- Spring Data JPA
- WebClient (chamadas HTTP reativas)
- Z-API (integraΓ§Γ£o com WhatsApp)
- SQLite (banco de dados local)
- Lombok (reduΓ§Γ£o de boilerplate)
- Maven (gerenciamento de dependΓͺncias)
- Arquitetura em camadas (Clean Architecture)
A estrutura segue uma separaΓ§Γ£o clara de responsabilidades seguindo os princΓpios de Clean Architecture:
PrincΓpio: Esta camada nΓ£o tem dependΓͺncias de frameworks externos. ContΓ©m apenas lΓ³gica de negΓ³cio pura.
entities/β Entidades de domΓnio (ex.:Chat)repositories/β Interfaces puras de repositΓ³rios (sem dependΓͺncia de JPA/Spring)usecases/β Casos de uso (interactors) com lΓ³gica de negΓ³ciomessages/β Envio de texto, imagem e vΓdeochats/β Consulta e sincronizaΓ§Γ£o de chatsinstance/β OperaΓ§Γ΅es da instΓ’ncia (QR Code, desconectar, dados do dispositivo)
PrincΓpio: Implementa as interfaces do domΓnio usando frameworks especΓficos (Spring, JPA, etc).
config/β ConfiguraΓ§Γ£o da Z-APIservices/β ServiΓ§o HTTP para comunicaΓ§Γ£o com Z-API (ZApiHttpService)repositories/β ImplementaΓ§Γ£o dos repositΓ³riosChatRepositoryJpaβ Interface Spring Data JPAChatRepositoryImplβ Adaptador que implementa a interface do domΓnio
PadrΓ£o Adapter: O ChatRepositoryImpl adapta o ChatRepositoryJpa (Spring Data) para a interface ChatRepository (Domain), mantendo o domΓnio independente de frameworks.
controllers/β Controllers REST (Spring MVC)MessagesControllerChatsControllerInstanceController
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Presentation Layer β
β (Controllers - REST API) β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Domain Layer β
β (Entities, Use Cases, Repository Interfaces) β
β β οΈ SEM DEPENDΓNCIAS DE FRAMEWORKS β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
β implementa
β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data Layer β
β (Repository Impl, JPA, HTTP Services, Config) β
β β
USA Spring, JPA, WebClient β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Base path: /messages
-
POST /messages/send-text
Envia uma mensagem de texto.{ "phone": "5511999999999", "message": "OlΓ‘, mundo!" } -
POST /messages/send-image
Envia uma mensagem de imagem (com URL).{ "phone": "5511999999999", "image": "https://example.com/image.jpg", "caption": "Legenda da imagem" } -
POST /messages/send-video
Envia uma mensagem de vΓdeo (com URL).{ "phone": "5511999999999", "video": "https://example.com/video.mp4", "caption": "Legenda do vΓdeo" }
Base path: /chats
-
GET /chats/get-chats
Sincroniza chats da Z-API e retorna todos os chats armazenados.Comportamento:
- Busca chats da API Z-API
- Para cada chat retornado, verifica se jΓ‘ existe no banco (por
lidouphone) - Se nΓ£o existir, cria e salva um novo registro
- Retorna todos os chats do banco de dados
Nota: Em caso de erro na API, retorna apenas os chats do banco local.
Base path: /instance
-
GET /instance/me
Retorna dados do dispositivo/instΓ’ncia conectada. -
GET /instance/disconnect
Desconecta a instΓ’ncia do WhatsApp. -
GET /instance/qr-code
Retorna o QR Code para conectar o dispositivo ao WhatsApp.
O projeto utiliza SQLite com uma tabela principal:
| Coluna | Tipo | DescriΓ§Γ£o |
|---|---|---|
id |
STRING | UUID - chave primΓ‘ria |
name |
STRING | Nome do contato/chat |
phone |
STRING | Telefone (formato internacional recomendado) |
lid |
STRING | Identificador lΓ³gico usado pela integraΓ§Γ£o |
O banco Γ© inicializado automaticamente na primeira execuΓ§Γ£o, criando o arquivo database.sqlite na raiz do projeto via JPA/Hibernate.
- Java 17+ (JDK instalado)
- Maven (para build e dependΓͺncias)
- Conta/configuraΓ§Γ£o vΓ‘lida na Z-API (instanceToken, instanceId, clientToken)
# Clonar o repositΓ³rio
git clone https://github.com/joaoVictor-irrah/z-api-demo-java.git
cd z-api-demo-java
# Compilar o projeto
mvn clean install- Copie o arquivo
.env.examplee renomeie para.env:
cp .env.example .env- Edite o arquivo
.envou configure as variΓ‘veis de ambiente:
Z_API_INSTANCE_ID=seu_instance_id
Z_API_INSTANCE_TOKEN=seu_instance_token
Z_API_CLIENT_TOKEN=seu_client_token- No Linux/macOS, exporte as variΓ‘veis:
export Z_API_INSTANCE_ID=seu_instance_id
export Z_API_INSTANCE_TOKEN=seu_instance_token
export Z_API_CLIENT_TOKEN=seu_client_token- No Windows (CMD):
set Z_API_INSTANCE_ID=seu_instance_id
set Z_API_INSTANCE_TOKEN=seu_instance_token
set Z_API_CLIENT_TOKEN=seu_client_tokenOu edite diretamente o src/main/resources/application.properties (nΓ£o recomendado para produΓ§Γ£o).
# Desenvolvimento
mvn spring-boot:run
# Ou executar o JAR compilado
mvn clean package
java -jar target/z-api-demo-java-1.0.0.jarO servidor serΓ‘ iniciado na porta 3000 por padrΓ£o: http://localhost:3000
-
Obter QR Code
- Chamar
GET http://localhost:3000/instance/qr-code - Escanear o QR Code com o WhatsApp do dispositivo.
- Chamar
-
Verificar dispositivo conectado
- Chamar
GET http://localhost:3000/instance/me.
- Chamar
-
Sincronizar chats
GET http://localhost:3000/chats/get-chatsbusca chats da Z-API e armazena no banco automaticamente.
-
Enviar mensagens
POST http://localhost:3000/messages/send-textpara textoPOST http://localhost:3000/messages/send-imagepara imagemPOST http://localhost:3000/messages/send-videopara vΓdeo
-
Desconectar instΓ’ncia
GET http://localhost:3000/instance/disconnect.
src/main/java/com/example/zapidemo/
βββ domain/ # CAMADA DE DOMΓNIO (sem dependΓͺncias externas)
β βββ entities/
β β βββ Chat.java # Entidade de domΓnio
β βββ repositories/
β β βββ ChatRepository.java # Interface pura (sem JPA)
β βββ usecases/
β βββ messages/
β β βββ SendTextUseCase.java
β β βββ SendImageUseCase.java
β β βββ SendVideoUseCase.java
β βββ chats/
β β βββ GetChatsUseCase.java # Sincroniza chats da API
β βββ instance/
β βββ GetMeUseCase.java
β βββ DisconnectUseCase.java
β βββ GetQrCodeUseCase.java
β
βββ data/ # CAMADA DE DADOS (implementaΓ§Γ΅es com frameworks)
β βββ config/
β β βββ ZApiConfig.java # ConfiguraΓ§Γ£o Z-API
β βββ repositories/
β β βββ ChatRepositoryJpa.java # Interface Spring Data JPA
β β βββ ChatRepositoryImpl.java # Adaptador Domain β JPA
β βββ services/
β βββ ZApiHttpService.java # WebClient para Z-API (get, getList, post)
β
βββ presentation/ # CAMADA DE APRESENTAΓΓO
β βββ controllers/
β βββ MessagesController.java
β βββ ChatsController.java
β βββ InstanceController.java
β
βββ ZApiDemoApplication.java # Classe principal Spring Boot
ServiΓ§o para comunicaΓ§Γ£o com a Z-API via WebClient.
MΓ©todos disponΓveis:
get(endpoint)β Para respostas JSON em formato de objeto{...}getList(endpoint)β Para respostas JSON em formato de array[...]post(endpoint, data)β Para envio de dados via POST
Caso de uso que implementa a sincronizaΓ§Γ£o automΓ‘tica de chats:
- Busca chats da Z-API usando
zApiHttpService.getList("/chats") - Para cada chat retornado:
- Verifica se jΓ‘ existe no banco (por
lidouphone) - Se nΓ£o existir, cria novo registro com UUID e salva
- Verifica se jΓ‘ existe no banco (por
- Retorna todos os chats armazenados no banco
-
Este projeto segue Clean Architecture de forma rigorosa:
- Domain Layer Γ© independente de frameworks
- Data Layer implementa interfaces do domΓnio usando Spring/JPA
- Presentation Layer expΓ΅e REST API
-
A sincronizaΓ§Γ£o de chats Γ© automΓ‘tica ao chamar
/chats/get-chats -
Este projeto Γ© uma port do projeto original em NestJS/TypeScript para Java/Spring Boot, mantendo a mesma arquitetura e funcionalidades.
This project is a demo integration with Z-API, a WhatsApp API, built with Spring Boot strictly following the Clean Architecture pattern.
The application exposes simple endpoints to:
- Get the instance connection QR Code;
- Disconnect the instance;
- Get device information of the connected WhatsApp;
- Send basic text, image and video messages via WhatsApp;
- Synchronize and store chats automatically from Z-API.
The project uses SQLite as a local database with a chats table to store contact/chat information.
- Java 17+
- Spring Boot 3.2.x
- Spring Data JPA
- WebClient (reactive HTTP calls)
- Z-API (WhatsApp integration)
- SQLite (local database)
- Lombok (boilerplate reduction)
- Maven (dependency management)
- Layered structure using Clean Architecture
The project structure follows clear separation of concerns following Clean Architecture principles:
Principle: This layer has no external framework dependencies. Contains only pure business logic.
entities/β Domain entities (e.g.,Chat)repositories/β Pure interfaces (no JPA/Spring dependencies)usecases/β Use cases (interactors) with business logicmessages/β Send text, image, videochats/β Fetch and synchronize chatsinstance/β Instance operations (QR Code, disconnect, device data)
Principle: Implements domain interfaces using specific frameworks (Spring, JPA, etc).
config/β Z-API configurationservices/β HTTP service for Z-API communication (ZApiHttpService)repositories/β Repository implementationsChatRepositoryJpaβ Spring Data JPA interfaceChatRepositoryImplβ Adapter implementing domain interface
Adapter Pattern: ChatRepositoryImpl adapts ChatRepositoryJpa (Spring Data) to ChatRepository interface (Domain), keeping the domain framework-independent.
controllers/β REST controllers (Spring MVC)MessagesControllerChatsControllerInstanceController
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Presentation Layer β
β (Controllers - REST API) β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Domain Layer β
β (Entities, Use Cases, Repository Interfaces) β
β β οΈ NO FRAMEWORK DEPENDENCIES β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
β implements
β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data Layer β
β (Repository Impl, JPA, HTTP Services, Config) β
β β
USES Spring, JPA, WebClient β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Base path: /messages
-
POST /messages/send-text
Sends a text message.{ "phone": "5511999999999", "message": "Hello, world!" } -
POST /messages/send-image
Sends an image message (via URL).{ "phone": "5511999999999", "image": "https://example.com/image.jpg", "caption": "Image caption" } -
POST /messages/send-video
Sends a video message (via URL).{ "phone": "5511999999999", "video": "https://example.com/video.mp4", "caption": "Video caption" }
Base path: /chats
-
GET /chats/get-chats
Synchronizes chats from Z-API and returns all stored chats.Behavior:
- Fetches chats from Z-API
- For each returned chat, checks if it already exists in database (by
lidorphone) - If it doesn't exist, creates and saves a new record
- Returns all chats from the database
Note: In case of API error, returns only chats from local database.
Base path: /instance
-
GET /instance/me
Returns information about the connected device/instance. -
GET /instance/disconnect
Disconnects the WhatsApp instance. -
GET /instance/qr-code
Returns the QR Code for pairing the WhatsApp device.
The project uses SQLite with a main table:
| Column | Type | Description |
|---|---|---|
id |
STRING | UUID - primary key |
name |
STRING | Contact/chat name |
phone |
STRING | Phone number (international format recommended) |
lid |
STRING | Logical identifier used by the integration |
The database is initialized automatically at startup, creating the database.sqlite file at the project root via JPA/Hibernate.
- Java 17+ (JDK installed)
- Maven (for build and dependencies)
- A valid Z-API account/configuration (instanceToken, instanceId, clientToken)
# Clone the repository
git clone https://github.com/joaoVictor-irrah/z-api-demo-java.git
cd z-api-demo-java
# Build the project
mvn clean install- Copy
.env.exampleand rename to.env:
cp .env.example .env- Edit the
.envfile or set environment variables:
Z_API_INSTANCE_ID=your_instance_id
Z_API_INSTANCE_TOKEN=your_instance_token
Z_API_CLIENT_TOKEN=your_client_token- On Linux/macOS, export the variables:
export Z_API_INSTANCE_ID=your_instance_id
export Z_API_INSTANCE_TOKEN=your_instance_token
export Z_API_CLIENT_TOKEN=your_client_token- On Windows (CMD):
set Z_API_INSTANCE_ID=your_instance_id
set Z_API_INSTANCE_TOKEN=your_instance_token
set Z_API_CLIENT_TOKEN=your_client_tokenOr edit src/main/resources/application.properties directly (not recommended for production).
# Development
mvn spring-boot:run
# Or run the compiled JAR
mvn clean package
java -jar target/z-api-demo-java-1.0.0.jarThe server will start on port 3000 by default: http://localhost:3000
-
Get QR Code
- Call
GET http://localhost:3000/instance/qr-code - Scan the QR Code with your WhatsApp app.
- Call
-
Check connected device
- Call
GET http://localhost:3000/instance/me.
- Call
-
Synchronize chats
GET http://localhost:3000/chats/get-chatsfetches chats from Z-API and stores them automatically.
-
Send messages
POST http://localhost:3000/messages/send-textfor textPOST http://localhost:3000/messages/send-imagefor imagePOST http://localhost:3000/messages/send-videofor video
-
Disconnect instance
- Call
GET http://localhost:3000/instance/disconnect.
- Call
src/main/java/com/example/zapidemo/
βββ domain/ # DOMAIN LAYER (no external dependencies)
β βββ entities/
β β βββ Chat.java # Domain entity
β βββ repositories/
β β βββ ChatRepository.java # Pure interface (no JPA)
β βββ usecases/
β βββ messages/
β β βββ SendTextUseCase.java
β β βββ SendImageUseCase.java
β β βββ SendVideoUseCase.java
β βββ chats/
β β βββ GetChatsUseCase.java # Synchronizes chats from API
β βββ instance/
β βββ GetMeUseCase.java
β βββ DisconnectUseCase.java
β βββ GetQrCodeUseCase.java
β
βββ data/ # DATA LAYER (framework implementations)
β βββ config/
β β βββ ZApiConfig.java # Z-API configuration
β βββ repositories/
β β βββ ChatRepositoryJpa.java # Spring Data JPA interface
β β βββ ChatRepositoryImpl.java # Domain β JPA adapter
β βββ services/
β βββ ZApiHttpService.java # WebClient for Z-API (get, getList, post)
β
βββ presentation/ # PRESENTATION LAYER
β βββ controllers/
β βββ MessagesController.java
β βββ ChatsController.java
β βββ InstanceController.java
β
βββ ZApiDemoApplication.java # Spring Boot main class
Service for Z-API communication via WebClient.
Available methods:
get(endpoint)β For JSON responses in object format{...}getList(endpoint)β For JSON responses in array format[...]post(endpoint, data)β For sending data via POST
Use case that implements automatic chat synchronization:
- Fetches chats from Z-API using
zApiHttpService.getList("/chats") - For each returned chat:
- Checks if it already exists in database (by
lidorphone) - If it doesn't exist, creates new record with UUID and saves
- Checks if it already exists in database (by
- Returns all chats stored in database
-
This project follows Clean Architecture rigorously:
- Domain Layer is framework-independent
- Data Layer implements domain interfaces using Spring/JPA
- Presentation Layer exposes REST API
-
Chat synchronization is automatic when calling
/chats/get-chats -
This project is a port of the original NestJS/TypeScript project to Java/Spring Boot, maintaining the same architecture and functionality.
MIT
JoaoMadeiraxyz
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.