I. Nhập khoản

A. Xác thực

Dùng token giao dịch (cung cấp bởi V8Pay) và gán vào Request Header khi gọi lên API.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [2] Deposit Transaction Token (入款密钥): xxxxxxxxx

Deposit transaction token Image
curl -H 'TransactionToken: xxxxxxxxx'
                        
B. Bảo mật:
Chữ ký (Checksum):
  1. Checksum sử dụng thuật toán HMAC-SHA256 và secretKey làm khóa mã hóa.
  2. Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.
  3. Tên khoá được sử dụng: [1] Checksum Secret Key (安全码): xxxxxxxxx
  4. Transaction Token Image
curl -H 'Checksum: AAABBBCCC'
Hướng dẫn tạo Checksum
  • Hãy chắc chắn request Body đã remove tất cả khoảng trắng trước khi sinh Checksum
  • Hãy chắc chắn thứ tự các tham số phải như nhau khi tạo Checksum và khi POST lên API
  • Có thể sử dụng tool online để kiểm thử cách tạo Checksum: (link)

// PHP sample code to create Checksum
// NOTE: $message = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
// hmac_sha256_digest('{"amount":1000,"referId":"XXXYYYY50","user":"user001"}', "CbdESgRaDKi9btfG5dQK2O7gXBrW6W2K");

public function hmac_sha256_digest($message, $secret_key) {
    $sig = hash_hmac('sha256', $message, $secret_key, true);
    $sig = base64_encode($sig);
    return $sig;
}
// C# sample code to create Checksum

public static string HmacSha256Digest(string message, string secretKey) {
    byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(secretKey);
    byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
    System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes);
    byte[] bytes = cryptographer.ComputeHash(messageBytes);
    string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
    return base64String;
}
// Java sample code to create Checksum

<!-- Maven lib -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

public static String hmacSha256Digest(String message, String secretKey) {
    byte[] hmac = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey.getBytes()).hmac(message);
    return Base64.getEncoder().encodeToString(hmac);
}

1. Tích hợp website nạp tiền

Gửi yêu cầu nạp tiền lên V8pay:
[POST] https://cdn-api.v8pay.net/v2/auto/deposit
Danh sách tham số được dùng khi gọi lên API:
Tham số Kiểu dữ liệu Bắt buộc Mô tả
gate String Mã cổng nạp. Vui lòng dùng chính xác mã dựa theo danh sách mã cổng nạp đã định nghĩa ở trên.
amount Number Số tiền muốn nhập khoản
user String Mã đại diện cho người dùng gửi yêu cầu nhập khoản
referId String Mã đại diện cho giao dịch
callbackUrl String Không

Đường dẫn gọi lại (callbackUrl) được V8pay gọi đến khi giao dịch thành công (hoặc đơn bị xóa từ V8Pay).

Lưu ý: Khi không có callbackUrl, V8pay sẽ gọi lại vào đường dẫn webhook đã được cấu hình ở trang Cài đặt chung.

Phương thức và tham số được gọi lại tương tự như gọi lại với Webhook. Vui lòng xem ở phần: Tích hợp webhook

bankCode Number Không

Yêu cầu nạp tiền sẽ được tạo chính xác cho ngân hàng tương ứng với bankCode và số tiền đã chọn.

Lưu ý:

Nếu ngân hàng theo "bankCode" đang sẵn sàng để nhập khoản, trang nạp tiền ngân hàng sẽ được hiển thị ngay lập tức.
Ngược lại trang chọn ngân hàng sẽ được hiển thị.

Mã cổng nạp:

001 Chỉ hiển thị danh sách ngân hàng để chọn, sau đó chuyển tới trang nạp tiền:

002 Chọn ngân hàng và không hiển thị mã QR ở trang nạp tiền:

003 Bỏ qua bước chọn ngân hàng, hiển thị trang nạp tiền ngay lập tức:

004 Chuyển thẳng đến trang nạp tiền qua MOMO:

005 Chuyển thẳng đến trang nạp tiền qua ZaloPay:

006 Chuyển thẳng đến trang nạp tiền qua ViettelMoney:

Danh sách mã ngân hàng (bankCode) được hỗ trợ nhập khoản:
Tên đầy đủ (Vietnamese) Tên viết tắt Mã ngân hàng (bankCode)
Ngân hàng TMCP Tiên Phong (Tien Phong Commercial Joint Stock Bank) TPBank 8001
Ngân hàng TMCP Kỹ thương Việt Nam (Vietnam Technological and Commercial Joint- stock Bank) Techcombank 8002
Ngân hàng TMCP Quốc tế Việt Nam (Vietnam International Commercial Joint Stock Bank) VIB 8003
Ngân hàng TMCP Việt Nam Thịnh Vượng (Vietnam Prosperity Joint-Stock Commercial Bank) VPBank 8004
Ngân hàng TMCP Ngoại Thương Việt Nam (Joint Stock Commercial Bank for Foreign Trade of Vietnam) Vietcombank 8005
Ngân hàng TMCP Công thương Việt Nam (Vietnam Joint Stock Commercial Bank For Industry And Trade) VietinBank 8006
Ngân hàng TMCP Quân đội (Military Commercial Joint Stock Bank) MBBank 8007
Ngân hàng TMCP An Bình (An Binh Commercial Join Stock Bank) ABBANK 8008
Ngân hàng TMCP Á Châu (Asia Commercial Bank) ACB 8009
Ngân hàng TMCP Đầu tư và Phát triển Việt Nam (Bank for Investment and Development of Vietnam) BIDV 8010
Ngân hàng TMCP Phương Đông (Orient Commercial Joint Stock Bank) OCB 8011
Ngân hàng TMCP Hàng Hải (Vietnam Maritime Commercial Joint Stock Bank) MSB 8012
Ngân hàng TMCP Sài Gòn - Hà Nội (Saigon-Hanoi Commercial Joint Stock Bank) SHB 8013
Ngân hàng TMCP Nam Á (Nam A Commercial Joint Stock Bank) NamABank 8032
Ngân hàng TMCP Xăng dầu Petrolimex (Petrolimex Group Commercial Joint Stock Bank) PGBank 8033
Ngân hàng TMCP Đông Nam Á (Southeast Asia Commercial Joint Stock Bank) SeABank 8036
Ví dụ về 1 request hợp lệ dùng CURL:
curl -X POST 'https://cdn-api.v8pay.net/v2/auto/deposit' \
-H 'TransactionToken: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGf*********' \
-H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z' \
-H 'Content-Type: application/json' \
-d '{
    "gate": "003",
    "amount": 50000,
    "referId":"W11021212121212",
    "user": "userA",
    "callbackUrl": "https://your-callback-url.sample",
    "bankCode": 8001
}'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "redirectUrl": "https://cdn-api.v8pay.net/v2/auto/deposit/new/64c5cf05f5ac5a8543de4d95"
    }
}
Lưu ý:
  • Nhà đài sẽ điều hướng người dùng đến trang nạp tiền của V8pay theo đường dẫn mà API trả về (redirectUrl)
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}
Danh sách các mã lỗi (tham khảo):
401001: Unauthorized. Please check the TransactionToken.
422001: Field value must not empty [:field]
422002: Field value must be a number [:field]
422003: Field value is invalid [:field]
422004: Field value is exists [:field]
422005: Field value must be an ObjectId [:field]
422006: Field value must be an alphanumeric [:field]
422007: Field value must be a boolean [:field]
422008: Field value not found [:field]
422100: Balance is not enough
422101: Not found available bank
422102: searchId (referId) is exists
422103: The integration URL and Org type is not match.
422104: The system is not ready for this deposit request.
422105: The bank is under maintenance.
422106: The request IP is not allowed. Please check your IP whitelist setting.
400000: An error has occurred
Kết quả trả về khi gọi redirectUrl thành công là website nạp tiền của V8pay:

