Sandbox

Viết và kiểm thử tích hợp mà không cần liên kết ngân hàng hay chuyển tiền thật. Sandbox có bộ dữ liệu riêng: tài khoản ngân hàng thử, yêu cầu thanh toán, giao dịch giả lập, API key và webhook endpoint, tách hẳn khỏi dữ liệu thật.

Khác gì dữ liệu thật

  • API key sandbox có dạng boa_test_…; khóa thật là boa_live_…. Mỗi khóa chỉ thấy dữ liệu của chế độ mình.
  • Mọi đối tượng (transaction, payment_request, bank_account, webhook_endpoint) và mọi sự kiện webhook có trường livemode: false ở sandbox.
  • Tài khoản ngân hàng thử (ngân hàng "Ngân hàng thử", BIN 000000) tạo ngay, không OTP, không có mã VietQR quét được.
  • Không tính phí, không trừ số dư, không tính vào lượt miễn phí. Kênh báo có (Telegram, email…) và thông báo trình duyệt chỉ chạy với tiền thật.

Bắt đầu

  1. Vào app, bật công tắc Sandbox trên thanh trên cùng.
  2. Trang API key: tạo khóa (khóa tạo ra là boa_test_…). Trang Webhook: thêm endpoint nhận sự kiện thử.
  3. Trang Tài khoản ngân hàng: bấm Thêm tài khoản thử, hoặc gọi API dưới đây.
POST /v1/test/bank-accounts
curl -X POST https://app.bankopenapi.com/api/v1/test/bank-accounts \
  -H "Authorization: Bearer $BANKOPENAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountName": "NGUYEN VAN THU"
  }'

Sau đó gọi API như bình thường với khóa boa_test_…: POST /v1/payment-requests tạo yêu cầu thanh toán thử, trả mã thanh toán và thông tin chuyển khoản của tài khoản thử.

Giả lập tiền vào

Hai endpoint chỉ dùng được với khóa boa_test_… (khóa thật nhận 400 LIVE_MODE). Cả hai chạy đúng luồng của tiền thật: ghi giao dịch, khớp yêu cầu thanh toán theo mã trong nội dung, gửi webhook.

  • POST /v1/test/payment-requests/:id/pay với { amount? }: người mua thanh toán yêu cầu; mặc định chuyển đúng số còn thiếu. Gửi số nhỏ hơn để thử payment_request.underpaid.
  • POST /v1/test/transactions với { bankAccountId?, amount, content? }: tiền vào tài khoản thử với nội dung tùy ý, vd. để thử giao dịch không khớp đơn.
POST /v1/test/payment-requests/:id/pay
curl -X POST https://app.bankopenapi.com/api/v1/test/payment-requests/pr_fbmYHwnajfwiQLTH8SOkjM2H/pay \
  -H "Authorization: Bearer $BANKOPENAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{

  }'

Trong app cũng có nút Giả lập tiền vào (trang Giao dịch) và Giả lập thanh toán (chi tiết một yêu cầu thanh toán).

Webhook ở sandbox

Sự kiện của dữ liệu thử chỉ gửi tới endpoint thêm ở sandbox, và ngược lại. Payload, chữ ký và lịch retry giống hệt dữ liệu thật; chỉ kháclivemode.

payment_request.paid ở sandbox
{
  "id": "evt_9xQ2mT7kLp3sVr8cZn1wYb4e",
  "type": "payment_request.paid",
  "livemode": false,
  "timestamp": "2026-11-05T09:12:03.000Z",
  "data": {
    "id": "pr_fbmYHwnajfwiQLTH8SOkjM2H",
    "object": "payment_request",
    "livemode": false,
    "amount": 150000,
    "amountReceived": 150000,
    "status": "paid",
    "code": "TTS6GNPX",
    "orderId": "DH-TEST-1"
  }
}

Chuyển sang dữ liệu thật

  1. Tắt sandbox, liên kết tài khoản ngân hàng thật.
  2. Tạo API key boa_live_… và webhook endpoint thật (signing secret khác secret của endpoint thử).
  3. Thay khóa và secret trên hệ thống production. Code không cần sửa gì khác: API, payload và chữ ký giống nhau ở hai chế độ.

Lỗi thường gặp ở sandbox: xem Lỗi và mã lỗ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.