Notificări pe Callback URL
Merchant-ul va primi pe Callback URL notificări cu răspunsul final ce conține starea tranzacției.
În baza acestor notificări, Merchant-ul trebuie sa furnizeze serviciul/produsul Cumpărătorului.
Callback URL este o setare obligatorie pentru fiecare proiect deschis în maibmerchants, însă poate fi transmis și în request la inițierea unei plăți (parametrul callbackUrl).
Pentru a primi notificări pe Callback URL, asigurați-vă că serverul dvs. poate fi accesat de către maib ecomm (IP: 91.250.245.70 / 91.250.245.71).
Se consideră că notificarea a fost recepționată dacă maib ecomm primește răspuns cu codul de stare HTTP 200 OK. În caz contrar maib ecomm va încerca retrimiterea notificării la următoarele intervale de timp: 10, 60, 300, 600, 3600, 43200, 86400 secunde.
Exemplu recepționare notificări pe Callback URL (PHP)
<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);
Semnătura notificării
În notificările de pe Callback URL va fi prezent parametrul signature pentru a verifica integritatea și autenticitatea datelor.
Algoritmul formării semnăturii:
signature = Base64(sha256(Implode(Sort(Params) + SignatureKey, ':'))));
Cheia semnăturii (Signature Key) este disponibilă după activarea Proiectului în maibmerchants.
Exemplu de validare a semnăturii
Exemplu de notificare (răspuns final) pe Callback 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="
}
Sortați datele din obiectul result conform ordinii alfabetice a parametrilor. Exemplu:
"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"
Concatenați valorile parametrilor folosind caracterul ":" și adăugarea la sfîrșitul șirului. Exemplu:
10.25:327593:510218******1124:MDL:123:f16a9006-128a-46bc-8e2a-77a6ee99df75:331711380059:OK:000:Approved:AUTHENTICATED:8508706b-3454-4733-8295-56e617c4abcf
Generați hash-ul acestui șir folosind funcția SHA256 (). Exemplu:
e701e466f9bd945797c52785174ba2d829c0a7ba4210548d9ae1d81582650b4b
Codificați hash-ul primit în base64. Exemplu:
5wHkZvm9lFeXxSeFF0ui2CnAp7pCEFSNmuHYFYJlC0s=
Comparați semnătura generată cu valoarea parametrului signature din notificare și în cazul în care ele coincid semnătura se va considera validă (datele primite sunt autentice și integre).
Exemplu validare semnătură (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