Bắt đầu nhanh với MONA Pay trong 5 phút
Video hướng dẫn
Xem transcript video (8 phần)
Chuẩn bị trước khi làm
Bạn muốn tiền vừa vào tài khoản ACB là website biết ngay, nhưng đang mắc giữa tài khoản, khóa API, hai lần OTP và webhook. Video này mình đi trọn sáu việc trong khoảng năm phút: chuẩn bị, đăng ký, lấy quyền gọi API, nối ngân hàng, khai báo webhook rồi chuyển một khoản nhỏ để kiểm tra. Bạn cần tài khoản ACB, điện thoại nhận OTP và một URL HTTPS công khai. Chưa có máy chủ vẫn có thể dùng thông báo Telegram.
Đăng ký và lấy token
Vào my.monapay.vn/auth, chọn tab Đăng ký, rồi điền tên đăng nhập, mật khẩu, tên và email. Tài khoản tạo xong dùng ngay, không có bước chờ duyệt. Nếu làm qua API, gửi POST tới /api/v1/client/register-client với ba trường username, password, name. Sau đó đăng nhập tại /api/v1/client/login. Kết quả có access_token và expires_in; mọi lệnh gọi tiếp theo gửi Authorization: Bearer kèm token này.
Tạo khóa API
Mở mục API Keys và tạo một khóa tên may-chu-production. Hệ thống trả client_secret, tức mã bí mật, đúng một lần nên phải lưu ngay vào biến môi trường. Nếu mất, tạo khóa mới rồi thu hồi khóa cũ. Với token lấy từ client/login, các lệnh POST, PUT, PATCH và DELETE còn phải gửi X-Client-Secret. Token đổi qua /api/v1/oauth/token không bắt buộc header này, nhưng tài liệu vẫn khuyến nghị luôn gửi.
Nối ACB bằng hai OTP
Tiếp theo vào Ngân hàng & VA, bấm Thêm tài khoản. Nhập số tài khoản ACB, số điện thoại đã đăng ký với ACB, loại khách hàng cá nhân hoặc doanh nghiệp, rồi tự đặt đầu số VA bằng chữ in hoa hoặc số, ví dụ HOA hay SHOP. Nhập OTP thứ nhất để xác thực và tạo tài khoản ảo đầu tiên. Đăng ký nhận thông báo, nhập OTP thứ hai. Phải hoàn tất đủ hai lượt thì giao dịch mới báo sang hệ thống.
Khai báo webhook
ACB sẽ ghép mã đối tác phía trước đầu số bạn chọn. Ví dụ đầu số HOA có thể thành VA LOCHOA000123456; hãy dùng nguyên số hệ thống trả về, không tự ghép. Bây giờ vào Webhooks, bấm Thêm webhook. Điền URL HTTPS, chọn HMAC_SHA256, đặt secret_key, tức mã bí mật dùng ký webhook, và để định dạng application/json. Bỏ trống virtual_account_id để nhận mọi tài khoản, hoặc chọn một VA để lọc riêng.
Kiểm chữ ký và localhost
Endpoint phía bạn làm ba việc theo đúng thứ tự: đọc raw body, kiểm X-Mona-Timestamp và X-Mona-Signature, trả HTTP 200 ngay, rồi mới xử lý đơn. Chữ ký là HMAC-SHA256 của chuỗi timestamp, dấu chấm và raw body. Timestamp lệch quá năm phút thì từ chối. Nếu đang thử trên máy cá nhân, localhost không nhận được cuộc gọi từ MONA Pay; hãy dùng URL HTTPS công khai do tunnel cấp rồi dán vào webhook_url.
Gửi thử và chuyển tiền
Trong mục Webhooks, bấm Gửi thử. Mở Lịch sử gửi để xem mã HTTP và thời gian phản hồi. Sau đó chuyển một khoản nhỏ, ví dụ mười nghìn đồng, vào VA vừa tạo. Trong vài giây, giao dịch sẽ hiện trên dashboard và webhook tới máy chủ. Nếu báo TIMEOUT, server chưa trả lời trong mười giây. Nếu chữ ký sai, đừng parse JSON rồi ký lại. Nếu tiền chưa hiện, kiểm tra đã nhập OTP thứ hai hay chưa.
Việc nên làm tiếp
Vậy là bạn đã đi từ tài khoản mới tới giao dịch thật: có token, khóa API, VA, thông báo ngân hàng và webhook đã kiểm chữ ký. Bước tiếp theo nên đọc Định dạng payload để hiểu từng trường, dùng transaction_code chống trùng, rồi xem Gửi lại và xử lý lỗi. Toàn bộ hướng dẫn nằm tại monapay.vn/docs/bat-dau-nhanh. Đăng ký tại my.monapay.vn. Cần hỗ trợ, bạn gọi tổng đài một chín không không, sáu ba sáu, sáu bốn tám.
Để nhận thông báo tiền vào tài khoản ACB theo thời gian thực, bạn cần 6 bước: đăng ký tài khoản (dùng ngay, không cần duyệt), đăng nhập lấy token, tạo API key, nối tài khoản ACB bằng OTP, khai báo URL webhook, rồi chuyển một khoản nhỏ để kiểm tra. Nếu đã có tài khoản ACB và một máy chủ nhận webhook, phần thao tác mất khoảng 5 phút.
Chuẩn bị
- Tài khoản ngân hàng ACB đứng tên bạn hoặc doanh nghiệp, kèm số điện thoại đã đăng ký với ACB (để nhận OTP).
- Một URL HTTPS trên máy chủ của bạn để nhận webhook, ví dụ
https://ten-mien-cua-anh-chi.vn/webhook/monapay. Chưa có máy chủ thì vẫn dùng được thông báo Telegram, xem trang Telegram. - Công cụ gọi API: cURL, Postman, hoặc để AI agent gọi giùm theo prompt có sẵn.
Dùng WooCommerce: cài plugin
Tải plugin MONA Pay for WooCommerce mới nhất, cài file zip tại Plugins → Thêm mới → Tải plugin lên, rồi vào WooCommerce → Cài đặt → Thanh toán → MONA Pay VietQR để nhập Client ID và Client Secret.
Chưa nối ngân hàng vẫn thử được: bật Chế độ thử (sandbox) trong cài đặt plugin. Sau khi lưu, tạo một đơn và chọn MONA Pay tại checkout để chạy hết luồng thử.
Dùng OpenCart: cài module
Tải module MONA Pay cho OpenCart, vào Extensions → Installer để upload, rồi mở Extensions → Extensions → Payments → MONA Pay. Nhập Client ID và Client Secret lấy từ my.monapay.vn → API Keys, bật Sandbox để chạy đơn thử. Khi checkout, trang thanh toán, trang success và đơn trong admin đều đúng thì tắt Sandbox trước khi bán thật. Xem luồng 5 bước có ảnh chụp trên OpenCart 4.1.
Dùng PrestaShop: cài module
Tải module MONA Pay cho PrestaShop, vào Modules → Module Manager → Upload a module, rồi bấm Configure để nhập Client ID, Client Secret và các secret xác thực. Bật Chế độ sandbox để chạy đơn thử, sau đó tắt trước khi bán thật. Module chỉ hiện khi giỏ hàng dùng tiền tệ VND. Xem luồng 4 bước có ảnh chụp trên PrestaShop 8.2.
Bước 1. Đăng ký tài khoản
Vào https://my.monapay.vn/auth, chọn tab Đăng ký, điền tên đăng nhập, mật khẩu, tên và email. Bạn cũng gọi được API:
Tài khoản tạo xong dùng được ngay: đăng nhập liền ở bước 2, không cần ai duyệt. MONA Pay miễn phí 500 giao dịch mỗi tháng, gói trả phí tính theo số giao dịch (xem bảng giá).
Bước 2. Đăng nhập lấy token
Nếu bạn giao cho AI agent hoặc máy chủ làm, bỏ qua bước đăng nhập bằng mật khẩu: tạo API key ở dashboard rồi đổi client_id + client_secret ra token qua POST /api/v1/oauth/token, xem Xác thực.
Kết quả trả về theo khung chung của mọi API:
Từ đây mọi lệnh gọi API đều gửi kèm Authorization: Bearer <access_token>. Chi tiết ở trang Xác thực.
Bước 3. Tạo API key
Với Bearer token đăng nhập bằng mật khẩu ở bước 2, các request POST, PUT, PATCH và DELETE bắt buộc thêm X-Client-Secret. Token từ oauth/token không bắt buộc gửi lại header này, nhưng SDK, MCP chính thức vẫn gửi và MONA Pay khuyến nghị luôn gửi. Tạo khoá trong dashboard mục API Keys, hoặc:
client_secret chỉ hiện đúng 1 lần trong response. Lưu vào biến môi trường ngay, mất thì tạo khoá mới và thu hồi khoá cũ. Xem API keys.
Bước 4. Nối tài khoản ACB (có OTP)
Làm trong dashboard, mục Ngân hàng & VA, nút Thêm tài khoản:
- Nhập số tài khoản ACB, số điện thoại đăng ký với ACB, loại khách hàng (cá nhân hoặc doanh nghiệp) và tự đặt đầu số VA ngắn bằng chữ in hoa/số, ví dụ
HOAhoặcSHOP. Không cần ra quầy hay đăng ký đầu số trước; nếu MONA Pay báo lỗi đầu số thì đổi đầu số khác. - ACB gửi OTP về điện thoại. Nhập OTP để xác thực và tạo tài khoản ảo (VA) đầu tiên.
- Đăng ký nhận thông báo giao dịch. ACB gửi OTP lần 2, nhập tiếp.
- Xong. Từ lúc này tiền vào VA hoặc tài khoản là MONA Pay nhận được thông báo.
Nếu muốn làm bằng API thay vì dashboard, xem Tài khoản ảo (VA), luồng cũng đúng 4 lệnh gọi này.
ACB sẽ ghép mã đối tác phía trước đầu số bạn chọn. Chẳng hạn đầu số HOA có thể cho số VA hoàn chỉnh LOCHOA000123456; hãy dùng nguyên số MONA Pay trả về, không tự ghép.
Bước 5. Khai báo URL webhook
Vào dashboard mục Webhooks, bấm Thêm webhook, điền URL, chọn kiểu xác thực HMAC_SHA256 và đặt secret. Hoặc gọi API:
Không truyền virtual_account_id thì webhook nhận mọi giao dịch của mọi tài khoản. Truyền id của một VA thì chỉ nhận giao dịch của VA đó.
Chạy webhook trên localhost
Webhook cần một URL HTTPS công khai, MONA Pay không thể gọi trực tiếp vào localhost.
Dán URL HTTPS do tunnel cấp vào webhook_url; bạn cũng có thể dùng ngrok.
Nếu chưa có URL công khai, hãy hỏi lại GET /api/v1/checkouts/{checkout_id} mỗi vài giây trong lúc thử.
Trang Địa chỉ IP chỉ áp dụng khi đưa hệ thống lên production.
Phía máy chủ của bạn, endpoint chỉ cần làm 3 việc: kiểm chữ ký, trả HTTP 200 ngay, rồi xử lý đơn sau. Code mẫu dán vào dùng được:
Bước 6. Gửi thử rồi chuyển tiền thật
Trước hết bấm Gửi thử trong dashboard (mục Webhooks) hoặc gọi POST /api/v1/client-webhooks/test. MONA Pay bắn một gói mẫu tới URL của bạn, kết quả hiện ngay trong Lịch sử gửi kèm mã HTTP và thời gian phản hồi.
Muốn kiểm tra tại chỗ không cần chờ MONA Pay, bạn giả lập chính xác gói MONA Pay gửi bằng cURL:
Cuối cùng chuyển một khoản nhỏ vào số VA vừa tạo, ví dụ 10.000đ, từ app ngân hàng bất kỳ. Trong vài giây bạn sẽ thấy giao dịch trong dashboard và webhook về máy chủ.
Sau khi chạy được
- Đọc Định dạng payload để biết từng trường dữ liệu và dùng
transaction_codelàm khoá chống trùng. - Đọc Gửi lại và xử lý lỗi để hiểu log, nhãn lỗi và cách gửi lại.
- Mở tường lửa cho IP
103.168.55.14nếu máy chủ của bạn chặn kết nối lạ, xem Địa chỉ IP. - Muốn tạo mã QR có sẵn số tiền cho từng đơn: QR thanh toán.
Lỗi thường gặp
Đăng nhập báo sai tài khoản dù mật khẩu đúng. Kiểm tra lại username (phân biệt hoa thường) và mật khẩu. Tài khoản mới đăng ký là đăng nhập được ngay, không có bước chờ kích hoạt; vẫn kẹt thì gọi 1900 636 648.
Gọi POST bị từ chối dù đã có Bearer token. Nếu token lấy từ client/login, request đang thiếu X-Client-Secret; mọi POST, PUT, PATCH và DELETE bắt buộc gửi header này. Token từ oauth/token không bị bắt buộc, nhưng MONA Pay vẫn khuyến nghị gửi kèm.
Gửi thử báo TIMEOUT. Máy chủ của bạn không trả lời trong 10 giây. Trả HTTP 200 trước, xử lý đơn sau như code mẫu ở trên.
Chữ ký không khớp. Thường do framework đã parse JSON rồi mới ký lại. Phải ký trên raw body đúng từng byte MONA Pay gửi, xem Bảo mật webhook.
Chuyển tiền rồi mà không thấy giao dịch. Kiểm tra bước 4 đã hoàn tất cả 2 lần OTP chưa. Thiếu OTP lần 2 (đăng ký nhận thông báo) thì ACB không báo giao dịch sang MONA Pay.