Уведомления на Callback Url
Мерчант будет получать на Callback Url уведомления с финальным ответом, содержащим статус транзакции.
На основе этих уведомлений Мерчант должен предоставлять услугу/товар покупателю.
Callback Url - обязательная настройка для каждого проекта открытого в maibmerchants, но можно отправить и в запросе при инициации платежа (параметр callbackUrl).
Чтобы получать уведомления, убедитесь, что ваш сервер разрешает доступ для maib ecomm (IP: 91.250.245.70 / 91.250.245.71).
Уведомление считается обработанной Мерчантом, если в ответ получен HTTP 200 OK статус. Иначе maib ecomm будет повторять попытки переотправки уведомления через такие интервалы времени: 10, 60, 300, 600, 3600, 43200, 86400 секунд.
Уведомления отправляются в виде запросов HTTPS POST с данными в формате JSON.
Пример получения уведомлений по Callback URL (PHP)
<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);
Подпись уведомлении
В уведомлении (финальным ответом) будет присутствовать параметр signature, который содержит подпись для проверки целостности и подлинности данных.
Алгоритм формирования цифровой подписи:
signature = Base64(sha256(Implode(Sort(Params) + SignatureKey, ':'))));
Ключ подписи (Signature Key) доступен после активации Проекта в maibmerchants.
Проверка подписи
Пример уведомления (финальный ответ) на Callbak URL
{
"result": {
"payId": "f16a9006-128a-46bc-8e2a-77a6ee99df75",
"orderId": "123",
"status": "OK",
"statusCode": "000",
"statusMessage": "Approved",
"threeDs": "AUTHENTICATED",
"rrn": "331711380059",
"approval": "327593",
"cardNumber": "510218******1124",
"amount": 10.25,
"currency": "MDL"
},
"signature": "5wHkZvm9lFeXxSeFF0ui2CnAp7pCEFSNmuHYFYJlC0s="
}
Отсортируйте данные из объекта result в соответствии с алфавитным порядком параметров. Пример:
"amount" => 10.25,
"approval" => "327593",
"cardNumber" => "510218******1124",
"currency" => "MDL",
"orderId" => "123",
"payId" => "f16a9006-128a-46bc-8e2a-77a6ee99df75",
"rrn" => "331711380059",
"status" => "OK",
"statusCode" => "000",
"statusMessage" => "Approved",
"threeDs" => "AUTHENTICATED"
Конкатинируйте значения параметров используя знак «:» с добавлением в конце. Пример:
10.25:327593:510218******1124:MDL:123:f16a9006-128a-46bc-8e2a-77a6ee99df75:331711380059:OK:000:Approved:AUTHENTICATED:8508706b-3454-4733-8295-56e617c4abcf
Сгенерируйте хэш с помощью функции SHA256 (). Пример:
e701e466f9bd945797c52785174ba2d829c0a7ba4210548d9ae1d81582650b4b
Конвертируйте полученный хэш в base64. Пример:
5wHkZvm9lFeXxSeFF0ui2CnAp7pCEFSNmuHYFYJlC0s=
Сравните сгенерированную подпись со значением параметра signature из уведомлении, и если они совпадают, подпись будет считаться действительной (полученные данные целостные и подлинные).
Пример проверки подписи (PHP)
<?php
$key = "8508706b-3454-4733-8295-56e617c4abcf"; //Signature Key from Project settings
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if (isset($data['signature'])) {
$data_result = $data['result']; // Data from "result" object
function sortByKeyRecursive(array $array) {
ksort($array, SORT_STRING);
foreach ($array as $key => $value) {
if (is_array($value)) {
$array[$key] = sortByKeyRecursive($value);
}
}
return $array;
}
function implodeRecursive($separator, $array) {
$result = '';
foreach ($array as $item) {
$result .= (is_array($item) ? implodeRecursive($separator, $item) : (string)$item) . $separator;
}
return substr($result, 0, -1);
}
$sortedDataByKeys = sortByKeyRecursive($data_result); //Sort an array by key recursively
$sortedDataByKeys[] = $key; //Add Signature Key to the end of data array
$signString = implodeRecursive(':', $sortedDataByKeys); // Implode array recursively
$sign = base64_encode(hash('sha256', $signString, true)); // Generate signature
if ($sign === $data['signature']) // Compare the generated signature with the received signature on Callback URL
{
echo "Signature is valid!"; // Signature is valid, process the data
} else {
echo "Signature is invalid!"; // Signature is invalid, reject the request
}
}
Last updated