# Підписи й Base64

Сторонні сервіси часто підписують свої запити або чекають підпису від вас, а дані передають у Base64. Для цього в коді є три функції.

## hash_hmac

```js
hash_hmac(algo, text, key, format)
```

Обчислює підпис HMAC від тексту за секретним ключем.

| Параметр | Тип | Що передати |
|---|---|---|
| `algo` | Рядок | Алгоритм: `'md5'`, `'sha1'`, `'sha256'`, `'sha512'` або `'md4'` |
| `text` | Рядок | Що підписати |
| `key` | Рядок | Секретний ключ |
| `format` | Рядок, необов'язково | `'base64'` — результат у Base64. Без параметра — у шістнадцятковому вигляді малими літерами |

**Повертає** підпис рядком. Якщо `algo`, `text` або `key` порожні, повертає `undefined`.

> [!WARNING]
> Передавайте лише алгоритми зі списку. З іншою назвою, наприклад `'sha3'`, функція викине помилку `TypeError: hash_hmac: unsupported algorithm "sha3"…`. Якщо не перехопити її через `try...catch`, код зупиниться з цією помилкою.

Перевірити підпис вхідного запиту: сервіс магазину надсилає його в заголовку `X-Signature`, а секретний ключ зберігається в глобальній змінній бота.

```js
var secret = getGlobalVariable('ключ_магазину');
var expected = hash_hmac('sha256', request.body, secret);

if (expected !== request.headers['x-signature']) {
    throw new Error('Неправильний підпис');
}

if (setContactById(request.data.contact_id)) {
    setContactVariable('статус_замовлення', request.data.status);
}
```

Якщо підпис не збігся, код зупиниться, і блок відповість на запит кодом `422`.

## base64_encode

```js
base64_encode(text)
```

Кодує текст у Base64.

| Параметр | Тип | Що передати |
|---|---|---|
| `text` | Рядок | Що закодувати. Кириличні літери кодуються в UTF-8 |

**Повертає** рядок у Base64.

```js
var auth = 'Basic ' + base64_encode('flowers:secret-password');
```

## base64_decode

```js
base64_decode(text)
```

Розкодовує рядок із Base64.

| Параметр | Тип | Що передати |
|---|---|---|
| `text` | Рядок | Рядок у стандартному Base64 |

**Повертає** розкодований текст або `undefined`, якщо рядок — не Base64.

```js
var payload = base64_decode(request.data.payload);
var order = payload ? JSON.parse(payload) : null;
```
