Tích hợp

Tích hợp qua API và webhook

Hệ thống của bạn tạo yêu cầu thanh toán cho mỗi đơn, hiện VietQR cho khách và nhận webhook khi tiền về đủ. Thử trước ở sandbox, gọi API bằng thư viện chính thức hoặc HTTP thuần, hoặc để AI agent làm qua MCP.

Bắt đầu

4 bước tới webhook đầu tiên

Làm thử ở sandbox bằng API key thử, chạy đúng rồi đổi sang key thật. Code giữ nguyên, chỉ đổi key.

  1. 1

    Tạo API key

    Trong app, mục API key: key boa_test_… cho sandbox, boa_live_… cho dữ liệu thật. Tải file .env ngay khi tạo.

    Xác thực
  2. 2

    Liên kết tài khoản ngân hàng

    Liên kết trong app, chủ tài khoản xác nhận bằng OTP ngân hàng gửi. Ở sandbox chỉ cần bấm Thêm tài khoản thử.

    Ngân hàng hỗ trợ
  3. 3

    Tạo yêu cầu thanh toán

    POST /v1/payment-requests với số tiền và mã đơn. Nhận về mã chuyển khoản, thông tin dựng VietQR và link trang thanh toán.

    API yêu cầu thanh toán
  4. 4

    Nhận webhook

    Khai báo endpoint, chọn payment_request.paid, verify chữ ký rồi cập nhật đơn. Bấm Gửi thử để kiểm tra code.

    Nhận và verify webhook

Tự động xác nhận thanh toán

Tiền về tự khớp đơn, không soát tay

Mỗi yêu cầu thanh toán có một mã riêng dạng TT + 6 ký tự. VietQR điền sẵn mã vào nội dung chuyển khoản; tiền về, BankOpenAPI đọc mã, cộng vào đúng đơn và gửi webhook.

  • Đọc mã không phân biệt hoa thường, bỏ qua dấu cách và ký tự đặc biệt: khách gõ “tt 7k3m9q” vẫn khớp.
  • Ngân hàng hỗ trợ QR động (MB, OCB, BIDV, VietinBank, Vietcombank, VPBank): mỗi đơn một mã QR riêng, khớp chính xác hơn mã trong nội dung.
  • Chuyển nhiều lần được cộng dồn. Thiếu thì báo payment_request.underpaid; đủ hoặc thừa thì báo payment_request.paid, phần thừa bạn tự hoàn cho khách.
  • Hạn thanh toán mặc định 24 giờ, đặt từ 5 phút tới 7 ngày. Tiền về sau hạn vẫn được khớp, không lạc đơn.
  • Có sẵn trang thanh toán (hostedUrl): hiện VietQR, số tài khoản, nội dung, tự chuyển sang Đã nhận khi tiền về.

Code mẫu

Code mẫu chép là chạy

curl, Node.js, PHP và Python cho từng bước. Chọn ngôn ngữ một lần, mọi khối code trên trang đổi theo.

POST /v1/payment-requests
curl -X POST https://app.bankopenapi.com/api/v1/payment-requests \
  -H "Authorization: Bearer $BANKOPENAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 150000,
    "orderId": "DH1028",
    "description": "Đơn hàng DH1028"
  }'

Sandbox

Giả lập tiền vào, không tốn phí

Thử trọn luồng từ tạo đơn tới webhook mà không chuyển đồng nào. Đổi key thử sang key thật là chạy với tiền thật.

  • Key boa_test_ chỉ thấy dữ liệu thử; app có công tắc Sandbox để xem cùng dữ liệu đó.
  • Giả lập thêm tài khoản ngân hàng, tiền vào với số tiền và nội dung tùy ý, hoặc thanh toán một yêu cầu.
  • Chạy đúng luồng thật: khớp đơn, lưu sự kiện, gửi webhook với livemode: false.
  • Không tính phí, không gửi tin lên kênh chat. Trong app có nút Giả lập tiền vào, không cần viết code.
  • Tài liệu sandbox
POST /v1/test/transactions
curl -X POST https://app.bankopenapi.com/api/v1/test/transactions \
  -H "Authorization: Bearer $BANKOPENAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 150000,
    "content": "NGUYEN VAN BINH chuyen tien TT7K3M9Q"
  }'

