Hướng dẫn tích hợp cổng thanh toán

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

URL Thanh toán là địa chỉ URL mang thông tin thanh toán

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:

  • TOKEN: Lấy giá trị Token (Api token) tại đây
  • JSON_DATA: Chứa thông tin giao dịch 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

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ề

 

Ví dụ hàm mã hóa

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}`;
  
}