- Sobre o Projeto
- Tecnologias Utilizadas
- Estrutura do Projeto
- Padrão Factory Method
- Enumerações
- Endpoints da API
- Como Executar o Projeto
- Documentação da API
- Testes
- Princípios SOLID Aplicados
- Contribuição
- Licença
- Contato
Esta API de processamento de pagamentos foi desenvolvida para lidar com diferentes métodos de pagamento utilizando o padrão de design Factory Method. A aplicação suporta pagamentos via cartão de crédito, boleto bancário e PIX, seguindo os princípios de SOLID para garantir um código limpo, extensível e de fácil manutenção.
- Java 17
- Spring Boot
- Spring MVC
- Spring Data JPA
- H2 Database (banco de dados em memória)
- Lombok
- Jakarta Persistence API
- Swagger/OpenAPI (documentação da API)
- JUnit 5 (para testes)
O projeto segue uma arquitetura em camadas bem definida:
├── config # Configurações gerais (Segurança, Swagger, CORS, Beans)
├── controller # REST Controllers (endpoints)
├── response # Data Transfer Objects (resposta)
├── request # Data Transfer Objects (requisição)
├── exception # Tratamento de erros e exceções customizadas
├── mapper # MapStruct ou mapeadores manuais DTO ↔ Entity
├── model # Entidades JPA / domain objects
├── repository # Spring Data JPA Repositories
├── service # Regras de negócio (interfaces)
├── service.impl # Implementações de Service
└── util # Classes utilitárias e helpers
Este projeto implementa o padrão de design Factory Method para lidar com diferentes tipos de processadores de pagamento. O Factory Method é um padrão criacional que:
- Fornece uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos criados
- Promove baixo acoplamento entre classes
- Segue o princípio Open/Closed do SOLID, permitindo adicionar novos tipos de pagamento sem modificar o código existente
A implementação do Factory Method neste projeto consiste em:
-
Interface do Produto:
PaymentProcessorService- Define o contrato para todos os processadores de pagamento -
Produtos Concretos:
CreditCardPaymentProcessorImpl- Processa pagamentos com cartão de créditoBankSlipPaymentProcessorImpl- Processa pagamentos com boleto bancárioPixPaymentProcessor- Processa pagamentos via PIX
-
Fábrica:
PaymentProcessFactory- Responsável por criar o processador apropriado com base no tipo de requisição -
Cliente:
PaymentService- Utiliza a fábrica para obter o processador correto sem conhecer as implementações concretas
O fluxo de funcionamento é:
- O
PaymentControllerrecebe uma requisição de pagamento - O controller chama o
PaymentService.processPayment() - O service utiliza o
PaymentProcessFactorypara obter o processador adequado - O factory identifica o tipo de requisição e retorna o processador correspondente
- O service utiliza o processador para processar o pagamento
- O resultado é retornado ao controller e então ao cliente
Esta abordagem permite adicionar novos métodos de pagamento facilmente, bastando:
- Criar uma nova classe de requisição que estenda
PaymentRequest - Implementar um novo processador que implemente
PaymentProcessorService - Registrar o novo processador no
PaymentProcessFactory
Sem necessidade de modificar o código existente, seguindo o princípio Open/Closed.
O diagrama abaixo ilustra o fluxo de processamento de um pagamento:

O diagrama de sequência acima ilustra:
- O cliente faz uma requisição HTTP POST para um dos endpoints de pagamento
- O controlador recebe a requisição e chama o serviço de pagamento
- O serviço utiliza a fábrica para obter o processador adequado com base no tipo de requisição
- A fábrica retorna o processador específico para o tipo de pagamento
- O serviço utiliza o processador para processar o pagamento
- O processador salva os dados do pagamento no repositório
- O processador retorna a resposta do pagamento
- A resposta é retornada ao cliente
Este fluxo demonstra claramente o padrão Factory Method em ação, onde o tipo concreto do processador é determinado em tempo de execução com base no tipo de requisição.
O sistema suporta os seguintes métodos de pagamento:
CREDIT_CARD: Pagamento com cartão de créditoBANK_SLIP: Pagamento com boleto bancárioPIX: Pagamento via PIX (sistema de pagamento instantâneo brasileiro)
Os pagamentos podem ter os seguintes status:
PENDING: Pagamento pendente de processamentoPROCESSING: Pagamento em processamentoCOMPLETED: Pagamento concluído com sucessoFAILED: Falha no processamento do pagamentoREFUNDED: Pagamento estornado
POST /api/payments/credit-card
Exemplo de Requisição:
{
"amount": 100.50,
"cardNumber": "4111111111111111",
"cardHolderName": "John Doe",
"expirationDate": "12/25",
"cvv": "123"
}Exemplo de Resposta:
{
"id": 123456,
"amount": 100.50,
"paymentMethod": "CREDIT_CARD",
"transactionId": "tx_123456789",
"createdAt": "2023-06-15T14:30:00",
"status": "COMPLETED",
"receiptUrl": "https://example.com/receipts/123456"
}POST /api/payments/bank-slip
Exemplo de Requisição:
{
"amount": 250.75,
"customerName": "Maria Silva",
"customerDocument": "123.456.789-00",
"customerAddress": "Rua Exemplo, 123 - São Paulo, SP"
}Exemplo de Resposta:
{
"id": 123457,
"amount": 250.75,
"paymentMethod": "BANK_SLIP",
"transactionId": "tx_987654321",
"createdAt": "2023-06-15T15:45:00",
"status": "PENDING",
"receiptUrl": "https://example.com/boletos/123457",
"barCode": "23790.12345 67890.123456 78901.234567 8 12345678901234"
}POST /api/payments/pix
Exemplo de Requisição:
{
"amount": 75.30,
"customerName": "Carlos Oliveira",
"customerDocument": "987.654.321-00",
"pixKey": "[email protected]",
"pixKeyType": "EMAIL"
}Exemplo de Resposta:
{
"id": 123458,
"amount": 75.30,
"paymentMethod": "PIX",
"transactionId": "tx_456789123",
"createdAt": "2023-06-15T16:20:00",
"status": "COMPLETED",
"receiptUrl": "https://example.com/pix/123458",
"pixCopyPaste": "00020126580014br.gov.bcb.pix0136email@exemplo.com5204000053039865802BR5913Carlos Oliveira6009Sao Paulo62070503***63041234"
}- Certifique-se de ter o JDK 17 instalado
- Clone o repositório
- O projeto já está configurado para usar o banco de dados H2 em memória
- Execute o comando:
./mvnw spring-boot:run - A API estará disponível em:
http://localhost:8080
O console do H2 está habilitado e pode ser acessado em:
http://localhost:8080/h2-console
Credenciais de acesso (conforme definido em application.properties):
- JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password:
password
A documentação completa da API está disponível via Swagger UI em:
http://localhost:8080/swagger-ui.html
A documentação OpenAPI também pode ser acessada em formato JSON:
http://localhost:8080/api-docs
Para executar os testes:
./mvnw test
Cada processador de pagamento tem uma única responsabilidade de processar um tipo específico de pagamento.
A estrutura permite adicionar novos tipos de pagamento sem modificar o código existente, apenas criando novos processadores que implementem a interface PaymentProcessorService.
Todos os processadores de pagamento podem ser usados de forma intercambiável através da interface PaymentProcessorService.
A interface PaymentProcessorService é focada apenas no essencial para o processamento de pagamentos.
As classes de alto nível dependem de abstrações (interfaces) e não de implementações concretas.
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Faça commit das suas alterações (
git commit -m 'Adiciona nova feature') - Faça push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
Para mais informações, entre em contato através deste link: https://www.linkedin.com/in/heider1988/