Thiết kế API

API viết cho dev, không bắt đoán

  • Thư viện chính thức

    Gọi API, verify webhook và xử lý lỗi đã viết sẵn. Không muốn thêm phụ thuộc thì gọi REST bằng HTTP client nào cũng được.

  • API key an toàn

    Key có tiền tố và checksum, dễ nhận ra khi lỡ lộ. Quyền đầy đủ hoặc chỉ đọc, có hạn dùng, đổi key có thời gian chuyển tiếp.

  • Gọi lại an toàn

    Gửi header Idempotency-Key: gọi lại cùng request trong 24 giờ chỉ tạo một yêu cầu, phản hồi cũ được trả lại.

  • Lỗi dễ xử lý

    JSON có mã lỗi cố định để rẽ nhánh, thông báo tiếng Việt. Mỗi phản hồi có Request-ID để tra log.

  • Quy ước nhất quán

    Phân trang cursor (limit, starting_after), ID có tiền tố pr_, txn_, evt_, tiền là số nguyên VND, thời gian ISO UTC.

  • Giới hạn rõ ràng

    100 request mỗi phút cho mỗi key. Vượt thì nhận 429 kèm Retry-After, không bị khóa key.

  • Chỉ gọi từ backend

    API không mở CORS, nên key không lọt ra trình duyệt của khách. Frontend gọi backend của bạn, backend gọi BankOpenAPI.

  • Nhật ký truy cập

    Xem lịch sử gọi API và IP dùng key gần nhất. Email báo khi tạo, đổi key và 7 ngày trước khi key hết hạn.

API Reference

Endpoint có sẵn

Mọi endpoint nhận và trả JSON, xác thực bằng header Authorization: Bearer. Tham số, phản hồi và mã lỗi của từng endpoint nằm trong tài liệu.

Yêu cầu thanh toán

  • POST/v1/payment-requestsTạo yêu cầu cho một đơn
  • GET/v1/payment-requestsLiệt kê, lọc theo trạng thái, mã đơn
  • GET/v1/payment-requests/{id}Xem kèm các giao dịch đã khớp
  • POST/v1/payment-requests/{id}/cancelHủy khi chưa nhận tiền

Giao dịch

  • GET/v1/transactionsLọc theo tài khoản, loại, thời gian
  • GET/v1/transactions/{id}Xem một giao dịch

Tài khoản ngân hàng

  • GET/v1/bank-accountsTài khoản đã liên kết
  • GET/v1/bank-accounts/{id}Xem một tài khoản

Webhook endpoint

  • POST/v1/webhook-endpointsTạo endpoint (GET để liệt kê)
  • PATCH/v1/webhook-endpoints/{id}Sửa endpoint (DELETE để xóa)
  • POST/v1/webhook-endpoints/{id}/rotate-secretĐổi signing secret
  • GET/v1/webhook-endpoints/{id}/deliveriesLịch sử gửi, gửi lại lần lỗi

Sự kiện

  • GET/v1/eventsSự kiện 30 ngày gần nhất, lọc theo loại
  • POST/v1/events/{id}/resendGửi lại một sự kiện tới endpoint

Tài khoản và sandbox

  • GET/v1/accountTài khoản sở hữu key, dùng để thử key
  • POST/v1/test/transactionsGiả lập tiền vào (key thử)
  • POST/v1/test/payment-requests/{id}/payGiả lập thanh toán

Dùng với AI agent

Để AI agent gọi API thay bạn

Kết nối Claude Code, Cursor hay agent khác qua MCP bằng chính API key. Cài skill BankOpenAPI để agent viết code tích hợp theo đúng tài liệu.

7 tool MCP

  • create_payment_requestTạo yêu cầu thanh toán
  • get_payment_requestXem trạng thái, số tiền đã nhận
  • list_payment_requestsLiệt kê, lọc theo trạng thái, mã đơn
  • cancel_payment_requestHủy yêu cầu chưa nhận tiền
  • list_transactionsLiệt kê giao dịch
  • get_balanceSố dư, lượt miễn phí còn lại
  • get_accountTài khoản sở hữu key

