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

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

Ví dụ

Dữ liệu đầu vào


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

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


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

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


_10
"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_subOrderId=674365621128ac4edea31a7f&data_items_0_subTrackId=62137526-5b53-475f-4333-4c1e83e13a28&data_items_0_type=eSIM&data_orderId=1544114530&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