Dự án SePay Webhook Service là một ứng dụng backend được xây dựng trên nền tảng NestJS dùng để nhận và xử lý các sự kiện thanh toán tự động (Webhook) từ hệ thống SePay (dịch vụ tự động hóa giao dịch ngân hàng tại Việt Nam). Hệ thống hỗ trợ xử lý gia hạn gói dịch vụ tự động và gửi thông báo qua Telegram.
- Nhận Webhook từ SePay:
- Cung cấp API Endpoint:
POST /webhook/sepaytại SePayController để nhận dữ liệu từ SePay. - Xác thực bảo mật thông qua Token (
Authorization: Bearer <token>).
- Cung cấp API Endpoint:
- Chống trùng lặp giao dịch (Idempotency):
- Kiểm tra mã tham chiếu ngân hàng (
referenceNumber) trước khi xử lý nhằm ngăn chặn việc xử lý trùng lặp giao dịch.
- Kiểm tra mã tham chiếu ngân hàng (
- Phân tích cú pháp nội dung chuyển khoản (Parsing):
- Sử dụng biểu thức chính quy (Regex) quét nội dung chuyển khoản để tự động bóc tách mã gói dịch vụ (ví dụ:
YOUTUBE 1024lấy ra gói ID1024).
- Sử dụng biểu thức chính quy (Regex) quét nội dung chuyển khoản để tự động bóc tách mã gói dịch vụ (ví dụ:
- Gia hạn và Đối soát số tiền tự động:
- So sánh số tiền thực nhận (
transferAmount) với giá niêm yết của gói dịch vụ. - Nếu đủ tiền: Hệ thống tự động gia hạn thêm 01 tháng sử dụng, cập nhật ngày hết hạn mới và lên lịch ngày nhắc thanh toán tiếp theo.
- Nếu thiếu tiền: Gửi cảnh báo lỗi thanh toán qua Telegram.
- So sánh số tiền thực nhận (
- Thông báo qua Telegram:
- Tích hợp TelegramService để gửi thông báo chi tiết (gồm mã GD, số tiền, hạn dùng mới...) tới nhóm Telegram tương ứng.
- Lập lịch nhắc nợ tự động (Cron Job):
- Tích hợp SubscriptionSchedulerService chạy tự động vào 08:00 sáng mỗi ngày (múi giờ
Asia/Ho_Chi_Minh) quét tìm các gói sắp đến ngày nhắc nợ để gửi tin nhắn yêu cầu gia hạn kỳ mới đến nhóm Telegram.
- Tích hợp SubscriptionSchedulerService chạy tự động vào 08:00 sáng mỗi ngày (múi giờ
src/
├── main.ts # File khởi chạy ứng dụng NestJS
├── app.module.ts # Module gốc của ứng dụng
└── modules/
├── sepay/
│ ├── dto/
│ │ └── sepay-webhook.dto.ts # Cấu trúc dữ liệu Webhook gửi từ SePay
│ ├── sepay.controller.ts # Endpoint xử lý Webhook POST /webhook/sepay
│ ├── sepay.service.ts # Logic nghiệp vụ xử lý giao dịch & gia hạn
│ ├── sepay.module.ts
│ └── sub-scheduler.service.ts # Cron job nhắc nhở gia hạn mỗi ngày
└── telegram/
├── telegram.service.ts # Service tích hợp Telegram Bot API gửi tin nhắn
└── telegram.module.tsTạo một file .env ở thư mục gốc của dự án với các cấu hình sau:
PORT=3000
SEPAY_WEBHOOK_TOKEN=your_sepay_webhook_token_here
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_CHAT_ID=your_telegram_chat_id_hereSEPAY_WEBHOOK_TOKEN: Chuỗi token bảo mật bạn cấu hình trên dashboard của SePay để xác thực nguồn webhook.TELEGRAM_BOT_TOKEN: Token của Telegram Bot dùng để gửi thông báo (tạo qua BotFather).TELEGRAM_CHAT_ID: ID của nhóm hoặc chat riêng tư nhận thông báo từ bot.
Sử dụng npm để cài đặt dependencies:
npm install-
Chạy chế độ phát triển (Development):
npm run start:dev
-
Build và chạy phiên bản production:
npm run build npm run start:prod
-
URL:
/webhook/sepay -
Method:
POST -
Headers:
Authorization:Bearer <SEPAY_WEBHOOK_TOKEN>Content-Type:application/json
-
Body mẫu (JSON):
{ "id": 123456, "gateway": "Vietcombank", "transactionDate": "2026-06-23 11:00:00", "accountNumber": "1012345678", "transferType": "in", "transferAmount": 50000, "accumulatedBalance": 1050000, "content": "YOUTUBE 1024", "referenceNumber": "VCB.FT.260623.1100" } -
Phản hồi thành công:
- Mã trạng thái:
200 OK - Body:
{ "success": true, "message": "Webhook processed", "data": { "status": "success", "packageId": 1024, "newExpiry": "2026-07-30T00:00:00.000Z", "nextNotification": "2026-07-27" } }
- Mã trạng thái: