Đối soát giao dịch ngân hàng = match từng dòng biên lai vào ngân hàng với từng đơn pending trong shop. Làm tay = nhân viên FT 8h/ngày. Auto = vài giây sau khi tiền vào tài khoản.
3 cách đối soát tự động
1. Webhook push — BeePay (recommend)
Service bên ngoài (BeePay) đọc SMS biên lai từ bank, parse, POST webhook về site bạn ngay khi tiền vào.
- ✓ Realtime (1-3 giây)
- ✓ Không tốn quota API
- ✓ Phí cố định ~100k/tháng, không phí giao dịch
- ✗ Phụ thuộc service bên ngoài
2. Polling API ngân hàng — Vietcombank, MB Bank
Bank cung cấp API query lịch sử giao dịch. Cron job chạy mỗi 30s, lấy 20 giao dịch gần nhất, match với pending orders.
- ✓ Không phụ thuộc service trung gian
- ✗ Trễ 30-60 giây
- ✗ Không phải bank nào cũng có API public
- ✗ Polling nhiều = tốn quota / có thể bị block
3. Parse SMS local — server tự đặt cạnh điện thoại
Cài modem GSM hoặc Android device cũ vào server, đọc SMS biên lai bằng AT command hoặc Tasker → POST webhook về site.
- ✓ Không phụ thuộc bên thứ 3 nào
- ✗ Setup hardware phức tạp
- ✗ Mất sóng / hết pin / hỏng modem = đối soát chết
- ✗ Không scale (chỉ 1 SIM = 1 bank)
So sánh trên 3 trục
| Webhook (BeePay) | Polling API | SMS local | |
|---|---|---|---|
| Setup time | 30 phút | 2-3 giờ | 1-2 ngày |
| Maintenance | Hầu như không | Refresh token, retry | Hardware monitor |
| Latency | 1-3s | 30-60s | 5-15s |
| Cost / tháng | ~100k | ~100k (API rent) | ~50k SIM + hardware |
| Reliability | 99.9% | ~99% (token expire) | ~95% (hardware fail) |
Khi nào dùng cách nào?
- SME shop online <500 đơn/ngày → BeePay (webhook). 30 phút setup, ROI ngay tháng đầu.
- Hệ thống enterprise có dev team → Polling API VCB / MB. Tự kiểm soát hoàn toàn, không phụ thuộc service ngoài.
- Site offline / không có internet ổn định → SMS local. Chấp nhận setup phức tạp.
Pitfall thường gặp khi auto-đối soát
- Khách CK thiếu nội dung — order_id không match. Cần fallback: hiển thị danh sách giao dịch unmatched cho admin xác nhận tay (≤5% volume)
- Khách CK sai số tiền — thừa hoặc thiếu vài đồng. Logic so sánh: cho phép sai trong khoảng ±100đ thì auto-match, ngoài thì gắn cờ "amount mismatch" cho admin review
- Trùng order_id — 2 khách trùng lặp khi gen ID không random đủ. Dùng
Date.now() + 6 ký tự randomđể giảm va chạm - Refund / hoàn tiền — webhook chỉ báo CK in. Hoàn tiền out cần hệ thống riêng
BeePay handle hết 4 case này — code mẫu ở tích hợp Next.js và WooCommerce.