Payment và revenue

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.