VietQR · Tạo mã QR chuyển khoản

Nội dung Markdown đầy đủ của trang tài liệu.

# VietQR · Tạo mã QR chuyển khoản

`POST https://api.pay2s.vn/vietqr/generate`

Tạo mã QR chuyển khoản từ tài khoản nhận, ngân hàng, số tiền và nội dung. API này độc lập với OneQR và Collection Link: tạo QR không tạo đơn hàng, không xác nhận thanh toán và không tự phát IPN.

Nguồn đối chiếu: request **VietQR** trong [collection Developer Pay2S](/downloads/developer-pay2S.postman_collection.json) và phản hồi API thực tế ngày 11/10/2026.

## Xác thực

Gửi `Content-Type: application/json`. Request Postman và lần gọi kiểm chứng không dùng Authorization, API key hay chữ ký HMAC. Playground gọi API thật qua backend, kể cả khi chưa cấu hình khóa demo.

## Body

| Trường | Kiểu trong mẫu | Ý nghĩa |
| --- | --- | --- |
| `accountNo` | string | Số tài khoản nhận. Mẫu `P2S99999999` là tài khoản demo. |
| `accountName` | string | Tên chủ tài khoản hiển thị. Không phải kết quả xác minh tên tài khoản. |
| `bankCode` | string | Mã ngân hàng viết tắt; mẫu đã thử: `ACB`. |
| `addInfo` | string | Nội dung chuyển khoản. |
| `amount` | number | Số tiền; mẫu đã thử: `2000`. |
| `template` | string | Mẫu giao diện; đã thử `modern`. |
| `maskAccount` | boolean | Tùy chọn che số tài khoản trên ảnh theo mẫu Postman. |

API trả lỗi thiếu trường nếu không có `accountNo`, `accountName`, `bankCode`. Giới hạn độ dài, toàn bộ template/ngân hàng và giá trị mặc định của trường tùy chọn chưa được xác minh; không suy ra từ một request mẫu.

## Đọc response và hiển thị ảnh

- Kiểm tra HTTP và `code === "00"` trước khi sử dụng kết quả.
- `data.qrCode`: chuỗi dữ liệu mã QR, không phải URL ảnh.
- `data.qrDataURL`: ảnh PNG dạng `data:image/png;base64,...`, có thể gán vào `src` của ảnh.
- `data.acqId`, `bankCode`, `bankName`, `accountName`: thông tin ngân hàng và chủ tài khoản trong kết quả.

```javascript
// result là JSON response từ API.
if (result.code !== '00') throw new Error(result.desc || 'Không tạo được QR');
document.querySelector('#vietqr').src = result.data.qrDataURL;
```

Mở Playground để chỉnh request, xem/tải ảnh QR thật và lấy code cURL, Node.js hoặc PHP gọi API.

## Ví dụ lỗi đã kiểm chứng

Gửi body `{}` trả HTTP **400**:

```json
{"code":"01","desc":"Missing required fields: accountNo, accountName, bankCode"}
```

## Theo dõi tiền vào

Nếu cần xác nhận thanh toán, tích hợp [webhook giao dịch](/webhook/tai-lieu-ky-thuat) hoặc [API lịch sử giao dịch](/history-api/tai-lieu-ky-thuat). Nếu cần quản lý đơn hàng, payment link và IPN, dùng [Collection Link V2](/api/collection-link-v2).


## Request và response đối chiếu ngày 11/10/2026

Các mẫu dưới đây giữ cấu trúc trường và kiểu dữ liệu. Khóa, chữ ký, URL phiên đã được thay bằng placeholder; danh sách chỉ giữ tối đa hai phần tử và dữ liệu ảnh/PDF/XML dài được rút gọn. Không sao chép placeholder để gọi API thật.

### VietQR · Tạo mã QR chuyển khoản

<div class="doc-api-actions" data-doc-api-actions><a class="try-button" data-doc-playground href="/playground/?api=vietqr-generate">Thử API trong Playground ↗</a><a class="try-button experience-button" data-doc-experience hidden>Trải nghiệm ↗</a></div>

**Đã gọi API demo/UAT.** Đã gọi API VietQR với tài khoản demo, không gửi Authorization. qrDataURL được rút gọn; response thật chứa ảnh PNG Base64 đầy đủ.

`POST /vietqr/generate`

Body:

```json
{
  "accountNo": "P2S99999999",
  "accountName": "TAI KHOAN DEMO",
  "bankCode": "ACB",
  "addInfo": "THANHTOANDEMO",
  "amount": 2000,
  "template": "modern",
  "maskAccount": true
}
```

HTTP 200. Response:

```json
{
  "code": "00",
  "desc": "Gen VietQR successful!",
  "data": {
    "acqId": "970416",
    "bankCode": "ACB",
    "bankName": "Ngân hàng TMCP Á Châu",
    "accountName": "TAI KHOAN DEMO",
    "qrCode": "00020101021238550010A000000727012500069704160111P2S999999990208QRIBFTTA520400005303704540420005802VN62170813THANHTOANDEMO6304D27B",
    "qrDataURL": "data:image/png;base64,<PNG_BASE64_RUT_GON>"
  }
}
```