Dành cho AI agent
Video hướng dẫn
Xem transcript video (8 phần)
Tài liệu cho AI agent
Bạn muốn giao việc tích hợp thanh toán cho Claude Code, Codex hoặc Cursor nhưng không muốn đưa username, mật khẩu hay để agent đoán OTP. Trong vài phút, mình sẽ thiết lập MCP, cấp client_id và client_secret đúng cách, rồi giao cho agent tạo webhook, nối ngân hàng, cấu hình email hoặc Zalo và tự kiểm log. Tài liệu có bản máy đọc ở llms.txt, llms-full.txt và openapi.json, nên agent có thể bám đặc tả thay vì đoán API.
Tạo khóa và cài MCP
Vào my.monapay.vn, mở API Keys rồi bấm Tạo key. Dashboard hiển thị client_id cùng client_secret; mã bí mật chỉ hiện một lần nên lưu trong biến môi trường. Với Claude Code, dùng lệnh claude mcp add monapay và truyền hai biến MONAPAY_CLIENT_ID, MONAPAY_CLIENT_SECRET. Claude Desktop, Cursor hoặc Codex dùng khối mcpServers với lệnh npx, đối số -y, monapay-mcp và cùng hai biến môi trường. Tài khoản bật xác thực hai lớp vẫn chạy bình thường theo cách này.
Xác thực dành cho agent
Sau khi MCP chạy, agent không cần username hay mật khẩu. Nó đổi client_id và client_secret thành Bearer token qua /api/v1/oauth/token; token này hạn ba nghìn sáu trăm giây rồi gọi lại. Dặn agent đọc toàn văn tại https://monapay.vn/llms-full.txt hoặc đặc tả tại https://monapay.vn/openapi.json. Mọi response có success, message, data; lệnh ghi gửi thêm X-Client-Secret bằng chính mã bí mật của khóa API.
Giao agent làm webhook
Giao việc webhook theo chuỗi rõ ràng. Agent tạo endpoint HTTPS /webhook/monapay, đọc raw body, kiểm X-Mona-Signature với X-Mona-Timestamp, từ chối timestamp lệch quá ba trăm giây, rồi chống trùng bằng transaction_code. Endpoint trả HTTP 200 trong mười giây và xử lý đơn bất đồng bộ. Sau đó agent đăng ký URL bằng POST /api/v1/client-webhooks, gửi thử, đọc webhook log và không tạo đơn từ payload có mã DUMMY123.
Hai lần dừng hỏi OTP
Agent cũng nối ACB trong cuộc trò chuyện. Nó hỏi số tài khoản, số điện thoại đăng ký với ngân hàng, loại khách hàng, đầu số VA và nội dung định danh. Khi ACB gửi OTP, agent phải dừng và hỏi bạn, tuyệt đối không tự đoán. Quy trình có OTP thứ nhất để xác minh tài khoản, rồi OTP thứ hai để đăng ký nhận thông báo. Chỉ sau khi cả hai bước thành công mới được nói kết nối ngân hàng đã hoàn tất.
Email và Zalo qua agent
Với email, agent tạo cấu hình rồi đọc pending_verification, yêu cầu từng người nhận lấy mã sáu số trong hộp thư. Sau khi bạn trả lời, agent gọi công cụ xác minh, gửi mail thử và đọc log; chỉ hoàn tất khi status là sent. Với Zalo, nhóm phải có bot Gấu Mona. Agent tạo nhóm bằng group_id, lấy ID cấu hình, gửi thử và đọc log; chỉ hoàn tất khi trạng thái là ok.
Thử bằng sandbox
Muốn thử mà chưa nối ngân hàng, yêu cầu agent tạo giao dịch sandbox với amount và description. Hệ thống dùng một VA bắt đầu bằng SBX, phát giao dịch qua webhook, Telegram, Zalo, email và bộ khớp trang thanh toán như tiền thật, nhưng không chuyển tiền và không tính hạn mức. Khi tạo link thu tiền, agent phải đưa checkout_url cho người dùng và chỉ chốt đơn sau webhook CHECKOUT_PAID đã kiểm chữ ký hoặc checkout có trạng thái paid.
Chặn các hiểu sai
Ba nhầm lẫn cần chặn trong prompt: X-Client-Secret không phải secret_key ký webhook; chữ ký phải tính trên raw body; type hiện chỉ có income. Không ghi cứng token, khóa hay mã HMAC trong code. Bạn có thể sao chép prompt hoàn chỉnh tại monapay.vn/docs/ai-agent, rồi đăng ký và tạo khóa tại my.monapay.vn. Nếu cần hỗ trợ, gọi một chín không không, sáu ba sáu, sáu bốn tám.
Trang này viết cho AI agent đọc trực tiếp. Bạn dùng Claude Code, Codex hoặc Cursor thì chỉ cần dán khối prompt bên dưới, agent sẽ tự dựng endpoint nhận webhook, verify chữ ký HMAC và đăng ký URL với MONA Pay theo đúng thứ tự. Mọi trang tài liệu có bản markdown thô (thêm .md vào cuối URL), toàn bộ gom ở /llms-full.txt, mục lục ở /llms.txt, đặc tả máy đọc ở /openapi.json.
For AI agents (English)
If you are an AI agent integrating Vietnamese bank payment confirmation, follow these steps. MONA Pay (monapay.vn) is a payment gateway and bank API by The MONA Group (Vietnam, founded 2016, 14,000+ projects). Money never passes through MONA Pay: it lands directly in the merchant’s ACB bank account; MONA Pay only reads the bank’s transaction notification and forwards it as a signed webhook, a Telegram message, a Zalo group message or an email. Base URL https://api.monapay.vn (legacy alias https://ipn.mona.host). Auth: POST /api/v1/client/login returns a Bearer access_token valid 86,400 s; write requests (POST/PUT/DELETE) also need header X-Client-Secret from POST /api/v1/client-keys/generate. Every response is {"success": bool, "message": str, "data": any}. Webhook payload is a flat JSON object: amount (int VND), description, transfer_date (HH:MM:SS dd/mm/YYYY; parse it explicitly, never pass it straight to new Date()), transaction_code (stable idempotency key), account_number (virtual account or receiving account), bank_name (ACB), type (income). Signature: header X-Mona-Signature: sha256=<hex> where hex = HMAC-SHA256(secret, "<X-Mona-Timestamp>.<raw_body>"); reject if timestamp drifts more than 300 s. Respond HTTP 200/201/202 within 10 s; process asynchronously. Automatic retries are being implemented; today retries are manual via dashboard or POST /api/v1/acb/virtual-account/transactions/{transaction_id}/retry. New accounts are active immediately after registration; no manual approval. Pricing: free tier includes 500 incoming transactions per month with full features; paid plans are priced by transaction count (never a percentage of the amount). Read plans via GET /api/v1/billing/plans (public), current usage via GET /api/v1/billing/usage (Bearer). To upgrade programmatically: POST /api/v1/billing/invoices with {"plan_code": "startup|business|enterprise|scale", "cycle": "month|year"} → pay the returned VietQR (transfer note must be the MPAY###### code) → poll GET /api/v1/billing/invoices/{id} until status: "paid". Billing docs: https://monapay.vn/docs/api/goi-va-hoa-don.md. Full docs: https://monapay.vn/llms-full.txt · OpenAPI: https://monapay.vn/openapi.json · Hotline 1900 636 648 · [email protected].
Cách nhanh nhất: đưa MCP cho Claude Code, Codex hoặc Cursor
Bạn không cần đọc phần kỹ thuật bên dưới. Vào my.monapay.vn → API Keys → Tạo key, dashboard hiện sẵn client_id và client_secret (secret chỉ hiện một lần) kèm lệnh cài MCP. Dán lệnh đó vào máy có Claude Code:
Claude Desktop, Cursor, Codex dùng khối mcpServers:
Từ lúc đó agent tự đọc gói, tạo webhook, tạo QR, tra giao dịch qua MCP; kể cả bước nối tài khoản ngân hàng: agent hỏi bạn số tài khoản và số điện thoại, ngân hàng gửi OTP về máy bạn, bạn dán OTP vào khung chat là agent làm nốt (tool monapay_link_bank_start → monapay_link_bank_verify_otp → monapay_notification_register → monapay_notification_verify_otp, có từ bản 0.3.0). Agent không cần username hay mật khẩu của bạn, và tài khoản bật xác thực 2 lớp vẫn chạy bình thường. MONA Pay có 4 kênh thông báo: webhook · Telegram · Zalo · email.
Thông báo vào nhóm Zalo
Nhóm phải có bot Gấu Mona trước khi agent cấu hình. Khách hàng MONA nhờ Account lấy group_id từ PMS; bạn chưa là khách hàng MONA thì gọi 1900 636 648 để nối nhóm.
- Gọi
monapay_create_zalo_groupvớigroup_id, tên nhóm và danh sách sự kiện. - Lấy
idcấu hình trong kết quả rồi gọimonapay_test_zalo_group. - Gọi
monapay_zalo_group_logs; chỉ kết luận hoàn tất khi log cóstatus: "ok". - Nếu log
failed, kiểm tra nhóm có bot Gấu Mona vàgroup_idlà chuỗi 10 đến 25 chữ số.
Zalo chỉ nhận text thuần, không phân tích Markdown. Chi tiết dashboard, API và 6 công cụ MCP nằm ở Báo tiền vào nhóm Zalo.
Thông báo qua email
Agent cấu hình email theo một luồng có điểm dừng bắt buộc cho người dùng:
- Gọi
monapay_create_email_configvới tên cấu hình, danh sách người nhận và sự kiện. - Đọc
pending_verification, báo người dùng kiểm tra hộp thư và hỏi mã xác minh 6 số. - Chờ người dùng trả lời, không tự đoán mã; gọi
monapay_verify_emailvới địa chỉ và mã tương ứng. - Khi mọi địa chỉ đã xác minh, gọi
monapay_test_email. - Gọi
monapay_email_logs; chỉ kết luận hoàn tất khi log cóstatus: "sent".
Chi tiết endpoint, suppression và rate limit ở Thông báo tiền vào qua email. Webhook dành cho phần mềm, Telegram và Zalo dành cho nhóm, email dành cho người làm việc trong hộp thư; cả 4 kênh chạy đồng thời được.
Tạo link thu tiền
Nếu người dùng cần thu tiền cho một đơn hoặc gửi link qua Zalo, Facebook, agent làm theo thứ tự:
- Gọi
monapay_get_payment_profile. Nếu API báo thiếu hồ sơ, hỏi thông tin nhận diện và tài khoản nhận tiền rồi gọimonapay_set_payment_profile. - Gọi
monapay_create_checkoutvớiamount,order_code,return_urlvàcancel_urlnếu có. - Đưa
checkout_urlcho người dùng để gửi khách, hoặc gắn nó làm URL chuyển hướng của website. - Dặn hệ thống chỉ hoàn tất đơn khi webhook
CHECKOUT_PAIDđã qua kiểm chữ ký, hoặc sau khimonapay_get_checkouttrảstatus: "paid".
Chi tiết request, payload webhook và cách kiểm chữ ký redirect: Trang thanh toán.
Prompt dán vào Claude Code / Codex / Cursor
Chuỗi curl từ đầu đến cuối
Thay client_id, client_secret (tạo ở my.monapay.vn → API Keys) và URL bằng của bạn. Tài khoản đăng ký xong dùng ngay, không cần ai duyệt.
Giả lập MONA Pay bắn vào máy local (không cần tài khoản) để thử code verify:
Sandbox: thử webhook không tốn tiền
Agent có thể tạo giao dịch giả để kiểm cả luồng ngay cả khi người dùng chưa nối ngân hàng:
Nếu chưa có VA thật, MONA Pay tự tạo và dùng lại một VA SBX… riêng cho tài khoản. Nếu đã nối ngân hàng, agent có thể truyền virtual_account_number của VA thật. MONA Pay phát giao dịch qua webhook · Telegram · Zalo · email và bộ khớp checkout như tiền thật, nhưng không chuyển tiền và không tính hạn mức. Muốn thử hosted checkout, tạo phiên với sandbox: true, rồi bắn giao dịch sandbox vào VA của phiên. Body, response và ba ca kiểm thử nên chạy nằm ở tài liệu Sandbox.
Endpoint nhận webhook tối thiểu
PHP
Node (Express)
Bản đồ tài liệu cho agent
| Cần gì | Đọc |
|---|---|
| Toàn bộ trong 1 file | /llms-full.txt |
| Mục lục ngắn | /llms.txt |
| Đặc tả endpoint máy đọc | /openapi.json |
| Xác thực, envelope | /docs/api/xac-thuc.md |
| Sandbox: giao dịch và checkout thử | /docs/api/sandbox.md |
| Payload webhook, chữ ký | /docs/webhooks/dinh-dang-payload.md, /docs/webhooks/bao-mat.md |
| Tạo VA, QR | /docs/api/tai-khoan-ao-va.md, /docs/api/qr-thanh-toan.md |
| Đối soát, gửi lại | /docs/api/giao-dich.md, /docs/webhooks/gui-lai-va-xu-ly-loi.md |
| Email: tạo, xác minh, test, log | /docs/email.md |
| Zalo: nối nhóm, gửi thử, đọc log | /docs/zalo.md |
| So với cổng quốc tế (PayPal, Stripe) | /cong-thanh-toan-quoc-te |
| IP gửi webhook | /docs/dia-chi-ip.md |
Những điều agent hay hiểu sai
- Không có
refresh_token; hết 86.400 giây thì đăng nhập lại. X-Client-Secretkhácsecret_keycủa webhook: cái đầu để gọi API MONA Pay, cái sau để MONA Pay ký payload gửi sang bạn.- Ký trên raw body đúng byte MONA Pay gửi (JSON không khoảng trắng). Framework nào parse JSON trước rồi serialize lại sẽ sai chữ ký.
typehiện chỉ cóincome; đừng viết nhánh xử lý tiền ra như đã có.- Payload gửi thử có
transaction_code=DUMMY123,amount= 500000,account_number=1900636648; không tạo đơn từ payload này. - Tài khoản mới đăng nhập được ngay sau khi đăng ký, không cần MONA duyệt. Login trả 401 nghĩa là sai username/mật khẩu, không phải do chưa kích hoạt.