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="
}
  1. 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"
  1. 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
  1. Generați hash-ul acestui șir folosind funcția SHA256 (). Exemplu:

e701e466f9bd945797c52785174ba2d829c0a7ba4210548d9ae1d81582650b4b
  1. Codificați hash-ul primit în base64. Exemplu:

5wHkZvm9lFeXxSeFF0ui2CnAp7pCEFSNmuHYFYJlC0s=
  1. 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