(Hình minh họa)

(Hình minh họa)

[Phần bổ sung]

API tạo đơn nạp và nhận thông tin đơn nạp dưới dạng JSON

[POST] https://cdn-api.v8pay.net/v2/auto/deposit-api/new
curl -X POST 'https://cdn-api.v8pay.net/v2/auto/deposit-api/new' \
-H 'TransactionToken: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGf*********' \
-H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z' \
-H 'Content-Type: application/json' \
-d '{
    "amount": 50000,
    "referId":"W11021212121212",
    "user": "userA",
    "callbackUrl": "https://your-callback-url.sample",
    "bankCode": 8005
}'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "searchId": "MA8WHT",
        "amount": 50000,
        "referId": "XXXYYYY4763",
        "requestedBy": "03b76951",
        "toBankCode": 8005,
        "toBankName": "Vietcombank",
        "toAccountName": "TR* *** ***I",
        "toAccountNumber": "1****414",
        "state": "waiting_bot",
        "createdAt": 1549541940219,
        "callbackUrl": "http://sample.ui",
        "message": "MA8WHT chuyen khoan",
        "qrCodeContent": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAYAA..."
    }
}

2. API thông tin giao dịch

Hỗ trợ lấy thông tin của 1 giao dịch

Xác thực

Dùng TransactionToken (cung cấp bởi V8Pay) và gán vào Request Header khi gọi lên API.
Để lấy TransactionToken vui lòng truy cập trang quản lý.

Đường dẫn API lấy thông tin 1 giao dịch
[GET] https://cdn-api.v8pay.net/v2/auto/deposit/transactions/{referId}
Danh sách tham số được dùng khi gọi lên API
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
{referId} String Không

Mã giao dịch.
Ví dụ: 1234b38fc25fa023927b6f22

Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan)
Ví dụ: W42232323323231233

Ví dụ về 1 request hợp lệ sử dụng CURL:

curl -X 'GET' \
  'https://cdn-api.v8pay.net/v2/auto/deposit/transactions/W42232323323231233' \
  -H 'Content-Type: application/json' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX90wYCiI1Jt7n'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "_id": "6468bbb7da361c663******",
        "state": "success",
        "toBankName": "Vietcombank",
        "toAccountNumber": "1036******",
        "toAccountName": "TRAN *****",
        "requestedBy": "test",
        "quantity": 1000,
        "searchId": "WXINMETA",
        "referId": "W42232323******",
        "createdAt": 1684585399155,
        "matchedAt": 1684585658576
    }
}
(*) JSON "state" data values
  • "waiting_bot"
  • "success"
  • "delete"
  • "expired"
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}
Danh sách các mã lỗi (tham khảo):

401001: Unauthorized. Please check the TransactionToken.
422001: Field value must not empty [:field]
422002: Field value must be a number [:field]
422003: Field value is invalid [:field]
422004: Field value is exists [:field]
422005: Field value must be an ObjectId [:field]
422006: Field value must be an alphanumeric [:field]
422007: Field value must be a boolean [:field]
422008: Field value not found [:field]
422100: Balance is not enough
422101: Not found available bank
422102: searchId (referId) is exists
422103: The integration URL and Org type is not match.
422104: The system is not ready for this deposit request.
422105: The bank is under maintenance.
422106: The request IP is not allowed. Please check your IP whitelist setting.
400000: An error has occurred

3. Tích hợp Webhook

Webhook là 1 đường dẫn bất kỳ không thuộc quản lí của V8Pay và được tích hợp vào V8Pay.
Khi giao dịch thành công V8Pay sẽ gọi qua đường dẫn Webhook này kèm với thông tin giao dịch thành công.

Cơ chế bảo mật và đảm bảo toàn vẹn thông tin:

Để tăng cường bảo mật thông tin khi gọi Webhook, V8Pay cung cấp cơ chế mã hóa thông tin sử dụng thuật toán AES-256-CBC

V8Pay khuyến khích khách hàng sử dụng và tuân theo đúng các bước để giải mã, đảm bảo thông tin được gửi tới từ V8pay.

Xác thực thông tin request có 2 bước:

1. Giải mã chuỗi checksum trong request sử dụng thuật toán AES-256-CBC với 2 tham số:
- AES secret key (xem hình minh hoạ)
- IV (được truyền lên theo request)

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [3] Deposit AES Secret Key (入款公钥): xxxxxxxxx

Deposit AES secretkey Image

2. So sánh chuỗi đã giải mã (ở bước 1) với chuỗi md5 đi kèm.
Nếu giống nhau thì request là hợp lệ, nếu khác nhau là request không hợp lệ (không đến từ v8Pay)

