Skip to main content

Signature Generation

SNAP API

Signature Generation

Signature digunakan untuk mengautentikasi request yang dikirimkan ke SNAP API. Winpay menggunakan metode keamanan Asymmetric Without Get Token (RSA-SHA256) agar merchant tidak perlu request token tambahan.

Private Key & Public Key

Sebelum dapat menghasilkan signature, merchant harus memiliki RSA private key dan public key. Untuk mendapatkan private key dan public key tersebut merchant bisa generate sendiri atau menggunakan private key dan public key dari situs pihak ketiga seperti: https://cryptotools.net/rsagen.

Rumus Signature

Signature dihasilkan dari data-data yang dikirimkan ke Snap API. Berikut adalah rumus untuk menghasilkan signature:


stringToSign = HTTPMethod +":"+ EndpointUrl +":"+ Lowercase(HexEncode(SHA-256(minify(RequestBody)))) + ":" + TimeStamp
signature = base64_encode(SHA256withRSA(private_key, stringToSign))

Source Code Pembuatan Signature

$httpMethod = 'POST';
$endpointUrl = '/v1.0/transfer-va/create-va';
$timestamp = '2023-09-19T12:11:14+07:00';
$payload = '
{
"customerNo": "08123456789",
"virtualAccountName": "CHUS PANDI",
"trxId": "INV-000000001",
"totalAmount": {
"value": "10000.00",
"currency": "IDR"
},
"virtualAccountTrxType": "c",
"expiredDate": "2023-11-02T17:18:48+07:00",
"additionalInfo": {
"channel": "BSI"
}
}
';

$body = json_decode($payload);
$hashedBody = strtolower(bin2hex(hash('sha256', json_encode($body, JSON_UNESCAPED_SLASHES), true)));

$stringToSign = [
$httpMethod,
$endpointUrl,
$hashedBody,
$timestamp
];

$signature = '';
$stringToSign = implode(':', $stringToSign);

$privKey = openssl_get_privatekey('./your-private-key-file.pem');
openssl_sign($stringToSign, $signature, $privKey, OPENSSL_ALGO_SHA256);
$encodedSignature = base64_encode($signature);
echo 'Your Signature:' $encodedSignature.