Payment trong LMS là backend truth. Frontend chỉ tạo intent/redirect/poll, còn backend xác minh callback, chuyển trạng thái transaction và kích hoạt quyền học.
Luồng VNPay
Student chọn mua
-> POST /api/v3/payments/vnpay/create-url
-> redirect sang VNPay
-> VNPay gọi /api/v3/payments/vnpay-ipn
-> backend verify checksum + amount + transaction
-> auto-enroll / activation state
-> browser về /api/v3/payments/vnpay-return -> FE callback page
Luồng SePay
Student tạo QR
-> POST /api/v3/payments/sepay/create-qr
-> FE hiển thị QR và poll /sepay/poll/{txnId}
-> SePay gọi /sepay/webhook
-> backend đối soát nội dung chuyển khoản
-> auto-enroll / activation state
Endpoint cần nhớ
Endpoint
Vai trò
POST /api/v3/payments/checkout
Simulated payment dev-only, bị chặn production
POST /api/v3/payments/vnpay/create-url
Tạo URL VNPay
GET /api/v3/payments/vnpay-ipn
IPN server-to-server
GET /api/v3/payments/vnpay-return
Browser redirect
POST /api/v3/payments/sepay/create-qr
Tạo QR SePay
POST /api/v3/payments/sepay/webhook
Webhook SePay
GET /api/v3/payments/sepay/poll/{txnId}
Poll trạng thái
GET /api/v3/payments/available-methods
FE biết cổng nào bật
GET /api/v3/payments/admin/all
Admin/ORG_ADMIN xem giao dịch
POST /api/v3/payments/admin/{paymentId}/refund
Refund và revoke enrollment
GET /api/v3/payments/admin/gateway-status
ADMIN xem trạng thái gateway
File nguồn
File
Vai trò
PaymentControllerV3
REST API payment
CreateVnPayUrlUseCase
Tạo payment URL
ProcessVnPayIpnUseCase
Verify IPN và chuyển trạng thái
CreateSepayPaymentUseCase
Tạo QR/chuyển khoản
ProcessSepayWebhookUseCase
Xử lý webhook SePay
RefundPaymentUseCase
Hoàn tiền, audit và revoke access
ProcessPayoutUseCase
Luồng payout/revenue
fe/src/app/features/payment/payment.service.ts
Frontend payment calls
Điểm bảo vệ
Không tin amount từ frontend; backend resolve server price từ course.
Production không cho simulated checkout.
IPN/webhook là nguồn sự thật cho trạng thái thanh toán.
Refund không chỉ đổi trạng thái transaction mà còn revoke enrollment nếu cần.
ORG_ADMIN query payment theo organization, không xem giao dịch tổ chức khác.