# Проверка подписи

> Вставьте тело запроса или тело вебхука. Эта страница вычисляет подпись шаг за шагом так же, как Cryptomus, сравнивает каждый шаг с вашим и отмечает первое отличие. Всё выполняется в вашем браузере: эта страница вообще не может отправлять сетевые запросы, поэтому ваш API key никогда не покидает ваш компьютер.
>
> HTML: https://blockwallets.io/docs/sign?lang=ru · English: https://blockwallets.io/docs/sign.md?lang=en

## Подпись запроса (вы вызываете наш API)

1. Подписываемый текст — в точности то тело запроса, которое вы отправляете, байт в байт (включая пробелы, переводы строк и экранирование).
2. base64 от его UTF-8 байтов.
3. sign = md5(шаг 2 + API key), отправляется в заголовке `sign`; заголовок `merchant` содержит UUID продавца.

При неверной подписи API возвращает 401, а `debug.body_base64` в ответе — это шаг 2, вычисленный по телу, которое мы получили, готовый для сравнения с вашим.

## Подпись вебхука (мы вызываем ваш URL вебхука)

1. Уберите поле `sign` и закодируйте остальное так же, как PHP `json_encode`: компактно, `/` экранируется как `\/`, не-ASCII символы сохраняются.
2. base64 от UTF-8 байтов шага 1.
3. md5(шаг 2 + API key) должно совпасть с `sign`. Используйте API key того же режима (Live / Test), что и merchant.

## Частые причины

- API key другого режима или уже заменённый.
- Фреймворк сериализовал тело заново (форматирование, порядок ключей, формат чисел); проверяйте по исходному телу, которое вы получили.
- `/` не экранирован как `\/` при повторном кодировании вебхука.

Проверка полностью выполняется в вашем браузере, страница не может отправлять сетевые запросы, поэтому ваш API key никогда не покидает ваш компьютер. Примеры кода проверки: https://blockwallets.io/docs/cryptomus?lang=ru#verify
