sieuthicode.com

Thông báo

16

Ưu Đãi Khi Mua Hosting

Mã giảm giá 10% : HOSTING1205
1 năm trước

THÔNG BÁO API

API MBBANK ĐÃ UPDATE VẪN SỬ DỤNG BÌNH THƯỜNG NHÉ
2 năm trước

Thông Báo Khẩn

Chúng tôi đã mã hóa mật khẩu và dữ liệu API. Vui lòng xóa và thêm lại tài khoản của bạn.
2 năm trước

NHẬN FIX TẤT CẢ API

NHẬN FIX TẤT CẢ API TỪ 100K ĐÊN 300K MỌI API
2 năm trước

THÔNG BÁO MỚI

MÃ GIẢM 50% KHI MUA CODE : SINAMI23H
2 năm trước

THÔNG BÁO API

HẠ GIÁ THUÊ API XUỐNG 25K/ THÁNG VÀ HỖ TRỢ ĐẤU APP FREE
3 năm trước

THỐNG BÁO HÓT

FREE HOST USA1 ĐẾN 30/3/2024
3 năm trước

THÔNG BÁO GIẢM GIÁ

GIẢM GIÁ THUÊ CRONS 1S SERVER US VÀ VN XUỐNG 6K
3 năm trước

THÔNG BÁO

Lsgd mbbank sử dụng bth rồi
3 năm trước

Thông báo hot

Ra mắt thêm api seabank
3 năm trước

THÔNG BÁO KHẨN

NÂNG GIÁ THUÊ API LÊN 30K/ THÁNG VÀ HỖ TRỢ ĐẤU WEB APP FREE
3 năm trước

THÔNG BÁO HOT

TẠNG HOSTING FREE 1 NĂM CODE : FREEHOSSTING
3 năm trước

KHUYỄN MÃI

FREE CRONS SEVER 4 (VN) 1S
3 năm trước

THÔNG BÁO KHẨN

GIẢM GIÁ CRONS 1S CHỈ CÒN 5K
3 năm trước

KHUYỄN MÃI NẠP

NẠP TRÊN 100K NHẬN THÊM 10% TRONG HÔM NAY
3 năm trước
SIÊU THỊ CODE / KIẾN THỨC & CÔNG NGHỆ

Cách ngăn cộng tiền hai lần khi đối soát giao dịch MB Bank qua API

Để tránh cộng tiền hai lần khi đối soát giao dịch MB Bank qua API, hệ thống cần nhận diện mỗi giao dịch ngân hàng bằng một khóa duy nhất, rồi ghi nhận giao dịch và cập nhật số dư trong cùng một transaction cơ sở dữ liệu. Kiểm tra trùng ở mã ứng dụng là chưa đủ vì webhook, tiến trình lấy lịch sử và tác vụ thử lại có thể chạy đồng thời.

Hướng dẫn dưới đây dành cho lập trình viên vận hành website nhận chuyển khoản MB Bank. Cần phân biệt API chính thức của ngân hàng với dịch vụ tích hợp bên thứ ba; cấu trúc mã giao dịch, cơ chế xác thực và quy tắc gửi lại phải đối chiếu tài liệu của đúng bên cung cấp. Bài viết không giả định MB Bank có endpoint công khai hay một kiểu chữ ký cụ thể.

Phân biệt thông báo trùng với hai lần chuyển khoản thật

Hai bản tin giống nhau chưa chắc là hai khoản tiền. Ngược lại, hai giao dịch có cùng nội dung và số tiền vẫn có thể là hai lần chuyển khoản hợp lệ.

Phân biệt thông báo trùng với hai lần chuyển khoản thật
  • Thông báo lặp: cùng một giao dịch được gửi lại do mất kết nối, phản hồi chậm hoặc cơ chế retry của nhà cung cấp.
  • Trùng giữa các kênh: webhook và tác vụ lấy lịch sử cùng phát hiện một giao dịch.
  • Chuyển khoản lặp thực tế: khách chuyển hai lần, phát sinh hai mã giao dịch ngân hàng khác nhau.
  • Ghép đơn sai: nhiều đơn dùng chung nội dung chuyển khoản, khiến một giao dịch bị gán vào nhiều đơn.

Không dùng riêng tổ hợp số tiền, nội dung và thời gian làm khóa chống trùng. Hai khách có thể chuyển cùng số tiền trong một khoảng thời gian ngắn. Hãy xác nhận trường nào định danh giao dịch ổn định, phạm vi duy nhất của trường đó và liệu webhook với lịch sử có dùng cùng định danh hay không.