Các tham số được V8Pay gửi lên Webhook URL (dạng JSON):
(1) Giao dịch thành công (success):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'success'
    amount: 1000,
    createdAt: 1682040653827,
    requestedBy: 'U001',
    searchId: 'COFRC***',
    referId: 'COFRC***',
    toBankName: 'Bank Name',
    toAccountName: 'BANK ACCOUNT NAME',
    toAccountNumber: '1111111111'
  }
}
(2) Giao dịch đã bị xóa (delete):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'delete',
    deleteReason: 'This is a note...'
    amount: 1000,
    createdAt: 1682040653827,
    requestedBy: 'U001',
    searchId: 'COFRC***',
    referId: 'COFRC***',
    toBankName: 'Bank Name',
    toAccountName: 'BANK ACCOUNT NAME',
    toAccountNumber: '1111111111'
  }
}
Mô tả chi tiết nội dung payload:
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
algorithm.type String Không Thuật toán được sử dụng là "aes-256-cbc"
algorithm.iv String Không IV (initialization vector) là 1 chuỗi ngẫu nhiên nhằm ngăn chặn sự lặp lại của nội dung đã mã hóa.
checksum String Không Là nội dung đã mã hóa của chuỗi md5 bên dưới. Sau khi giải mã chuỗi checksum này và so khớp với chuỗi md5 để xác minh đây là request hợp lệ từ V8Pay
md5 String Không md5 là chuỗi mã hóa nội dung payload sang MD5, dùng để so khớp với checksum
payload.id String Không Mã giao dịch.
Ví dụ: 1234b38fc25fa023927b6f22
payload.state String Trạng thái giao dịch nhập khoản: "success", "delete"
payload.deleteReason String Không Lí do xóa giao dịch
payload.amount Number Không Số tiền đã nạp.
payload.createdAt Number Không Thời điểm nạp tiền dưới dạng timestamp milliseconds
payload.requestedBy String Không ID người đã nạp tiền. ID này được lưu lại khi thực hiện giao dịch ở website nạp tiền (user=ZZZ)
payload.searchId String Không Mã nạp tiền.
Ví dụ: ASDQWEVC
payload.referId String Không Mã liên quan
payload.toBankName String Không Tên ngân hàng đã nhận tiền
payload.toAccountName String Không Tên tài khoản ngân hàng đã nhận tiền
payload.toAccountNumber String Không Số tài khoản đã nhận tiền
Code mẫu giải mã checksum với AES Key (tham khảo):

4. Tích hợp Telegram

Contact customer service. Thank you.

5. API lấy danh sách ngân hàng đang sẵn sàng để nhập khoản:

[GET] https://cdn-api.v8pay.net/v2/auto/deposit/available-banks
Ví dụ về 1 request hợp lệ dùng CURL:
curl --location --request GET 'https://cdn-api.v8pay.net/v2/auto/deposit/available-banks'
--header 'TransactionToken: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGf*********'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": [
        {
            "bankName": "Techcombank",
            "bankCode": 8002
        },
        {
            "bankName": "SHB",
            "bankCode": 8013
        },
        {
            "bankName": "Vietcombank",
            "bankCode": 8005
        }
    ]
}

II. Xuất khoản

1. API tạo mới giao dịch

Hỗ trợ tạo mới giao dịch xuất khoản trên V8Pay

A. Xác thực

Dùng token giao dịch (cung cấp bởi V8Pay) và gán vào Request Header khi gọi lên API.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [4] Withdrawal Transaction Token (出款密钥): xxxxxxxxx

Withdrawal transaction token Image
curl -H 'TransactionToken: xxxxxxxxx'
B. Bảo mật:
Chữ ký (Checksum):
  1. Checksum sử dụng thuật toán HMAC-SHA256 và secretKey làm khóa mã hóa.
  2. Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.
  3. Tên khoá được sử dụng: [1] Checksum Secret Key (安全码): xxxxxxxxx
  4. checsum secretkey Image
  5. Sau khi có Checksum, vui lòng thêm Checksum vào request Header khi gọi lên API
curl -H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z'
Hướng dẫn tạo Checksum
  • Hãy chắc chắn request Body đã remove tất cả khoảng trắng trước khi sinh Checksum
  • Hãy chắc chắn thứ tự các tham số phải như nhau khi tạo Checksum và khi POST lên API
  • Có thể sử dụng tool online để kiểm thử cách tạo Checksum: (link)

// PHP sample code to create Checksum
// NOTE: $message = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
// hmac_sha256_digest('{"bankCode":8001,"accountNumber":"1113333000888","accountName":"NGUYEN VAN A","referId":"W111212222000888","quantity":100000,"requestedBy":"user001","callbackUrl":"https://your-callback-url.sample"}', "CbdESgRaDKi9btfG5dQK2O7gXBrW6W2K");

public function hmac_sha256_digest($message, $secret_key) {
    $sig = hash_hmac('sha256', $message, $secret_key, true);
    $sig = base64_encode($sig);
    return $sig;
}
// C# sample code to create Checksum

public static string HmacSha256Digest(string message, string secretKey) {
    byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(secretKey);
    byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
    System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes);
    byte[] bytes = cryptographer.ComputeHash(messageBytes);
    string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
    return base64String;
}
// Java sample code to create Checksum

<!-- Maven lib -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

public static String hmacSha256Digest(String message, String secretKey) {
    byte[] hmac = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey.getBytes()).hmac(message);
    return Base64.getEncoder().encodeToString(hmac);
}
Đường dẫn API dùng để tạo mới yêu cầu xuất khoản
[POST] https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions
Danh sách tham số được dùng khi gọi lên API
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
bankCode Number Mã ngân hàng. (Tham khảo danh sách mã ngân hàng bên dưới)
accountNumber String Không Số tài khoản ngân hàng xuất khoản
accountName String Không Tên tài khoản ngân hàng xuất khoản
referId String Không Mã tham chiếu không thuộc quản lý của V8Pay, V8Pay sẽ lưu lại mã này với mục đích hỗ trợ tìm kiếm giao dịch và truyền lên Webhook khi giao dịch thành công.
requestedBy String Mã đại diện cho người gửi yêu cầu xuất khoản
quantity Number Không Số tiền xuất khoản
callbackUrl String Không

Đường dẫn gọi lại (callbackUrl) được V8pay gọi đến khi giao dịch thành công (hoặc đơn bị xóa từ V8Pay).

