Callbacks (Webhooks)
General information
Validate Callback
X-Coinroute-Signature: request_signatureSignature Validation Example
<?php
// Callback request body
$paramsArray = [
"id" => "a2782316-076c-4a36-bf02-90d109fea9d0",
"price_currency" =>"USD",
"price_currency_ticker" => "USD",
"price_amount" => 645,
"pay_currency" => "USDTTRC20",
"pay_currency_ticker" => "USDT",
"pay_amount" => 128355,
"paid_amount" => 675,
"fee" => 554,
"fee_amount" => 35.733,
"exchange_pair" => "USDUSDT",
"exchange_rate_multiplier" => 199,
"address" => "9MEB6xoV9UfPpeVFnwK0p5RJhHhtBf",
"address_tag" => "hsUPC",
"address_uri" => "usdt_trc20:9MEB6xoV9UfPpeVFnwK0p5RJhHhtBf",
"status" => "created",
"status_context" => "underpaid",
"external_id" => "930",
"customer_external_id" => "094",
"external_data" => null,
"name" => "Prof. Kaia Nienow",
"description" => "Stella Corkery",
"timestamp" => 1677237754
];
// This is a header from callback
$requestSignature = 'd1f9d0365ad1c4651d14bed6a76867bf63babc593077c05395e4d97f9d8db3d0';
// This is your API secret key
$apiSecret = '4J7MA47spxv9yE3qecUNeAqcTCIrdYrJ';
// Let's generate signature by request body and our API secret
$signature = generateSignature($paramsArray, $apiSecret);
if(validateSignature($requestSignature, $signature) === true) {
echo 'Signature is VALID' . PHP_EOL;
} else {
echo 'Signature is NOT VALID' . PHP_EOL;
}
function validateSignature($callbackSignature, $generatedSignature) {
return hash_equals($callbackSignature, $generatedSignature);
}
function generateSignature($params, $secret) {
// Sort recursive by keys
ksortRecursive($params);
// Concat request string recursive
$requestBody = implodeRecursive($params);
// Recieve the hash
return hash_hmac('sha256', $requestBody, $secret);
}
// Helper functions
function ksortRecursive(mixed &$array): void
{
if (!is_array($array)) {
return;
}
ksort($array);
foreach ($array as $k => $v) {
ksortRecursive($array[$k]);
}
}
function implodeRecursive(mixed $array): string
{
$output = '';
foreach ($array as $item) {
if (is_array($item)) {
$output .= implodeRecursive($item);
} else {
$output .= $item;
}
}
return $output;
}Our IPs
Environment
IPs
Retries
Timeouts
Avoid Double-Spending problem
Last updated