Thiết kế khóa chống trùng và dữ liệu đối soát

Tách đơn nạp khỏi giao dịch nhận tiền

Đơn nạp thể hiện yêu cầu của khách; giao dịch ngân hàng thể hiện tiền thực nhận. Hai đối tượng này cần bản ghi riêng. Đơn nên có mã nội bộ, người dùng, số tiền dự kiến, tài khoản nhận, nội dung tham chiếu và trạng thái. Giao dịch cần lưu mã từ nguồn cung cấp, số tiền, chiều giao dịch, tài khoản nhận, thời điểm và kết quả xử lý.

Khi ghép đơn, phải kiểm tra đồng thời mã tham chiếu, số tiền và tài khoản nhận. Chỉ xử lý khoản ghi có phù hợp với quy tắc đã công bố. Giao dịch thiếu nội dung, sai số tiền hoặc không xác định được đơn nên vào hàng chờ đối soát, không tự cộng theo phỏng đoán.

Đặt ràng buộc duy nhất trong cơ sở dữ liệu

Khóa chống trùng phải dựa trên phạm vi định danh được tài liệu xác nhận. Chẳng hạn, nếu mã chỉ duy nhất trong từng tài khoản, khóa cần bao gồm tài khoản đó. Không tùy tiện thêm tên kênh webhook hoặc polling vào khóa: làm vậy có thể khiến cùng một giao dịch bị coi là hai bản ghi khác nhau.

Ví dụ giả lập về ràng buộc dữ liệu:
UNIQUE(source_namespace, receiving_account_id, bank_transaction_id)
UNIQUE(ledger_entry_type, payment_transaction_id)

Đây là minh họa thiết kế, không phải tên trường của API MB Bank. Ràng buộc thứ nhất chống lưu trùng giao dịch; ràng buộc thứ hai ngăn tạo lại bút toán cộng tiền cho giao dịch đó. Nếu nguồn không cung cấp định danh đủ tin cậy, cần làm rõ với nhà cung cấp trước khi tự động ghi có.

Xử lý thông báo và cập nhật số dư một cách nguyên tử

Transaction cơ sở dữ liệu giúp các thay đổi liên quan cùng thành công hoặc cùng bị hủy. Kết hợp ràng buộc duy nhất với khóa bản ghi hoặc cập nhật có điều kiện để tránh hai tiến trình cùng xử lý một đơn.

Xử lý thông báo và cập nhật số dư một cách nguyên tử
  1. Xác minh đầu vào: kiểm tra xác thực webhook theo tài liệu nhà cung cấp, bao gồm chống phát lại nếu được hỗ trợ. Giữ secret phía server, không đưa vào JavaScript trình duyệt.
  2. Lưu nhận bền vững: lưu sự kiện đã xác minh hoặc đưa vào hàng đợi bền vững trước khi xác nhận đã tiếp nhận theo giao thức của bên gửi.
  3. Chuẩn hóa dữ liệu: xác định mã giao dịch, tài khoản nhận, chiều tiền và số tiền bằng kiểu số chính xác; không dùng số thực dấu phẩy động để tính tiền.
  4. Mở transaction: tạo hoặc khóa bản ghi giao dịch, kiểm tra trạng thái và tìm đơn phù hợp.
  5. Ghi sổ: tạo bút toán duy nhất, cập nhật số dư và trạng thái đơn trong cùng transaction. Nếu giao dịch đã được ghi sổ, không cộng lại.
  6. Hoàn tất: commit trước khi đánh dấu xử lý thành công. Nếu lỗi, rollback và cho phép thử lại có kiểm soát.

Không coi việc khách quay về trang thành công hoặc callback từ trình duyệt là bằng chứng đã nhận tiền. Nếu cập nhật ví ở một dịch vụ khác, transaction cục bộ không bao trùm được toàn bộ luồng; cần cơ chế chuyển việc bền vững như outbox và khóa chống trùng tại dịch vụ nhận.

Ví dụ một giao dịch đến từ hai kênh

Tình huống giả lập: đơn nạp NAP-DEMO-27 chờ nhận 200.000 đồng vào tài khoản MB Bank đã cấu hình. Webhook thông báo giao dịch GD-DEMO-81; ngay sau đó, tác vụ lấy lịch sử cũng trả về chính giao dịch này.

Tiến trình webhook tạo bản ghi giao dịch, khóa đơn, kiểm tra khớp tiền và tài khoản rồi ghi một bút toán cộng 200.000 đồng. Tiến trình lấy lịch sử gặp khóa duy nhất đã tồn tại nên đọc trạng thái hiện tại thay vì tạo khoản cộng mới. Kết quả cần đạt là một giao dịch, một bút toán và số dư chỉ tăng 200.000 đồng.

