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 :

  1. 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
  2. Lakukan HMACSHA256 pada baris tersebut dengan menggunakan Signature Secret sebagai key.
  3. 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;
?>