O Payment System é um projeto para gestão de pagamentos via Pix, integrando-se à API EfPlay. Oferece criação de cobranças, QR Codes e transferências, além de autenticação com JWT e gerenciamento de usuários. Desenvolvido com Spring Boot, Spring Security e MySQL, garante segurança, eficiência e escalabilidade.
- Registro de usuários com verificação por email (envio de código de ativação)
- Autenticação JWT para proteção dos endpoints
- Endpoints protegidos por autorização, com filtro de segurança JWT customizado
- Criptografia segura de senhas usando BCrypt
- Criação de chaves Pix (EVP) via API EfPlay
- Geração e gestão de cobranças Pix
- Envio de pagamentos Pix
- Permite requisições de qualquer origem (configuração liberada para desenvolvimento)
- Métodos HTTP permitidos: GET, POST, PUT, DELETE, OPTIONS
- Java JDK 17+
- Maven
- MySQL
- Docker (opcional)
- Clone o repositório:
git clone https://github.com/seu-usuario/payment-system.git
cd payment-system- Configure o banco de dados:
-
O sistema usa um banco MySQL chamado
payments(criado automaticamente, se não existir) -
Credenciais padrão (podem ser alteradas no arquivo
application.properties):- Usuário:
root - Senha:
root
- Usuário:
- Configure as variáveis de ambiente:
MAIL_USER: Email para envio de confirmaçõesMAIL_PASSWORD: Senha do emailJWT_SECRET: Chave secreta para geração e validação dos tokens JWT
- Build e execução:
mvn clean install
mvn spring-boot:runO projeto utiliza a biblioteca Dotenv para carregar variáveis de ambiente a partir de um arquivo .env na raiz do projeto, facilitando a configuração local e em ambientes que não usam variáveis de ambiente diretamente.
No método main da aplicação, as variáveis são carregadas e configuradas no sistema Java:
public static void main(String[] args) {
// Carregar variáveis do .env
Dotenv dotenv = Dotenv.load();
System.setProperty("DB_PORT", dotenv.get("DB_PORT"));
System.setProperty("DB_USERNAME", dotenv.get("DB_USER"));
System.setProperty("DB_PASSWORD", dotenv.get("DB_PASSWORD"));
System.setProperty("MAIL_USER", dotenv.get("MAIL_USER"));
System.setProperty("MAIL_PASSWORD", dotenv.get("MAIL_PASSWORD"));
System.setProperty("JWT_SECRET", dotenv.get("JWT_SECRET"));
SpringApplication.run(PaymentSystemApplication.class, args);
}Você deve criar um arquivo .env na raiz do projeto contendo, por exemplo:
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
MAIL_USER=seu-email@gmail.com
MAIL_PASSWORD=sua-senha-email
JWT_SECRET=sua-chave-secreta-jwt
- No início da aplicação, o arquivo
.envé lido e suas variáveis são injetadas como propriedades do sistema (System.setProperty). - O Spring Boot lê essas propriedades para configurar banco de dados, email, JWT, etc.
- Essa abordagem facilita desenvolvimento local e evita hardcoding de segredos no código-fonte.
- Nunca comite seu arquivo
.envcom senhas ou segredos reais em repositórios públicos. - Em produção, é recomendado configurar variáveis de ambiente diretamente no servidor ou usar serviços de gerenciamento de segredos.
- Objetos gerenciados pelo Spring (Beans) são automaticamente criados e injetados onde necessários
- Exemplo:
@BeanparaPasswordEncoder(BCrypt),SecurityFilterChainpara configurar Spring Security,CorsConfigpara liberar CORS
- Configuração sem sessão (stateless) para APIs REST com JWT
- Endpoints públicos: registro, verificação e login
- Filtro customizado
SecurityFilterintercepta requisições para validar token JWT e autenticar usuário - Senhas armazenadas com hash BCrypt
- Registra usuários com senha criptografada e código de verificação gerado via
RandomString - Envia email de confirmação com link para ativação da conta
- Valida código e ativa usuário
- Gera tokens JWT assinados com segredo configurado (
jwt.secret) - Valida tokens e recupera dados do usuário (email)
- Envia email de verificação usando SMTP configurado com variáveis de ambiente
- Comunicação com API EfPlay para criar chaves EVP, gerar cobranças e enviar pagamentos Pix
- Controlado via endpoints REST no
PixController
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
| POST | /api/v1/auth/login | Login do usuário (retorna JWT) | Não |
| POST | /api/v1/user/register | Registro de novo usuário | Não |
| GET | /api/v1/user/verify | Verificação do email | Não |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
| GET | /api/v1/user/teste | Endpoint protegido para teste | Sim |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
| GET | /pix/criar | Cria nova chave Pix EVP | Sim |
| POST | /pix/cobrar | Gera cobrança Pix | Sim |
| POST | /pix/enviar | Envia pagamento Pix | Sim |
- Registrar um novo usuário:
curl -X POST http://localhost:8080/api/v1/user/register \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@exemplo.com",
"password": "senha123",
"name": "Nome do Usuário"
}'- Fazer login e obter token JWT:
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@exemplo.com",
"password": "senha123"
}'- Criar uma cobrança Pix (usando token JWT do login):
curl -X POST http://localhost:8080/pix/cobrar \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <SEU_TOKEN_JWT>" \
-d '{
"valor": "100.00",
"infoPagador": "Pagamento de serviço"
}'- Criação automática do banco (
createDatabaseIfNotExist=true) - SSL desabilitado para desenvolvimento (
useSSL=false) - Timezone UTC (
serverTimezone=UTC) - Permite recuperação de chave pública (
allowPublicKeyRetrieval=true)
- Configuração permite chamadas de qualquer origem (
allowedOrigins("*")) - Métodos permitidos: GET, POST, PUT, DELETE, OPTIONS
- Recomendado ajustar para produção para restringir origens confiáveis
- Tokens gerados com algoritmo HMAC256 e segredo configurado
- Validação e autenticação via filtro customizado
SecurityFilter - Senhas armazenadas com hash BCrypt para segurança
- SMTP configurado para Gmail via variáveis de ambiente
- Porta 587, autenticação e STARTTLS habilitados
- Java 17
- Spring Boot
- Spring Security
- Spring Data JPA
- MySQL
- JSON (org.json)
- JavaMail (SMTP Gmail)
- JWT (auth0 Java JWT)
Este projeto está licenciado sob a licença MIT - veja o arquivo LICENSE para mais detalhes.