Đại học FPT · Khóa luận 2025
SWallet
Nền tảng gắn kết sinh viên bằng phần thưởng
- Vai trò
- Backend developer
- Công nghệ
- 80+REST endpoint trên năm domain
- 95%Giảm gian lận check-in phát hiện được
- 40%Giảm voucher bị bỏ quên
Tổng quan
Ứng dụng trong khuôn viên trường: sinh viên check-in tại địa điểm thật, làm nhiệm vụ, tích điểm và đổi voucher ở các cửa hàng đối tác. Flutter trên điện thoại, ASP.NET Core phía sau.
Những gì tôi làm
- Hơn 80 REST endpoint cho chiến dịch, ví, cửa hàng, trạng thái mini-game và hồ sơ, dùng chung một chuẩn lỗi và phân trang.
- Check-in GPS được kiểm tra phía server bằng công thức Haversine, kèm heuristic tốc độ và thời gian chờ để chống giả mạo.
- Engine gamification cho chuỗi điểm danh, nhiệm vụ, huy hiệu và vòng quay may mắn, toàn bộ trạng thái nằm trên server.
Thiết kế hệ thống
Check-in GPS chống gian lận
Tọa độ được đối chiếu với vùng cho phép bằng công thức Haversine và bán kính cấu hình được, rồi kiểm tra chéo với thời gian và tốc độ di chuyển.
Engine gamification
Luật cho chuỗi điểm danh, tiến độ nhiệm vụ, huy hiệu và vòng quay may mắn nằm phía server để chống gian lận, đồng bộ với ứng dụng qua REST.
Vòng đời voucher
Kiếm, duyệt, giữ chỗ, đổi và hết hạn, có theo dõi tồn kho và mọi giao dịch được ghi log để đối soát.
Một chuẩn API
Endpoint được nhóm theo domain và dùng chung cấu trúc lỗi, định dạng phân trang và mã trạng thái.
Bài toán đã giải
Vấn đềSinh viên dùng app giả lập GPS để check-in mà không cần đến trường.
Giải phápPhát hiện nhiều lớp: khoảng cách Haversine phía server, heuristic thời gian và tốc độ để loại "dịch chuyển tức thời", và thời gian chờ giữa các địa điểm. Gian lận phát hiện được giảm 95%.
Vấn đềNhiều request vòng quay cùng lúc có thể trao thưởng mà không trừ lượt quay.
Giải phápOptimistic concurrency với row versioning của EF Core, để việc trừ lượt và trao thưởng cùng commit nguyên tử hoặc thử lại.
Vấn đềVoucher đã đổi nhưng không dùng chặn tồn kho của người khác.
Giải phápVòng đời hai giai đoạn, giữ chỗ rồi mới đổi, có job chạy mỗi giờ giải phóng chỗ giữ hết hạn và thông báo nhắc trước khi hết hạn.
Hình ảnh

Bài học
- Kiểm tra phía client không bao giờ đủ cho tính năng dựa trên vị trí. Mọi kiểm tra GPS phải được xác minh lại trên server.
- Optimistic concurrency với row versioning đơn giản và nhanh hơn distributed lock khi tranh chấp một tài nguyên.
- Một chuẩn API chung tiết kiệm hàng tuần debug khi ghép frontend với backend.