# Подписи и 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;
```