Lưu ý: Khi không có callbackUrl, V8pay sẽ gọi lại vào đường dẫn webhook đã được cấu hình ở trang Cài đặt chung.

Phương thức và tham số được gọi lại tương tự như gọi lại với Webhook. Vui lòng xem ở phần: Tích hợp webhook

Lưu ý:

Vui lòng sử dụng chính xác mã ngân hàng (bankCode) khi tạo yêu cầu xuất khoản

Khi nhận được lỗi không xác định trong quá trình tạo đơn xuất khoản, hãy gọi lại API lấy thông tin đơn để kiểm tra lại 1 lần nữa trạng thái chính xác trên V8pay. ( Get transaction API)

!!! KIỂM TRA NGƯỢC THÔNG TIN ĐƠN XUẤT KHOẢN !!!

(*) Vui lòng Cài đặt đường dẫn kiểm tra ngược (1) và Bật tính năng kiểm tra ngược (2) trong phần cài đặt Xuất khoản

(*) V8pay hổ trợ tính năng kiểm tra ngược cho đơn xuất khoản trước khi tạo lên hệ thống.
Vui lòng trả về mã 200 (HTTP 200) cho xác nhận thành công và đơn sẽ được tạo.
Tất cả mã khác 200 sẽ được xem là không hợp lệ và đơn xuất khoản sẽ bị bãi bỏ.


Thông tin tích hợp và thuật toán:
  • Thuật toán được sử dụng: "AES-256-CBC".
    Thực hiện giải mã chuỗi "checksum" và so sánh với chuỗi "md5", nếu kết quả khớp là dữ liệu hợp lệ.
  • Kiểm tra ngược dùng chung AES secret key chung với webhook callback và cách giải mã tương tự nhau.
    Tham khảo thêm tại:
    Webhook integration
  • Nội dung (tham khảo) được V8 gọi đến đường dẫn kiểm tra ngược.
    curl --location 'http://your-url-for-checking.com' \
    --header 'Content-Type: application/json' \
    --data '{
        "algorithm": {
            "type": "aes-256-cbc",
            "iv": "iVDXwgIk***"
        },
        "checksum": "7ae65cf3e6f80ff221ba3de***",
        "md5": "fb325aadcef01a95***",
        "payload": {
            "referId": "test001",
            "quantity": 100000,
            "requestedBy": "user001",
            "toBankCode": 8002,
            "toAccountName": "NGUYEN VAN A",
            "toAccountNumber": "1900009911"
        }
    }'
                                    
