Skip to content
DevelopersSignature

Kiểm tra dữ liệu với signature

Signature là một chuỗi ký tự dùng để kiểm tra tính toàn vẹn dữ liệu trong việc truyền dữ liệu giữa hệ thống của bạn và SimplifyTrip. Được tạo ra khi kết hợp Checksum Key và các trường data tương ứng với mỗi API.

Mỗi khi bạn nhận được dữ liệu từ SimplifyTrip bạn nên kiểm tra signature để chắc chắn dữ liệu bạn nhận được đúng với thông tin mà hệ thống SimplifyTrip trả về.

Thử nghiệm với Trình tạo Signature

Cách tạo signature

  • SimplifyTrip tạo chữ ký bằng mã xác thực tin nhắn dựa trên hàm băm (HMAC), Sử dụng thuật toán SHA-256 để tạo signature.
  • Data tạo signature dạng: key1=value1&key2=value2… (key1: tên field, value1 = giá trị của key1).
  • Dữ liệu tạo signature sắp xếp theo key thứ tự alphabet.
  • Cấu trúc: hash_hmac("sha256", data , checksum_key)
💡

Lưu ý Checksum Key được tạo ra sau khi tạo Api key thành công, bạn có thể đặt lại Checksum Key bất kỳ khi nào bạn cảm thấy thông tin của mình đã bị lộ không mong muốn.

Code mẫu kiểm tra chính xác dữ liệu

Nodejs
PHP
Python
Java

_89
import { createHmac } from "crypto";
_89
_89
const checksumKey = "ck_test_xxxxxxxxxxxxxxxxxxxxxxxx";
_89
const signature = "412e915d2871504ed31be63c8f62a149a4410d34c4c42affc9006ef9917eaa03";
_89
const webhookData = {
_89
"id": "6740ce7f9d042322159bc6401",
_89
"type": "PURCHASE_ORDER_SUCCESS",
_89
"sentDate": "2024-11-24T17:42:31.424Z",
_89
"createdAt": "2024-11-24T17:42:31.424Z",
_89
"mode": "TEST_MODE",
_89
"data": {
_89
"orderId": "3248417841",
_89
"trackId": "06c08ae1-bfac-4f77-1213-a92f53bb15dd",
_89
"status": "SUCCESS",
_89
"items": [
_89
{
_89
"subOrderId": "674362a97cbd7ef05bc12786",
_89
"subTrackId": "62137526-5b53-475f-4333-4c1e83e13a28",
_89
"sku": "EAS5XY01GB04DPY",
_89
"quantity": 2,
_89
"type": "eSIM",
_89
"status": "SUCCESS",
_89
"eSims": [
_89
{
_89
"qrCodeContent": "LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916",
_89
"qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_89
"iccid": "89812003916820391469",
_89
"planAPN": "plus.4g",
_89
"smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_89
"pin": "1234",
_89
"puk": "15095300",
_89
"activationCode": "502F97EF09144E0C9D62FD781E256862"
_89
},
_89
{
_89
"qrCodeContent": "LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916",
_89
"qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_89
"iccid": "89812003916820396627",
_89
"planAPN": "plus.4g",
_89
"smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_89
"pin": "1234",
_89
"puk": "15095300",
_89
"activationCode": "502F97EF09144E0C9D62FD781E253495"
_89
}
_89
]
_89
}
_89
]
_89
},
_89
};
_89
_89
function deepFlattenToObject(obj, prefix = '') {
_89
return Object.keys(obj).reduce((acc, k) => {
_89
const pre = prefix.length ? prefix + '_' : '';
_89
if (typeof obj[k] === 'object' && obj[k] !== null) {
_89
Object.assign(acc, deepFlattenToObject(obj[k], pre + k));
_89
} else {
_89
acc[pre + k] = obj[k];
_89
}
_89
return acc;
_89
}, {});
_89
}
_89
_89
function convertObjToQueryStr(object) {
_89
const flatObj = deepFlattenToObject(object);
_89
_89
return Object.keys(flatObj)
_89
.sort()
_89
.filter((key) => flatObj[key] !== undefined)
_89
.map((key) => {
_89
let value = flatObj[key];
_89
// Set empty string if null
_89
if ([null, undefined, "undefined", "null"].includes(value)) {
_89
value = "";
_89
}
_89
_89
return `${key}=${value}`;
_89
})
_89
.join("&");
_89
}
_89
_89
function isValidData(data, currentSignature, checksumKey) {
_89
const dataQueryStr = convertObjToQueryStr(data);
_89
const dataToSignature = createHmac("sha256", checksumKey)
_89
.update(dataQueryStr)
_89
.digest("hex");
_89
_89
return dataToSignature == currentSignature;
_89
}
_89
_89
return isValidData(webhookData, signature, checksumKey);

Ví dụ

Dữ liệu đầu vào


