Đối soát là so từng giao dịch giữa hệ thống của bạn và bản ghi bên cổng, không phải so mỗi con số tổng. Số tổng chỉ nói có lệch hay không, không nói lệch ở đâu.
Chuẩn bị dữ liệu: mỗi giao dịch phải có một khoá đối chiếu chung — mã tham chiếu bạn sinh (order_ref) và mã giao dịch bên cổng (gateway_txn_id), lưu cả hai. Không lưu gateway_txn_id là lý do phổ biến khiến không đối soát được.
Luồng job hằng ngày:
1. Lấy file/API sao kê của cổng cho ngày D (cắt theo múi giờ mà cổng dùng, thường là giờ VN).
2. Nạp vào bảng tạm settlement_records — giữ nguyên dữ liệu thô để lần sau chạy lại vẫn tái lập được.
3. Full outer join với bảng payments theo khoá đối chiếu, phân loại thành bốn nhóm.
4. Ghi kết quả vào bảng reconciliation_items với trạng thái, để người vận hành xử lý và có dấu vết.
Bốn nhóm lệch và nghĩa của chúng:
- Chỉ có ở cổng: khách đã trả tiền nhưng hệ thống chưa ghi nhận — thường do mất IPN. Đây là nhóm nguy hiểm nhất, phải bù đơn cho khách.
- Chỉ có ở hệ thống: đơn đánh dấu paid mà cổng không có giao dịch — dấu hiệu lỗi logic hoặc gian lận, phải chặn quyền lợi đã cấp.
- Khớp nhưng lệch số tiền: kiểm tra phí, tiền tệ, hoàn một phần.
- Khớp nhưng lệch trạng thái: giao dịch bị huỷ/hoàn ở phía cổng mà hệ thống chưa cập nhật.
Ba điểm khiến câu trả lời sâu hơn: job phải chạy lại được không sinh sai lệch mới (khoá theo date + gateway, ghi kết quả kiểu upsert); tiền về tài khoản ngân hàng thường trễ T+1 hoặc T+2 nên phải đối soát cả tầng thanh toán và tầng chuyển tiền; và cần cảnh báo tự động khi số bản ghi lệch vượt ngưỡng, thay vì chờ kế toán phát hiện cuối tháng.