Danh sách mã ngân hàng (bankCode):
Tên đầy đủ (Vietnamese) Tên viết tắt Mã ngân hàng (bankCode)
Ngân hàng TMCP Tiên Phong
(Tien Phong Commercial Joint Stock Bank)
TPBank 8001
Ngân hàng TMCP Kỹ thương Việt Nam (Vietnam Technological and Commercial Joint- stock Bank) Techcombank 8002
Ngân hàng TMCP Quốc tế Việt Nam (Vietnam International Commercial Joint Stock Bank) VIB 8003
Ngân hàng TMCP Việt Nam Thịnh Vượng (Vietnam Prosperity Joint-Stock Commercial Bank) VPBank 8004
Ngân hàng TMCP Ngoại Thương Việt Nam (Joint Stock Commercial Bank for Foreign Trade of Vietnam) Vietcombank 8005
Ngân hàng TMCP Công thương Việt Nam (Vietnam Joint Stock Commercial Bank For Industry And Trade) VietinBank 8006
Ngân hàng TMCP Quân đội (Military Commercial Joint Stock Bank) MBBank 8007
Ngân hàng TMCP An Bình (An Binh Commercial Join Stock Bank) ABBANK 8008
Ngân hàng TMCP Á Châu (Asia Commercial Bank) ACB 8009
Ngân hàng TMCP Đầu tư và Phát triển Việt Nam (Bank for Investment and Development of Vietnam) BIDV 8010
Ngân hàng TMCP Phương Đông (Orient Commercial Joint Stock Bank) OCB 8011
Ngân hàng TMCP Hàng Hải (Vietnam Maritime Commercial Joint Stock Bank) MSB 8012
Ngân hàng TMCP Sài Gòn - Hà Nội (Saigon-Hanoi Commercial Joint Stock Bank) SHB 8013
Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam (Vietnam Bank for Agriculture and Rural Development) Agribank 8014
Ngân hàng TMCP Sài Gòn Thương Tín (Saigon Thuong Tin Commercial Joint Stock Bank) Sacombank 8015
Ngân hàng TMCP Phát triển Thành phố Hồ Chí Minh (Ho Chi Minh City Development Joint Stock Commercial Bank) HDBank 8016
Ngân hàng TMCP Bản Việt BVBank 8017
Ngân hàng TMCP Sài Gòn (Sai Gon Joint Stock Commercial Bank) SCB 8018
Ngân hàng TMCP Xuất Nhập khẩu Việt Nam (Vietnam Export Import Commercial Joint - Stock Bank) Eximbank 8019
TMCP Việt Nam Thịnh Vượng - Ngân hàng số CAKE by VPBank (Cake by VPBank - Digital Bank) CAKE 8020
TMCP Việt Nam Thịnh Vượng - Ngân hàng số Ubank by VPBank (Ubank by VPBank - Digital Bank) Ubank 8021
Ngân hàng số Timo by Ban Viet Bank (Timo - Digital Bank) Timo 8022
Viettel Money ViettelMoney 8023
VNPT Money VNPTMoney 8024
Ngân hàng TMCP Sài Gòn Công Thương (Saigon Bank for Industry and Trade) SaigonBank 8025
Ngân hàng TMCP Bắc Á (Bac A Commercial Joint Stock Bank) BacABank 8026
Ngân hàng TMCP Đại Chúng Việt Nam (VIETNAM PUBLIC JOINT STOCK COMMERCIAL BANK) PVcomBank 8027
Ngân hàng Thương mại TNHH MTV Đại Dương (OceanBank) Oceanbank 8028
Ngân hàng TMCP Quốc Dân (National Citizen Commercial Joint Stock Bank) NCB 8029
Ngân hàng TNHH MTV Shinhan Việt Nam (Shinhan Bank) ShinhanBank 8030
Ngân hàng TMCP Việt Á (VietNam Asia Commercial) VietABank 8031
Ngân hàng TMCP Nam Á (Nam A Commercial Joint Stock Bank) NamABank 8032
Ngân hàng TMCP Xăng dầu Petrolimex (Petrolimex Group Commercial Joint Stock Bank) PGBank 8033
Ngân hàng TMCP Việt Nam Thương Tín (VIETNAM THUONG TIN COMMERCIAL JOINT STOCK BANK) VietBank 8034
Ngân hàng TMCP Bảo Việt (BaoViet Bank) BaoVietBank 8035
Ngân hàng TMCP Đông Nam Á (Southeast Asia Commercial Joint Stock Bank) SeABank 8036
Ngân hàng Hợp tác xã Việt Nam (Co-operative Bank of Viet Nam) COOPBANK 8037
Ngân hàng TMCP Lộc Phát Việt Nam LPBank 8038
Ngân hàng TMCP Kiên Long (Kien Long Commercial Joint Stock Bank) KienLongBank 8039
Ngân hàng Đại chúng TNHH Kasikornbank (KASIKORNBANK) KBank 8040
Ngân hàng Liên doanh Việt - Nga (Vietnam – Russia Joint Venture Bank ) VRB 8041
DBS Bank Ltd - Chi nhánh Thành phố Hồ Chí Minh (The Development Bank of Singapore Limited) DBSBank 8042
Ngân hàng TNHH MTV Woori Việt Nam (Woori Bank) Woori 8043
Ngân hàng Kookmin - Chi nhánh Hà Nội (KB Kookmin Bank Hanoi Branch) KookminHN 8044
Ngân hàng Kookmin - Chi nhánh Thành phố Hồ Chí Minh (KB Kookmin Bank Hồ Chí Minh Branch) KookminHCM 8045
Ngân hàng Thương mại TNHH MTV Xây dựng Việt Nam (Vietnam Construction Bank) CBBank 8046
Ngân hàng Nonghyup - Chi nhánh Hà Nội (NongHyup Bank Ha Noi) Nonghyup 8047
Ngân hàng TNHH MTV CIMB Việt Nam (Commerce International Merchant Bankers) CIMB 8048
Ngân hàng TMCP Đông Á (DongA Commercial Joint Stock Bank) DongABank 8049
Ngân hàng Thương mại TNHH MTV Dầu Khí Toàn Cầu (Global Petro Commercial Joint Stock Bank) GPBank 8050
Ngân hàng TNHH MTV Hong Leong Việt Nam (Hong Leong Bank) HongLeong 8051
Ngân hàng United Overseas - Chi nhánh TP. Hồ Chí Minh (United Overseas Bank) UnitedOverseas 8052
Ngân hàng TNHH MTV HSBC (Việt Nam) (The Hongkong and Shanghai Banking Corporation) HSBC 8053
Ngân hàng Công nghiệp Hàn Quốc - Chi nhánh Hà Nội (Industrial Bank Of Korea) IBKHN 8054
Ngân hàng TNHH MTV Public Việt Nam (Public Bank Berhad) PublicBank 8055
Ngân hàng Công nghiệp Hàn Quốc - Chi nhánh TP. Hồ Chí Minh (Industrial Bank Of Korea) IBKHCM 8056
Ngân hàng TNHH Indovina (Indovina Bank Ltd.) IndovinaBank 8057
Ngân hàng TNHH MTV Standard Chartered Bank Việt Nam (Standard Chartered) StandardChartered 8058
Ngân hàng Chính sách xã hội Việt Nam (Vietnam Bank for Social Policies) VBSP 8059
Ngân hàng Phát triển Việt Nam (Vietnam Development Bank) VDB 8060
Ngân Hàng ANZ Việt Nam (Australia and New Zealand Banking Group Limited ) ANZ 8062
Ngân hàng Citibank, N.A. - Chi nhánh Hà Nội CITIBANK 8068
Ngân hàng KEB Hana – Chi nhánh Thành phố Hồ Chí Minh KEBHANAHCM 8069
Ngân hàng KEB Hana – Chi nhánh Hà Nội KEBHANAHN 8070
Công ty Tài chính TNHH MTV Mirae Asset (Việt Nam) MAFC 8071
Ngân hàng TNHH một thành viên Số Vikki VikkiBank 8072
Ngân hàng TMCP Bản Việt VietCapitalBank 8074
Ngân hàng TNHH MTV Việt Nam Hiện Đại MBV 8075
Ngân hàng số LioBank LioBank 8076
Ví dụ về 1 request hợp lệ dùng CURL:
curl -X POST https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions \
  -H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX9**********' \
  -H 'Content-Type: application/json' \
  -d '{
    "bankCode": 8001,
    "accountNumber": "1113333000888",
    "accountName": "NGUYEN VAN A",
    "referId":"W111212222000888",
    "quantity": 100000,
    "requestedBy": "user001",
    "callbackUrl": "https://your-callback-url.sample"
}'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "id": "646c91587c9cb3397******",
        "state": "queue",
        "toBankName": "Vietcombank",
        "toAccountNumber": "234234456663*****",
        "toAccountName": "NGUYEN VAN A",
        "quantity": 10,
        "referId": "XXX",
        "requestedBy": "YYY",
        "createdAt": 1684836696965
    }
}
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "Field value must not empty [bankName]",
    "code": 422001
}
Danh sách các mã lỗi (tham khảo):

401001: Unauthorized. Please check the TransactionToken.
422001: Field value must not empty [:field]
422002: Field value must be a number [:field]
422003: Field value is invalid [:field]
422004: Field value is exists [:field]
422005: Field value must be an ObjectId [:field]
422006: Field value must be an alphanumeric [:field]
422007: Field value must be a boolean [:field]
422008: Field value not found [:field]
422100: Balance is not enough
422101: Not found available bank
422102: searchId (referId) is exists
422103: The integration URL and Org type is not match.
422104: The system is not ready for this deposit request.
422105: The bank is under maintenance.
422106: The request IP is not allowed. Please check your IP whitelist setting.
400000: An error has occurred

2. API thông tin giao dịch

Hỗ trợ lấy thông tin của 1 giao dịch

Xác thực

