PRD: Vòng đời thanh toán qua nhà cung cấp
| Module | Thanh toán | PRD ID | PRD-PAY-001 |
| Trạng thái | Sẵn sàng dev | FEAT | PAY |
| Epic | — | Plane | BANA-1511 |
| Ngày | 2026-07-15 | Phiên bản | v1.1 |
| Gói | @nx/payment | URD | PAY |
| Surface | BackendSale · POS | ||
| Phụ trách | Phát Nguyễn | ||
Dịch vụ thanh toán làm gì
Khi thu ngân (cashier) thu tiền một đơn bằng mã QR hoặc máy quẹt, tiền không đi thẳng từ POS vào sổ. Nó đi qua một nhà cung cấp thanh toán (payment provider) bên ngoài - VNPAY - rồi nhà cung cấp báo kết quả về.
Dịch vụ thanh toán (Payment Service) là nơi nhận kết quả đó. Nó lấy thông báo từ nhà cung cấp, đổi trạng thái của khoản thanh toán, đẩy trạng thái mới về màn hình thu ngân ngay lập tức, và báo cho bán hàng (Sale) biết để tất toán đơn. Từ đó tài chính, kho và hóa đơn tự phản ứng theo.
Bốn trạng thái của một khoản thanh toán
Mỗi khoản thanh toán đi qua một vòng đời ngắn, mô tả bằng ngôn ngữ nghiệp vụ:
| Trạng thái | Nghĩa |
|---|---|
| đang chờ (pending) | Đã tạo yêu cầu, mã QR đang chờ khách quét hoặc máy quẹt đang chờ thẻ |
| đã thanh toán (paid) | Nhà cung cấp xác nhận tiền đã vào |
| thất bại (failed) | Nhà cung cấp báo giao dịch không thành |
| hết hạn (expired) | Mã QR hết hạn trước khi có ai trả |
Hai kiểu nhận tiền của VNPAY
- VNPAY QR MMS: sinh một mã QR, khách quét bằng app ngân hàng để trả.
- PhonePOS: biến điện thoại của thu ngân thành thiết bị nhận thẻ, khách chạm thẻ vào điện thoại.
Cả hai đều báo kết quả về dịch vụ thanh toán theo cùng một đường, nên phần sau của hệ thống xử lý giống nhau bất kể khách trả bằng cách nào.
Một khoản thanh toán QR, từ lúc quét tới lúc lên sổ
Thu ngân thu 200.000đ cho đơn #123 bằng VNPAY QR MMS:
| Việc xảy ra | Trạng thái khoản thanh toán | Thu ngân thấy |
|---|---|---|
| Thu ngân bấm thu tiền, mã QR hiện ra | đang chờ | Màn chờ khách quét |
| Khách quét và trả, VNPAY báo về | đã thanh toán | Màn tự chuyển sang đã trả, không cần bấm làm mới |
| Bán hàng nhận tin, tất toán đơn #123 | đã thanh toán | Đơn #123 đóng, in hóa đơn |
- Thu ngân không phải bấm làm mới hay chờ vòng hỏi trạng thái. Trạng thái tự đẩy về ngay khi VNPAY xác nhận.
- Ngay sau khi đơn tất toán, tài chính ghi phiếu thu, kho trừ hàng, hóa đơn phát hành - tất cả tự chạy, không giữ chân thu ngân.
Chỗ dễ sai nhất
Cấu hình và thông tin xác thực KHÔNG thuộc dịch vụ thanh toán
Việc chọn nhà cung cấp nào, nhập mã merchant và thông tin xác thực, gắn với ví nào - tất cả nằm trong ví tài chính (Finance Account) của merchant, do module tài chính quản lý. Cả chủ merchant và đội vận hành (operations team) cấu hình tại đó.
Dịch vụ thanh toán chỉ đọc cấu hình đang hoạt động từ ví tài chính khi thu tiền. Nó không có màn cấu hình riêng và không lưu thông tin xác thực của riêng nó.
Một kết quả gửi lại chỉ được áp dụng một lần
Mạng chập chờn có thể khiến nhà cung cấp gửi cùng một thông báo thành công hai lần. Dịch vụ thanh toán nhận ra lần thứ hai và bỏ qua, nên không có chuyện tính tiền hai lần hay lên sổ hai lần cho cùng một khoản.