Hướng dẫn các lập trình viên của Website đối tác tích hợp Cổng thanh toán Checkout.vn để xử lý giao dịch Thanh toán trực tuyến cho khách hàng sử dụng Key và Token
Website sử dụng hàm mã hóa AES-256-CBC để tạo link thanh toán cho khách hàng
URL có dạng:
https://checkout.vn/checkout?token={TOKEN}&datas={JSON_DATA}
Thông tin bao gồm:
Tham số |
Kiểu dữ liệu |
Bắt buộc/ Tùy chọn |
Desc |
description |
String |
Tùy chọn |
Mô tả thông tin giao dịch |
currency |
string |
Bắt buộc |
Đơn vị tiền tệ : VND |
order_items |
Array[] = {item_name: “abc”, item_quantity : 2, item_price : 1000 } |
Bắt buộc |
Danh sách thông tin sản phẩm trong order |
payment_type_id |
Number |
Không bắt buộc |
ID phương thức thanh toán Xem thêm : API lấy danh sách phương thức thanh toán |
pay_money |
Number |
Bắt buộc |
Số tiền cần thanh toán |
contact_name |
String |
Bắt buộc |
Tên Khách hàng |
contact_mobile |
String |
Tùy chọn |
Số điện thoại KH |
contact_email |
String |
Tùy chọn |
Email KH |
order_id |
String |
Bắt buộc |
Mã đơn hàng của đối tác |
syntax |
String |
Tùy chọn |
Nội dung chuyển khoản |
url_thanks
|
String |
Tùy chọn |
Link trả về kết quả thanh toán khi thành công. Xem thêm: Xử lý kết quả thanh toán trả về |
url_cancel |
String |
Tùy chọn |
Link trả về kết quả thanh toán khi thất bại. Xem thêm: Xử lý kết quả trả về |
Version 1:
Code PHP hàm mã hóa JSON_DATA:
function genLinkPayment($apiKey, $token, $value) {
$serialize = true;
$iv = random_bytes(16);
$cipher = 'AES-256-CBC';
$value = openssl_encrypt(
$serialize ? serialize($value) : $value,
$cipher, $apiKey, 0, $iv
);
$mac = hashMake($iv = base64_encode($iv), $value, $apiKey);
$json = json_encode(compact('iv', 'value', 'mac'));
$link = "https://checkout.vn/checkout?token=$token&datas=". base64_encode($json);
return $link;
}
Version 2
Code PHP hàm mã hóa JSON_DATA:
function genLinkPayment($apiKey, $token, $value)
{
$value = json_encode($value);
if (OPENSSL_VERSION_NUMBER <= 268443727) {
throw new RuntimeException('OpenSSL Version too old, vulnerability to Heartbleed');
}
$iv_size = openssl_cipher_iv_length('aes-256-cbc');
$iv = openssl_random_pseudo_bytes($iv_size);
$ciphertext = openssl_encrypt($value, 'aes-256-cbc', $apikey, OPENSSL_RAW_DATA, $iv);
$ciphertext_hex = bin2hex($ciphertext);
$iv_hex = bin2hex($iv);
$datas = "$iv_hex:$ciphertext_hex";
$link = "https://checkout.vn/checkout?version=2&token=$token&datas=" .$datas;
return $link;
}
Code Nodejs hàm mã hóa JSON_DATA:
const crypto = require('crypto');
const AES_METHOD = 'aes-256-cbc';
const IV_LENGTH = 16; // For AES, this is always 16, checked with php
function genLinkPayment(apiKey, token, value) {
let text = JSON.stringify(value)
if (process.versions.openssl <= '1.0.1f') {
throw new Error('OpenSSL Version too old, vulnerability to Heartbleed')
}
let iv = crypto.randomBytes(IV_LENGTH);
let cipher = crypto.createCipheriv(AES_METHOD, new Buffer(apiKey), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
encrypted = iv.toString('hex') + ':' + encrypted.toString('hex');
return `https://checkout.vn/checkout?version=2&token=${token}&datas=${encrypted}`;
}