> For the complete documentation index, see [llms.txt](https://docs.maibmerchants.md/e-commerce/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.maibmerchants.md/e-commerce/ro/notificari-pe-callback-url.md).

# 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 / 91.250.245.142**).

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
<?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:&#x20;

```
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:

```json
{
"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:

```json
"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"
```

2. Concatenați valorile parametrilor folosind caracterul "**:**" și adăugarea [***Signature Key***](#user-content-fn-1)[^1] la sfîrșitul șirului. Exemplu:

{% code overflow="wrap" %}

```
10.25:327593:510218******1124:MDL:123:f16a9006-128a-46bc-8e2a-77a6ee99df75:331711380059:OK:000:Approved:AUTHENTICATED:8508706b-3454-4733-8295-56e617c4abcf
```

{% endcode %}

3. Generați hash-ul acestui șir folosind funcția ***SHA256*** ([binary format](#user-content-fn-2)[^2]). Exemplu:

```
e701e466f9bd945797c52785174ba2d829c0a7ba4210548d9ae1d81582650b4b
```

4. Codificați hash-ul primit în ***base64***. Exemplu:

```
5wHkZvm9lFeXxSeFF0ui2CnAp7pCEFSNmuHYFYJlC0s=
```

5. 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).&#x20;

### Exemplu validare semnătură (PHP)

```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
}
}
```

[^1]: Din setările Proiectului în ***maibmerchants.***

[^2]: Atenţie! Asigurați-vă că funcția dvs. hash returnează în format binar, nu în HEX.
