Signature di API Accurate Online
Pada setiap komunikasi API Accurate Online selain proses OAuth, perlu disertakan signature yang dikirimkan sebagai parameter sign di HTTP POST.
Berikut adalah proses pembuatan Signature secara garis besar :
- Untuk semua parameter yang akan dikirimkan, deretkan nama dan nilainya menjadi satu baris panjang dengan format NAMA1=NILAI1&NAMA2=NILAI2&NAMA3=NILAI3…
- Pastikan parameter dideretkan secara berurutkan secara alfabet berdasarkan nama parameternya.
- Pastikan nilai parameter telah di String Trim (hapus spasi di awal dan akhir nilai)
- Pastikan nama dan nilai parameter telah di URL Encode
- Hilangkan parameter dengan nilai kosong
- Lakukan HMACSHA256 pada baris tersebut dengan menggunakan Signature Secret sebagai key.
- Jika hasil adalah data binary, lakukan Base64 Encode agar berubah menjadi data tulisan string.
Contoh proses pembuatan signature
Misalkan Kita ingin menyimpan data Pemasok (Vendor) ke dalam Accurate Online. Kita dapat melakukan hal tersebut lewat API /vendor/save dengan mengirimkan parameter-parameter berikut :
Nama | Nilai |
---|---|
vendorNo | 123456 |
name | Pemasok Umum |
detailContact[0].name | John Doe |
detailContact[0].email | john@example.com |
notes | |
_ts | 2014-10-07T06:01:09Z |
Untuk membuat signature dari penggunaan API ini, pertama Kita pastikan parameter berurut secara alfabet berdasarkan namanya
Nama | Nilai |
---|---|
_ts | 2014-10-07T06:01:09Z |
detailContact[0].email | john@example.com |
detailContact[0].name | John Doe |
name | Pemasok Umum |
notes | |
vendorNo | 123456 |
Lalu lakukan String Trim pada nilai, dan lakukan URL Encode pada nama dan nilai parameter
Nama | Nilai |
---|---|
_ts | 2014-10-07T06%3A01%3A09Z |
detailContact%5B0%5D.email | john%40example.com |
detailContact%5B0%5D.name | John%20Doe |
name | Pemasok%20Umum |
notes | |
vendorNo | 123456 |
* Perhatikan karakter SPACE menjadi %20 saat dilakukan URL encode.
** Beberapa library menggunakan karakter PLUS (+) sebagai pengganti SPACE, hal ini harus dihindari karena akan mengakibatkan Sign yang dihasilkan tidak tepat.
Hilangkan parameter dengan nilai kosong
Nama | Nilai |
---|---|
_ts | 2014-10-07T06%3A01%3A09Z |
detailContact%5B0%5D.email | john%40example.com |
detailContact%5B0%5D.name | John%20Doe |
name | Pemasok%20Umum |
vendorNo | 123456 |
Deretkan parameter menjadi satu baris
_ts=2014-10-07T06%3A01%3A09Z&detailContact%5B0%5D.email=john%40example.com&detailContact%5B0%5D.name=John%20Doe&name=Pemasok%20Umum&vendorNo=123456 |
Lakukan HMACSHA256 dengan menggunakan Signature Secret sebagai KEY dan lakukan Base64 Encode agar menjadi data tulisan string
Signature Secret | 268a1a7fbd0002ccf353d336982a11fe |
Hasil HMACSHA256 | 4ALzkZKsN7N06HZaiuflDV0PLZ8fZhuKMeD4ilm4n9g= |
Maka nilai signature di parameter sign adalah 4ALzkZKsN7N06HZaiuflDV0
PLZ8fZhuKMeD4ilm4n9g=
Contoh dalam bahasa pemrograman
Berikut adalah contoh proses pembuatan signature dengan bahasa pemograman PHP
<?php
$parameter = [];
$parameter['vendorNo'] = '123456';
$parameter['name'] = 'Pemasok Umum';
$parameter['detailContact[0].name'] = 'John Doe';
$parameter['detailContact[0].email'] = 'john@example.com';
$parameter['notes'] = '';
$parameter['_ts'] = '2014-10-07T06:01:09Z';
// Urutkan berdasarkan nama
ksort($parameter);
// Trim bagian nilai
$parameter = array_map('trim', $parameter);
// Deretkan menjadi satu baris
$data = '';
foreach ( $parameter as $nama => $nilai ) {
// Abaikan nilai kosong
if ($nilai == '') {
continue;
}
if ($data != '') {
$data .= '&';
}
// URL Encode pada nama dan nilai
$data .= rawurlencode($nama) . '=' . rawurlencode($nilai);
}
// Lakukan HMACSHA256
$signatureSecretKey = "268a1a7fbd0002ccf353d336982a11fe";
$hash = hash_hmac('sha256', $data, $signatureSecretKey, true );
$signature = base64_encode($hash);
// Hasil Signature
echo $signature;
?>