Hỏi chủ một trung tâm giáo dục tiền rò ở đâu, họ sẽ không nói gian lận. Họ sẽ nói đối soát.
Một phụ huynh chuyển 3.200.000 đồng với nội dung "hoc phi". Một người khác chuyển đúng số đó cùng buổi chiều. Ba tuần sau, hai học sinh bị đánh dấu chưa đóng, hai phụ huynh bực mình, và ai đó mất một buổi tối ngồi so bản xuất sao kê với một bảng tính.
Toàn bộ mẹo nằm ở mã tham chiếu
VietQR cho phép mã thanh toán mang theo một mã tham chiếu có cấu trúc. ECMS đặt định danh hóa đơn vào đó, nên khoản chuyển khoản về tới nơi là đã biết nó thuộc hóa đơn nào. Phụ huynh không phải gõ nội dung; họ quét và xác nhận.
Webhook đối soát sau đó tự ghi khoản thu ngược về đúng hóa đơn ấy. Không còn buổi tối ngồi so sao kê.
Toàn bộ ý tưởng chỉ có vậy, và nó chẳng thông minh gì. Thứ đáng viết là hai chỗ nó hỏng.
Hỏng thứ nhất: cái webhook không ai ký
Một endpoint xác nhận thanh toán, về bản chất, là một endpoint đánh dấu hóa đơn đã trả. Nếu ai trên internet cũng POST vào được, thì ai trên internet cũng tự xóa nợ học phí của mình được.
ECMS bắt buộc phải có VIETQR_WEBHOOK_SECRET. Không cấu hình thì webhook bị từ chối thẳng chứ không xử lý.
Nghe thì hiển nhiên, nhưng nó ngược với cách phần lớn hệ thống làm. Kiểu phổ biến là: không có khóa thì bỏ qua bước xác minh và cứ xử lý - tiện khi phát triển và thảm họa khi lên production, vì kiểu hỏng của một biến môi trường bị thiếu trở thành "âm thầm chấp nhận tất cả" thay vì "dừng lại".
Quy tắc chúng tôi áp cho mọi thứ liên quan tới tiền hoặc tới quyền truy cập: thiếu thông tin xác thực nghĩa là từ chối, không bao giờ nghĩa là bỏ qua kiểm tra. Sẽ có lúc ai đó deploy mà quên biến đó. Bạn muốn lần deploy ấy báo động, chứ không phải lặng lẽ mở cửa.
Hỏng thứ hai: mã tham chiếu không sống sót qua ngân hàng
Một mã tham chiếu có cấu trúc chỉ hữu ích nếu nó về tới nơi còn nguyên vẹn. Ngân hàng cắt bớt, viết hoa, bỏ dấu câu, và thỉnh thoảng trả về một nội dung mà khách đã tự sửa tay.
Vì vậy việc khớp không được phép giả định chuỗi hoàn hảo. Định danh hóa đơn ngắn, dùng bộ ký tự không gây nhầm lẫn, và bộ khớp lùi về phương án số tiền cộng người chuyển cộng khoảng thời gian khi mã tham chiếu bị hỏng - còn khi đến mức đó vẫn mơ hồ, khoản thu rơi vào hàng chờ duyệt thay vì bị đoán bừa vào một hóa đơn.
Hàng chờ mới là phần quan trọng. Một hệ thống đối soát lúc nào cũng quyết định thì sớm muộn sẽ ghi tiền nhầm học sinh, và cái sai đó tệ hơn công việc thủ công mà nó thay thế, vì giờ không còn ai kiểm tra nữa.
Vòng lặp đó thật sự đáng giá ở đâu
Cái tiết kiệm được không phải buổi tối của kế toán, dù điều đó là thật. Nó nằm ở chỗ danh sách lớp và hồ sơ tài chính thôi là hai ý kiến khác nhau.
Điểm danh, ghi danh và học phí khi đó nằm trên cùng một tập dữ liệu, khiến các câu hỏi phái sinh trả lời được mà không cần rào đón: lớp nào đang còn nợ học phí, chương trình nào thật sự có lãi sau khi quy chi phí giáo viên, và học sinh nào có nguy cơ bỏ vì lý do tài chính chứ không phải vì học lực - một phân biệt mà trung tâm có thể hành động được, nhưng chỉ khi hai nửa của hồ sơ khớp nhau.