Dùng TransactionToken (cung cấp bởi V8Pay) và gán vào Request Header khi gọi lên API.
Để lấy TransactionToken vui lòng truy cập trang quản lý Tổ chức

Đường dẫn API
[GET] https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions/{referId}
Danh sách tham số được dùng khi gọi lên API
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
{referId} String Không

Mã giao dịch.
Ví dụ: 1234b38fc25fa023927b6f22

Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan)
Ví dụ: W42232323323231233

Ví dụ về 1 request hợp lệ sử dụng CURL:

curl -X 'GET' \
  'https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions/1234b38fc25fa023927b6f22' \
  -H 'Content-Type: application/json' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX90wYCiI1Jt7n'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "id": "648704eeafce546a******",
        "state": "done",
        "toBankName": "Techcombank",
        "toAccountNumber": "109906917******",
        "toAccountName": "DOAN ******",
        "quantity": 7920000,
        "referId": "W2111790040261******",
        "requestedBy": "DOAN ******",
        "createdAt": 1686570222399,
        "finishedAt": 1686571394755
    }
}
(*) state:
  • "queue": Đơn đã được tạo thành công và đang đợi xử lý
  • "doing": Đơn xuất đang thực hiện chuyển tiề
  • "done": Đơn xuất đã chuyển tiền thành công
  • "delete": Đơn xuất bị từ chối và xóa bởi người vận hành
  • "rejected": Đơn xuất bị từ chối tự động bởi hệ thống
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}

3. API thu hồi giao dịch

Hỗ trợ thu hồi 1 giao dịch khi giao dịch đó chưa được V8pay thực hiện

Xác thực

Dùng TransactionToken (cung cấp bởi V8Pay) và gán vào Request Header khi gọi lên API.
Để lấy TransactionToken vui lòng truy cập trang quản lý Tổ chức

Đường dẫn API
[POST] https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions/referId/delete
Danh sách tham số được dùng khi gọi lên API
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
referId String Không

Mã giao dịch.
Ví dụ: 1234b38fc25fa023927b6f22

Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan)
Ví dụ: W42232323323231233

Ví dụ về 1 request hợp lệ sử dụng CURL:

curl -X 'POST' \
  'https://cdn-api.v8pay.net/v2/auto/withdrawal/transactions/1234b38fc25fa023927b6f22/delete' \
  -H 'Content-Type: application/json' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX90wYCiI1Jt7n'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "id": "648704eeafce546a******",
        "state": "delete",
        "toBankName": "Techcombank",
        "toAccountNumber": "109906917******",
        "toAccountName": "DOAN ******",
        "quantity": 7920000,
        "referId": "W2111790040261******",
        "requestedBy": "DOAN ******",
        "createdAt": 1686570222399,
        "finishedAt": 1686571394755
    }
}
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}

4. Tích hợp Webhook

Webhook là 1 đường dẫn bất kỳ không thuộc quản lí của V8Pay và được tích hợp vào V8Pay.
Khi giao dịch thành công, V8Pay sẽ gọi qua đường dẫn Webhook này kèm với thông tin giao dịch thành công.

Cơ chế bảo mật và đảm bảo toàn vẹn thông tin:

Để tăng cường bảo mật thông tin khi gọi Webhook, V8Pay cung cấp cơ chế mã hóa thông tin sử dụng thuật toán AES-256-CBC

V8Pay khuyến khích khách hàng sử dụng và tuân theo đúng các bước để giải mã, đảm bảo thông tin được gửi tới từ V8pay.

Xác thực thông tin request có 2 bước:

1. Giải mã chuỗi checksum trong request sử dụng thuật toán AES-256-CBC với 2 tham số:
- AES secret key (xem hình minh hoạ)
- IV (được truyền lên theo request)

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [5] Withdrawal AES Secret Key (出款公钥): xxxxxxxxx

Withdrawal AES secretkey Image

2. So sánh chuỗi đã giải mã (ở bước 1) với chuỗi md5 đi kèm.
Nếu giống nhau thì request là hợp lệ, nếu khác nhau là request không hợp lệ (không đến từ v8Pay)

Các tham số được V8Pay gửi lên Webhook URL (dạng JSON):
(1) Giao dịch thành công (done):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'done'
    quantity: 1000,
    createdAt: 1682040653827,
    requestedBy: 'U001',
    referId: 'R1341423423237789***',
    searchId: 'R1341423423237789***',
    toBankName: 'Bank Name',
    toAccountName: 'BANK ACCOUNT NAME',
    toAccountNumber: '1111111111'
  }
}
(2) Giao dịch đã bị xóa (delete):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'delete', // NOTE!!!: 'delete' or 'rejected'
    deleteReason: 'This is a note...'
    quantity: 1000,
    createdAt: 1682040653827,
    requestedBy: 'U001',
    referId: 'R1341423423237789***',
    searchId: 'R1341423423237789***',
    toBankName: 'Bank Name',
    toAccountName: 'BANK ACCOUNT NAME',
    toAccountNumber: '1111111111'
  }
}
Mô tả chi tiết nội dung payload:
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
algorithm.type String Không Thuật toán được sử dụng là "aes-256-cbc"
algorithm.iv String Không IV (initialization vector) là 1 chuỗi ngẫu nhiên nhằm ngăn chặn sự lặp lại của nội dung đã mã hóa.
checksum String Không Là nội dung đã mã hóa của chuỗi md5 bên dưới. Sau khi giải mã chuỗi checksum này và so khớp với chuỗi md5 để xác minh đây là request hợp lệ từ V8Pay
md5 String Không md5 là chuỗi mã hóa nội dung payload sang MD5, dùng để so khớp với checksum
payload.id String Không Mã giao dịch.
Ví dụ: 1234b38fc25fa023927b6f22
payload.state String Không Trạng thái giao dịch xuất khoản: "done", "delete"
payload.deleteReason String Không Lí do xóa giao dịch
payload.quantity Number Không Số tiền đã xuất khoản. Vd: 3000000
payload.createdAt Number Không Thời điểm thực hiện, dưới dạng timestamp milliseconds
payload.requestedBy String Không ID đại diện cho người yêu cầu xuất khoản.
payload.referId String Không Mã đại diện cho giao dịch xuất khoản.
Ví dụ: ASDQWEVC
payload.searchId String Không Mã đại diện cho giao dịch xuất khoản.
Ví dụ: ASDQWEVC
payload.toBankName String Không Tên ngân hàng được yêu cầu xuất khoản
payload.toAccountName String Không Tên tài khoản ngân hàng được yêu cầu xuất khoản
payload.toAccountNumber String Không Số tài khoản ngân hàng được yêu cầu xuất khoản
Code mẫu giải mã checksum với AES Key (tham khảo):

