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
curl -H 'TransactionToken: xxxxxxxxx'
B. Bảo mật:
Chữ ký (Checksum):
- Checksum sử dụng thuật toán HMAC-SHA256 và secretKey làm khóa mã hóa.
- Để 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
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:
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 | Có | 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 | Có | Số tiền muốn nhập khoản |
| user | String | Có |
Mã đại diện cho người dùng gửi yêu cầu nhập khoản |
| referId | String | Có | 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. |
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"
}
}
- 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
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
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.
Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan) |
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
}
}
- "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.
- Webhook phải hỗ trợ phương thức gọi lên là POST
- Webhook phải hỗ trợ request header là POST
"Content-Type": "application/json"- Webhook phải trả về HTTP code là 200
(HTTP code trả về khác 200 được xem là không hợp lệ)
Có 2 trường hợp sẽ được gọi lại Webhook:
(1) Giao dịch thành công
(2) Giao dịch bị xóa bởi V8pay
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
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 | Có | 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):
- JAVA: (click để tải về)
- PHP: (click để tải về)
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:
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
curl -H 'TransactionToken: xxxxxxxxx'
B. Bảo mật:
Chữ ký (Checksum):
- Checksum sử dụng thuật toán HMAC-SHA256 và secretKey làm khóa mã hóa.
- Để 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
- 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
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 | Có | 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 | Có | 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 |
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"
}'
- Sử dụng phương thức POST khi gọi lên API tạo mới 1 giao dịch xuất khoản
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
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.
Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan) |
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
}
}
- "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
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.
Mã đại diện cho giao dịch (hỗ trợ tìm kiếm giao dịch liên quan) |
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.
- Webhook phải hỗ trợ phương thức gọi lên là POST
- Webhook phải hỗ trợ request header là POST
"Content-Type": "application/json"- Webhook phải trả về HTTP code là 200
(HTTP code trả về khác 200 được xem là không hợp lệ)
Có 2 trường hợp sẽ được gọi lại Webhook:
(1) Giao dịch thành công
(2) Giao dịch bị xóa bởi V8pay
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
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):
- JAVA: (click để tải về)
- PHP: (click để tải về)
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
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
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
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 | Có | 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 | Có | 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.
|
| 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.
|
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
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
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
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 | Có | Mã PIN thẻ cào |
| cardSeri | String | Có | Số SERI thẻ cào |
| cardAmount | Number | Có | Mệnh giá thẻ nạp |
| cardType | String | Có | 1 trong 4 giá trị sau: viettel, mobifone, vinaphone, vietnamobile |
| user | String | Có | Tên đại diện người yêu cầu nạp |
| referId | String | Có | 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
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
}
}
- [Lưu ý] SAI MỆNH GIÁ : Trường [amount] sẽ là số tiền được nhận.
- [Lưu ý] SAI MỆNH GIÁ : Yêu cầu 100, nạp thực 50 => Nhận được 50
- [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.
- Webhook phải hỗ trợ phương thức gọi lên là POST
- Webhook phải hỗ trợ request header là POST
"Content-Type": "application/json"- Webhook phải trả về HTTP code là 200
(HTTP code trả về khác 200 được xem là không hợp lệ)
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
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'
}
}
- "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):
- JAVA: (click để tải về)
- PHP: (click để tải về)
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
Đường dẫn API lấy thông tin số dư:
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
}