Tạo mã VietQR API

Tạo mã QR chuyển khoản VietQR / NAPAS 247 với ngân hàng, số tài khoản, số tiền và nội dung chuyển khoản dạng PNG, SVG hoặc payload JSON. Giải mã VietQR có sẵn.

GETPOSThttps://apibox.io.vn/v1/vietqr

API VietQR tạo đúng chuỗi dữ liệu chuẩn EMVCo / NAPAS mà mọi ứng dụng ngân hàng Việt Nam quét được: chọn ngân hàng (bank=VCB, TCB, MB, tên ngân hàng hoặc mã BIN NAPAS 6 số), số tài khoản, số tiền VND (không bắt buộc) và nội dung chuyển khoản. Mặc định API trả về ảnh PNG; thêm format=svg để lấy SVG, hoặc format=json để nhận chuỗi payload, thông tin ngân hàng và cả hai dạng ảnh trong một phản hồi. Kích thước, màu, lề và mức sửa lỗi dùng giống API tạo mã QR.

Khi có số tiền, mã là QR động (01=12), không có số tiền thì là QR tĩnh. Trường 63 chứa mã kiểm tra CRC-16/CCITT theo đúng đặc tả. Nội dung chuyển khoản có dấu được chuyển sang không dấu (ngân hàng không truyền dấu ổn định) và API trả kèm nội dung gốc để bạn đối chiếu; nên giữ nội dung dưới 25 ký tự vì một số ngân hàng cắt phần còn lại.

GET /v1/vietqr/banks trả về danh sách ngân hàng và ví điện tử kèm mã và BIN. action=decode&payload=… phân tích một chuỗi VietQR có sẵn: ngân hàng, số tài khoản, số tiền, nội dung và checksum có hợp lệ không – tiện để kiểm tra một mã QR đã in thực sự chứa gì.

Tham số

TênVị tríKiểuBắt buộcMặc định
bankbody|querystringcóMã ngân hàng (VCB, ICB, BIDV, MB, TCB…), tên (Vietcombank) hoặc mã BIN NAPAS 6 số. Xem /v1/vietqr/banks.
accountbody|querystringcóSố tài khoản (hoặc số thẻ khi service=card), tối đa 19 chữ/số.
amountbody|querynumberkhôngSố tiền VND (số nguyên). Khi có, mã là QR động.
contentbody|querystringkhôngNội dung chuyển khoản, tối đa 50 ký tự (được bỏ dấu). Tên khác: message, description.
servicebody|querystringkhôngaccountaccount (QRIBFTTA) hoặc card (QRIBFTTC).
account_namebody|querystringkhôngTên chủ tài khoản, chỉ trả lại trong JSON (không nằm trong mã QR).
formatbody|querystringkhôngpngpng, svg hoặc json.
sizebody|querynumberkhông300Kích thước ảnh (64–2000 px). color, background, margin, ecc dùng như /v1/qr.
actionbody|querystringkhôngdecode để phân tích chuỗi VietQR truyền trong payload.

Ví dụ

curl "https://apibox.io.vn/v1/vietqr?bank=VCB&account=0123456789&amount=150000&content=Thanh%20toan%20don%20ABX1234&format=json" \
  -H "Authorization: Bearer YOUR_API_KEY"

Kết quả trả về

{
  "bank": {
    "code": "VCB",
    "bin": "970436",
    "short_name": "Vietcombank",
    "name": "Ngân hàng TMCP Ngoại thương Việt Nam"
  },
  "account": "0123456789",
  "account_name": null,
  "service": "account",
  "amount": 150000,
  "currency": "VND",
  "content": "Thanh toan don ABX1234",
  "data": "00020101021238540010A00000072701240006970436011001234567890208QRIBFTTA530370454061500005802VN62260822Thanh toan don ABX12346304FFCC",
  "version": 5,
  "modules": 37,
  "ecc": "M",
  "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 45 45\" …</svg>",
  "png_base64": "data:image/png;base64,iVBORw0KGgo…"
}

Ứng dụng

  • Hiển thị QR thanh toán đúng số tiền và mã đơn ở trang thanh toán, hoá đơn
  • Tự động đối soát giao dịch nhờ đưa mã đơn hàng vào nội dung chuyển khoản
  • In QR nhận tiền ủng hộ, QR bán hàng cho một tài khoản ngân hàng
  • Kiểm tra nội dung một mã VietQR trước khi công bố

Hỏi đáp

API có chuyển tiền hay cần ký hợp đồng với ngân hàng không?

Không. API chỉ tạo mã QR để ứng dụng ngân hàng của người trả tiền đọc. Việc chuyển tiền diễn ra giữa các ngân hàng qua NAPAS 247; muốn nhận thông báo khi có tiền vào, bạn cần API của ngân hàng hoặc dịch vụ như SePay, Casso.

Hỗ trợ những ngân hàng nào?

Mọi ngân hàng trong mạng NAPAS 247. /v1/vietqr/banks liệt kê khoảng 50 ngân hàng và ví điện tử kèm mã; nếu thiếu ngân hàng nào, bạn có thể truyền thẳng mã BIN 6 số vào bank.

Vì sao nội dung chuyển khoản tiếng Việt bị đổi?

Nội dung chuyển khoản chỉ được truyền ổn định ở dạng ASCII, nên dấu bị bỏ (“Thanh toán đơn” thành “Thanh toan don”) và ký hiệu được thay bằng dấu cách. Phản hồi có cả nội dung gốc và nội dung đã mã hoá.

API liên quan

Bắt đầu với 1.000 request miễn phí mỗi tháng. Nhận API key miễn phí →