5. Tích hợp Telegram

Contact customer service. Thank you.

III. Nạp thẻ cào

1. Tích hợp website

Tạo đơn nạp và sau đó người dùng sẽ dùng giao diện cổng nạp tiền của V8pay.

A. Xác thực

Sử dụng TransactionToken tương tự như tạo đơn nhập khoản.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [2] Deposit Transaction Token (入款密钥): xxxxxxxxx

Deposit transaction token Image
B. Bảo mật:

Sử dụng CheckSum tương tự như tạo đơn nhập khoản.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [1] Checksum Secret Key (安全码): xxxxxxxxx

Deposit transaction token Image
Hướng dẫn tạo Checksum
  • Hãy chắc chắn request Body đã remove tất cả khoảng trắng trước khi sinh Checksum
  • Hãy chắc chắn thứ tự các tham số phải như nhau khi tạo Checksum và khi POST lên API
  • Có thể sử dụng tool online để kiểm thử cách tạo Checksum: (link)

Đường dẫn API dùng để tạo mới yêu cầu nhập khoản thẻ cào
[POST] https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card/transactions
Danh sách tham số được dùng khi gọi lên API
Tham số Kiểu dữ liệu Bắt buộc Mô tả
user String Tên đại diện người yêu cầu nạp
cardAmount Number Không Mệnh giá thẻ nạp
[10000, 20000, 30000, 50000, 100000, 200000, 300000, 500000, 1000000]
Không bắt buộc
referId String Mã đại diện cho giao dịch
callbackUrl String Không

Đường dẫn gọi lại

customFeePercent Number Không

Phần trăm phí, sẽ tính phí theo mệnh giá thẻ được chọn

(*) Tham số này là không bắt buộc, chỉ phục vụ cho việc hiển thị trên giao diện dành cho người dùng khi nạp thẻ, không sử dụng vào các tính toán chi phí khác trên V8pay.
Nhà đài có thể thay đổi giá trị tham số này tùy theo nhu cầu hiển thị của mình.

customFeeAmount Number Không

Phí cố định

(*) Tham số này là không bắt buộc, chỉ phục vụ cho việc hiển thị trên giao diện dành cho người dùng khi nạp thẻ, không sử dụng vào các tính toán chi phí khác trên V8pay.
Nhà đài có thể thay đổi giá trị tham số này tùy theo nhu cầu hiển thị của mình.

Ví dụ về 1 request hợp lệ dùng CURL:
curl -X POST https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card/transactions \
  -H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX9**********' \
  -H 'Content-Type: application/json' \
  -d '{
    "user": "test",
    "referId": "id001",
    "cardAmount": 10000,
    "customFeePercent": 0,
    "customFeeAmount": 0,
    "callbackUrl": "http://api.domain.com/webhook"
}'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "redirectUrl": "https://cdn-api.v8pay.net/deposit-card/65b8a8e41cd424203ad53***"
    }
}
Kết quả trả về khi gọi redirectUrl thành công là website nạp tiền của V8pay:
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}
Danh sách các mã lỗi (tham khảo):

401001: Unauthorized. Please check the TransactionToken.
422001: Field value must not empty [:field]
422002: Field value must be a number [:field]
422003: Field value is invalid [:field]
422004: Field value is exists [:field]
422005: Field value must be an ObjectId [:field]
422006: Field value must be an alphanumeric [:field]
422007: Field value must be a boolean [:field]
422008: Field value not found [:field]
422100: Balance is not enough
422201: The scratch is not ready or not enabled for the org
422202: The Pin or Seri is in-valid.
422203: The Pin or Seri was used.

2. API tạo mới giao dịch

Tạo đơn nạp trực tiếp bằng API khi đã có thông tin nạp

A. Xác thực

Sử dụng TransactionToken tương tự như tạo đơn nhập khoản.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [2] Deposit Transaction Token (入款密钥): xxxxxxxxx

Deposit transaction token Image
B. Bảo mật:

Sử dụng CheckSum tương tự như tạo đơn nhập khoản.

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [1] Checksum Secret Key (安全码): xxxxxxxxx

Deposit transaction token Image
Hướng dẫn tạo Checksum
  • Hãy chắc chắn request Body đã remove tất cả khoảng trắng trước khi sinh Checksum
  • Hãy chắc chắn thứ tự các tham số phải như nhau khi tạo Checksum và khi POST lên API
  • Có thể sử dụng tool online để kiểm thử cách tạo Checksum: (link)

Đường dẫn API dùng để tạo mới yêu cầu nhập khoản thẻ cào
[POST] https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card
Danh sách tham số được dùng khi gọi lên API
Tham số Kiểu dữ liệu Bắt buộc Mô tả
cardPin String Mã PIN thẻ cào
cardSeri String Số SERI thẻ cào
cardAmount Number Mệnh giá thẻ nạp
cardType String 1 trong 4 giá trị sau: viettel, mobifone, vinaphone, vietnamobile
user String Tên đại diện người yêu cầu nạp
referId String Mã đại diện cho giao dịch
callbackUrl String Không Đường dẫn gọi lại
Ví dụ về 1 request hợp lệ dùng CURL:
curl -X POST https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card \
  -H 'Checksum: AAFbPNzeaDbfyiuT8NE251EYpsKbbHUikGfavtKPE7uzs9bP9z' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX9**********' \
  -H 'Content-Type: application/json' \
  -d '{
    "user": "test",
    "referId": "id001",
    "cardType": "viettel",
    "cardPin": "10010251036397",
    "cardSeri": "111001752196027",
    "cardAmount": 20000,
    "callbackUrl": "http://api.domain.com/webhook"
}'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "id": "65a7545eba1a424b796ec597",
        "state": "waiting",
        "cardPin": "10010251036397",
        "cardSeri": "111001752196027",
        "cardType": "viettel",
        "cardAmount": 20000,
        "referId": "id001",
        "requestedBy": "test",
        "createdAt": 1705464926496
    }
}
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}
Danh sách các mã lỗi (tham khảo):