Nếu khách thực sự chuyển thêm 200.000 đồng với mã GD-DEMO-82, đây là khoản tiền khác, không phải thông báo trùng. Nếu đơn chỉ được thanh toán một lần, giao dịch thứ hai cần vào quy trình xử lý tiền thừa hoặc đối soát thủ công, thay vì bị xóa vì giống nội dung.

Khắc phục các lỗi thường gặp

  • Kiểm tra tồn tại rồi mới chèn: hai tiến trình có thể cùng thấy chưa tồn tại. Cần ràng buộc unique và xử lý xung đột trong transaction.
  • Đánh dấu hoàn tất trước khi cộng tiền: lỗi giữa chừng khiến đơn thành công nhưng ví chưa tăng. Các cập nhật phải nguyên tử.
  • Chỉ chống trùng bằng bộ nhớ hoặc cache: khởi động lại hay hết hạn khóa có thể cho giao dịch cũ chạy lại. Cơ sở dữ liệu phải giữ bằng chứng đã ghi sổ.
  • Dùng thời điểm nhận làm định danh: mỗi lần gửi lại có thời điểm khác nhau. Cần dùng định danh giao dịch ổn định.
  • Retry mọi lỗi liên tục: lỗi dữ liệu không tự hết khi thử lại. Tách lỗi tạm thời khỏi lỗi cần can thiệp, tăng dần khoảng chờ và giới hạn số lần thử.

Khi đã cộng nhầm, không xóa lịch sử để che chênh lệch. Hãy xác minh khoản nhận thực tế, lập bút toán điều chỉnh có liên kết đến bút toán sai và lưu người phê duyệt. Nếu tiền đã được sử dụng, cần xử lý theo quy trình vận hành thay vì tự ý trừ thiếu kiểm soát.

Khắc phục các lỗi thường gặp

Kiểm thử và đối soát trước khi vận hành

Dùng dữ liệu giả lập hoặc môi trường thử nghiệm nếu nhà cung cấp hỗ trợ. Gửi cùng một sự kiện nhiều lần và chạy đồng thời webhook với tác vụ lấy lịch sử. Cố ý gây lỗi trước commit, sau commit và trước phản hồi để kiểm tra khả năng phục hồi.

  • Mỗi giao dịch hợp lệ chỉ có một bút toán ghi có.
  • Hai giao dịch thật khác mã vẫn được lưu riêng.
  • Sai tài khoản nhận hoặc sai số tiền không tự hoàn tất đơn.
  • Thử lại sau lỗi không làm tăng số dư lần nữa.
  • Tổng tiền ghi sổ khớp các khoản thực nhận đủ điều kiện trong kỳ.

Log nên có mã đơn, mã giao dịch, trạng thái, số lần thử và lý do từ chối; che thông tin nhạy cảm và không ghi secret. Đối soát thủ công cần phát hiện cả tiền đã nhận nhưng chưa ghi sổ lẫn khoản đã ghi sổ không có giao dịch tương ứng.

Câu hỏi thường gặp

Có nên bỏ qua mọi webhook đến lần thứ hai?

Không. Nếu lần đầu chưa ghi sổ thành công, lần sau có thể cần tiếp tục xử lý. Hãy dựa vào trạng thái đã commit, không chỉ số lần nhận.

Khóa theo mã đơn có đủ không?

Không. Mã đơn giới hạn việc hoàn tất đơn, còn mã giao dịch ngăn cùng khoản tiền bị dùng lại ở nơi khác. Cần kiểm soát cả hai.

Có thể dùng chung bộ xử lý cho webhook và lấy lịch sử không?

Nên dùng chung logic ghi sổ sau khi chuẩn hóa dữ liệu. Điều kiện là phải ánh xạ được hai nguồn về cùng định danh giao dịch đáng tin cậy.

Bắt đầu bằng việc kiểm tra định danh giao dịch

Hãy yêu cầu tài liệu xác nhận mã giao dịch, phạm vi duy nhất, xác thực webhook và quy tắc retry của nguồn đang dùng. Sau đó kiểm tra ràng buộc dữ liệu và chạy thử tình huống nhận đồng thời trước khi bật tự động cộng tiền. Nếu đang lựa chọn giải pháp tích hợp, bạn có thể tham khảo danh mục liên quan tại sieuthicode.com và trao đổi nhu cầu đối soát; cần xác nhận khả năng hỗ trợ MB Bank cùng thông số thực tế trước khi mua.

Chia sẻ bài viết này