_44
{
_44
"id": "674365871128ac4edea31a80",
_44
"sentDate": "2024-11-24T17:42:31.424Z",
_44
"createdAt": "2024-11-24T17:42:31.424Z",
_44
"mode": "TEST_MODE",
_44
"type": "PURCHASE_ORDER_SUCCESS",
_44
"data": {
_44
"orderId": "1544114530",
_44
"trackId": "06c08ae1-bfac-4f77-1213-a92f53bb15dd",
_44
"status": "SUCCESS",
_44
"items": [
_44
{
_44
"subOrderId": "674365621128ac4edea31a7f",
_44
"subTrackId": "62137526-5b53-475f-4333-4c1e83e13a28",
_44
"sku": "EAS5XY01GB04DPY",
_44
"quantity": 2,
_44
"type": "eSIM",
_44
"status": "SUCCESS",
_44
"eSims": [
_44
{
_44
"qrCodeContent": "LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916",
_44
"qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_44
"iccid": "89812003916820391303",
_44
"planAPN": "plus.4g",
_44
"smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_44
"pin": "1234",
_44
"puk": "15095300",
_44
"activationCode": "502F97EF09144E0C9D62FD781E253943"
_44
},
_44
{
_44
"qrCodeContent": "LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916",
_44
"qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_44
"iccid": "89812003916820393632",
_44
"planAPN": "plus.4g",
_44
"smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_44
"pin": "1234",
_44
"puk": "15095300",
_44
"activationCode": "502F97EF09144E0C9D62FD781E257597"
_44
}
_44
]
_44
}
_44
]
_44
}
_44
}

Sau khi đã flat thành Object chỉ có một cấp


_30
{
_30
"id": "674365871128ac4edea31a80",
_30
"sentDate": "2024-11-24T17:42:31.424Z",
_30
"createdAt": "2024-11-24T17:42:31.424Z",
_30
"mode": "TEST_MODE",
_30
"type": "PURCHASE_ORDER_SUCCESS",
_30
"data_orderId": "1544114530",
_30
"data_trackId": "06c08ae1-bfac-4f77-1213-a92f53bb15dd",
_30
"data_status": "SUCCESS",
_30
"data_items_0_subOrderId": "674365621128ac4edea31a7f",
_30
"data_items_0_subTrackId": "62137526-5b53-475f-4333-4c1e83e13a28",
_30
"data_items_0_sku": "EAS5XY01GB04DPY",
_30
"data_items_0_quantity": 2,
_30
"data_items_0_type": "eSIM",
_30
"data_items_0_status": "SUCCESS",
_30
"data_items_0_eSims_0_qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_30
"data_items_0_eSims_0_iccid": "89812003916820391303",
_30
"data_items_0_eSims_0_planAPN": "plus.4g",
_30
"data_items_0_eSims_0_smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_30
"data_items_0_eSims_0_pin": "1234",
_30
"data_items_0_eSims_0_puk": "15095300",
_30
"data_items_0_eSims_0_activationCode": "502F97EF09144E0C9D62FD781E253943",
_30
"data_items_0_eSims_1_qrCodeImg": "https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png",
_30
"data_items_0_eSims_1_iccid": "89812003916820393632",
_30
"data_items_0_eSims_1_planAPN": "plus.4g",
_30
"data_items_0_eSims_1_smdpAddress": "SECSMSMINIAPP.EASTCOMPEACE.COM",
_30
"data_items_0_eSims_1_pin": "1234",
_30
"data_items_0_eSims_1_puk": "15095300",
_30
"data_items_0_eSims_1_activationCode": "502F97EF09144E0C9D62FD781E257597"
_30
}

Sắp xếp các trường thuộc tính theo alphabet và chuyển thành chuỗi


_10
"createdAt=2024-11-24T17:42:31.424Z&data_items_0_eSims_0_activationCode=502F97EF09144E0C9D62FD781E253943&data_items_0_eSims_0_iccid=89812003916820391303&data_items_0_eSims_0_pin=1234&data_items_0_eSims_0_planAPN=plus.4g&data_items_0_eSims_0_puk=15095300&data_items_0_eSims_0_qrCodeContent=LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916&data_items_0_eSims_0_qrCodeImg=https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png&data_items_0_eSims_0_smdpAddress=SECSMSMINIAPP.EASTCOMPEACE.COM&data_items_0_eSims_1_activationCode=502F97EF09144E0C9D62FD781E257597&data_items_0_eSims_1_iccid=89812003916820393632&data_items_0_eSims_1_pin=1234&data_items_0_eSims_1_planAPN=plus.4g&data_items_0_eSims_1_puk=15095300&data_items_0_eSims_1_qrCodeContent=LPA:1$SECSMSMINIAPP.EASTCOMPEACE.COM$502F97EF09144E0C9D62FD781E259916&data_items_0_eSims_1_qrCodeImg=https://simplify-trip.s3.ap-southeast-1.amazonaws.com/a11dd3c438f38f5383fa17c8ea2de3ef.png&data_items_0_eSims_1_smdpAddress=SECSMSMINIAPP.EASTCOMPEACE.COM&data_items_0_quantity=2&data_items_0_sku=EAS5XY01GB04DPY&data_items_0_status=SUCCESS&data_items_0_subOrderId=674365621128ac4edea31a7f&data_items_0_subTrackId=62137526-5b53-475f-4333-4c1e83e13a28&data_items_0_type=eSIM&data_orderId=1544114530&data_status=SUCCESS&data_trackId=06c08ae1-bfac-4f77-1213-a92f53bb15dd&id=674365871128ac4edea31a80&mode=TEST_MODE&sentDate=2024-11-24T17:42:31.424Z&type=PURCHASE_ORDER_SUCCESS"

Bắt đầu tạo signature

Thử nghiệm với Trình tạo Signature