401001: Unauthorized. Please check the TransactionToken.
422001: Field value must not empty [:field]
422002: Field value must be a number [:field]
422003: Field value is invalid [:field]
422004: Field value is exists [:field]
422005: Field value must be an ObjectId [:field]
422006: Field value must be an alphanumeric [:field]
422007: Field value must be a boolean [:field]
422008: Field value not found [:field]
422100: Balance is not enough
422201: The scratch is not ready or not enabled for the org
422202: The Pin or Seri is in-valid.
422203: The Pin or Seri was used.

3. API thông tin giao dịch

Hỗ trợ lấy thông tin của 1 giao dịch

Xác thực

Sử dụng TransactionToken.

Đường dẫn API lấy thông tin 1 giao dịch
[GET] https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card/transactions/referId
Danh sách tham số được dùng khi gọi lên API
Tên tham số Kiểu dữ liệu Bắt buộc Mô tả
referId String Không Mã đại diện cho giao dịch

Ví dụ về 1 request hợp lệ sử dụng CURL:

curl -X 'GET' \
  'https://cdn-api.v8pay.net/v2/auto/deposit-by-scratch-card/transactions/W42232323323231233' \
  -H 'Content-Type: application/json' \
  -H 'TransactionToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbHwX90wYCiI1Jt7n'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "id": "65a4ea3dbda3bd7b0f2e93e5",
        "state": "waiting",
        "cardPin": "10010251036385",
        "cardSeri": "111001752196016",
        "requestedBy": "philip",
        "amount": 20000,
        "cardType": "viettel",
        "cardAmount": 20000,
        "referId": "philipcard017",
        "createdAt": 1705306685425,
        "matchedAt": null,
        "errorReason": null
    }
}
Các giá trị của state bao gồm: "waiting", "success", "error", "rejected"
Lưu ý:
  1. [Lưu ý] SAI MỆNH GIÁ : Trường [amount] sẽ là số tiền được nhận.
  2. [Lưu ý] SAI MỆNH GIÁ : Yêu cầu 100, nạp thực 50 => Nhận được 50
  3. [Lưu ý] SAI MỆNH GIÁ : Yêu cầu 50, nạp thực 100 => Nhận được 50

4. Tích hợp Webhook

Webhook là 1 đường dẫn bất kỳ không thuộc quản lí của V8Pay và được tích hợp vào V8Pay.
Khi giao dịch thành công V8Pay sẽ gọi qua đường dẫn Webhook này kèm với thông tin giao dịch thành công.

Cơ chế bảo mật và đảm bảo toàn vẹn thông tin:

Để tăng cường bảo mật thông tin khi gọi Webhook, V8Pay cung cấp cơ chế mã hóa thông tin sử dụng thuật toán AES-256-CBC

V8Pay khuyến khích khách hàng sử dụng và tuân theo đúng các bước để giải mã, đảm bảo thông tin được gửi tới từ V8pay.

Xác thực thông tin request có 2 bước:

1. Giải mã chuỗi checksum trong request sử dụng thuật toán AES-256-CBC với 2 tham số:
- AES secret key (xem hình minh hoạ)
- IV (được truyền lên theo request)

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [3] Deposit AES Secret Key (入款公钥): xxxxxxxxx

Deposit transaction token Image

2. So sánh chuỗi đã giải mã (ở bước 1) với chuỗi md5 đi kèm.
Nếu giống nhau thì request là hợp lệ, nếu khác nhau là request không hợp lệ (không đến từ v8Pay)

Các tham số được V8Pay gửi lên Webhook URL (dạng JSON):
(1) Giao dịch thành công (success):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'success'
    referId: 'card0128',
    cardType: 'viettel',
    cardPin: '526062244767***',
    cardSeri: '20000270534***',
    amount: 10000,
    cardAmount: 10000,
    orgAmount: 8100,
    createdAt: 1708577429605,
    matchedAt: 1708577571336,
    requestedBy: 'user'
  }
}
(2) Giao dịch bị lỗi (error):
{
  algorithm: { type: 'aes-256-cbc', iv: 'IVIVIVIV***' },
  checksum: '***This is a string ***',
  md5: '***This is a MD5 string ***',
  payload: {
    id: 6441e74d0289bc635cf11***,
    state: 'error',
    errorReason: 'scratchCardPinIsUsed',
    referId: 'card0128',
    cardType: 'viettel',
    cardPin: '526062244767***',
    cardSeri: '20000270534***',
    amount: 10000,
    cardAmount: 10000,
    orgAmount: 8100,
    createdAt: 1708577429605,
    matchedAt: null,
    requestedBy: 'user'
  }
}
Lưu ý:
  • "cardAmount" is requested card amount or selected card amount from UI
  • "orgAmount" is final amount after minus V8pay fees
  • Với trường hợp số tiền thực nạp sai khác với mệnh giá yêu cầu khi tạo đơn, "amount" sẽ là số tiền thực nạp.
Code mẫu giải mã checksum với AES Key (tham khảo):

5. Tích hợp Telegram

Contact customer service. Thank you.

IV. Tổ chức

1. API lấy số dư tài khoản

Hỗ trợ lấy số dư hiện tại của tổ chức

Xác thực:

Để nhận thông tin các khoá tích hợp, vui lòng liên hệ với đội ngũ hỗ trợ V8.

Tên khoá được sử dụng: [6] Org Token (余额查询): xxxxxxxxx

Org token Image
Đường dẫn API lấy thông tin số dư:
[GET] https://cdn-api.v8pay.net/v2/org/balance

Ví dụ về 1 request hợp lệ sử dụng CURL:

curl -X 'GET' \
  'https://cdn-api.v8pay.net/v2/org/balance' \
  -H 'OrgToken: ABCDEBNRAZ5OQFwgNo87KkWPied5buNJPHbH**********'
Kết quả API trả về (dưới dạng JSON):
{
    "success": true,
    "message": "Success",
    "data": {
        "orgId": "641117033aca5**********",
        "domain": "test",
        "balance": 1855300
    }
}
Kết quả API trả về khi có lỗi xảy ra (dưới dạng JSON):
{
    "success": false,
    "message": "This is a message",
    "code": 422XXX
}