JPAY, a UPI clone
A faithful simulation of India's UPI instant-payment system: a client and three cooperating Spring Boot servers (Bank, NPCI, UPI) handling registration, PIN-authenticated transfers and per-transaction logging end to end.
The brief
LPay recreates how UPI actually works, not a toy transfer form. Users register, link a bank account and set a UPI PIN. When money moves, the request goes to a middleman NPCI server, which contacts the bank servers of both parties and delegates the fund transfer: exactly the real UPI delegation chain. UPI IDs are generated on registration, balances render in a Thymeleaf front end, and every transaction is logged in every component it touches.
Architecture
Four Spring Boot services over REST, each with clean MVC layering (entities, Spring Data JPA repositories, services, controllers):
| Component | Role |
|---|---|
| Client | Thymeleaf UI and flow logic: register, log in, transact, check balance |
| UPI server | The account layer; orchestrates requests and talks to NPCI |
| NPCI server | The middleman; routes transactions and delegates transfers |
| Bank server | The balance authority; executes debits and credits |
MySQL persists state, WebFlux WebClient carries the inter-service calls, and
log4j satisfies the audit requirement.
Why it holds up
- The topology is the design lesson. Balances live only in the bank servers. The NPCI server is the single routing and audit point. Clients never touch a bank directly. That separation is what the real system does, and modelling it correctly was the point of the course.
- Design first, code second. The repo ships the full UML set: use-case, activity, class diagrams for all four services, and state diagrams for registration, login and transactions.
Credit
Course group project. Built on a Spring Boot tutorial skeleton; the UPI domain modelling is the team's work.