Key thử: agent chỉ làm việc trên dữ liệu sandbox. Key chỉ đọc: agent chỉ thấy các tool đọc.

Hướng dẫn dùng với AI agent
Thêm MCP server vào Claude Code
claude mcp add --transport http bankopenapi \
  https://app.bankopenapi.com/api/mcp \
  --header "Authorization: Bearer $BANKOPENAPI_API_KEY"
Cài skill cho dự án
mkdir -p .claude/skills/bankopenapi
curl -fsSL https://bankopenapi.com/skills/bankopenapi/SKILL.md \
  -o .claude/skills/bankopenapi/SKILL.md

Trong app

Công cụ cho dev trong app

  • Giả lập trong app

    Nút Giả lập tiền vào ở trang Giao dịch, Giả lập thanh toán ở từng yêu cầu. Thử luồng webhook mà không chuyển tiền thật.

  • Lịch sử webhook

    Từng lần gửi: mã HTTP, thời gian phản hồi, đoạn đầu body. Tab Sự kiện xem payload và gửi lại tới endpoint bất kỳ.

  • Link thanh toán không cần code

    Tạo link cố định số tiền hoặc để khách tự nhập, gắn vào trang bán hàng, README hay FUNDING.yml.

  • Xuất CSV giao dịch

    Lọc theo tài khoản và khoảng thời gian rồi tải về, đưa vào phần mềm kế toán.

  • Đối soát và khớp tay

    Danh sách tiền về chưa khớp đơn và đơn chưa có tiền. Khớp tay một giao dịch vào đúng đơn khi khách ghi sai nội dung.

  • Danh sách Bắt đầu

    Trang Tổng quan dẫn từng bước: tạo key, liên kết tài khoản, thêm webhook, thử giao dịch đầu tiên.

Câu hỏi về tích hợp

Chưa thấy câu bạn cần? Hỏi chúng tôi qua trang Liên hệ.

Có thư viện chính thức không?

Có. Thư viện chính thức gói sẵn việc gọi API, verify webhook và xử lý lỗi. Không muốn thêm phụ thuộc thì gọi REST trực tiếp: tài liệu có ví dụ curl, Node.js, PHP, Python cho mọi endpoint.

Ngôn ngữ, framework nào dùng được?

Mọi ngôn ngữ gọi được HTTPS và đọc JSON: PHP, Node.js, Python, Go, Java, .NET… Webhook dùng chuẩn Standard Webhooks, có thư viện verify cho hầu hết ngôn ngữ phổ biến.

Gọi API từ frontend hay app mobile được không?

Không. API key chỉ dùng ở backend và API không mở CORS. Frontend hoặc app mobile gọi backend của bạn, backend gọi BankOpenAPI.

Có API liên kết tài khoản ngân hàng không?

Liên kết làm trong app, vì chủ tài khoản phải xác nhận bằng OTP ngân hàng gửi. API đọc được danh sách tài khoản đã liên kết, và webhook có sự kiện bank_account.linked, bank_account.removed.

Khách chuyển khoản sai nội dung thì sao?

Giao dịch vẫn được ghi và gửi sự kiện transaction.received, chỉ không tự khớp đơn. Bạn khớp tay ở trang Đối soát trong app, hoặc tự khớp trong code theo số tiền và thời điểm.

Giới hạn gọi API là bao nhiêu?

100 request mỗi phút cho mỗi API key (MCP dùng chung giới hạn này). Vượt thì nhận 429 kèm Retry-After. Giả lập ở sandbox giới hạn thêm 10 lần mỗi phút.

AI agent có đụng vào tiền thật không?

Chỉ khi bạn đưa key thật. Dùng key thử thì agent chỉ thấy dữ liệu sandbox; key chỉ đọc thì agent không tạo hay hủy được yêu cầu nào. BankOpenAPI không có API chuyển tiền đi.

Bắt đầu với BankOpenAPI

Đăng ký tài khoản, liên kết tài khoản ngân hàng và nhận webhook báo có đầu tiên. Cần tư vấn thì nhắn chúng tôi.