Also available: English version
-
Secret Proof: Секретный пароль, который должен знать только сервер monobank;
-
Ответ: JSON сериализированный вывод с
Content-Type: application/json
и кодом ответа200 OK
; -
%METHOD% /%resource% Monobank Request: HTTP %METHOD% (GET|POST|...) запрос к https://api.monobank.ua/%resource% ->
POST /personal/auth/request Monobank Request
. См. Отправка запросов в Monobank; -
Закрытый ключ: Сгенерированный OpenSSL ключ;
-
Публичный ключ: Открытый ключ, который был извлечен из Закрытого ключа, был передан команде Monobank при настройке корпоративного API;
-
Key-ID: Сериализированное представление Публичного ключа, хэшированное с помощью sha1 (в hex формате). Получается от команды Monobank;
-
Webhook Endpoint: Обработчик вашего сервера, который принимает запросы с событиями от сервера Monobank;
-
Webhook Request: Запрос с входящими данными типа
application/json
, который принимается зарегистрированным Webhook Endpoint;
API Monobank чувствителен к HTTP методу
Корнем для Monobank API является https://api.monobank.ua.
Header | Содержимое | Описание |
---|---|---|
X-Time | Unix timestamp | php time() |
X-Sign | Подпись | см. Подпись запроса |
X-Key-Id | Key-ID | См. Обозначения |
X-Token | Monobank token | Если таковой есть |
Не путать подпись с шифрованием
Строка подписи состоит из трёх ингредиентов:
- Отметка времени (unix timestamp), которая используется в заголовке запроса X-Time
- X-Request-Id, если не указано иное. В дальнейшем упоминается как Второй ингредиент подписи
- Название метода - /%resource% (например
/personal/client-info
)
/personal/auth/request
: разрешения токена (например,sp
)/personal/corp/webhook
,/personal/corp/webhook
: пустая строка
Строка подписи представляет собой конкатенацию всех ингредиентов ($ing1.$ing2.$ing3
для PHP, ${ing1}${ing2}${ing3}
или ing1+ing2+ing3
для JavaScript)
- Сделайте подпись с помощью OpenSSL или его аналогов, используя следующие параметры:
Свойство | Значение |
---|---|
Алгоритм | SHA256 |
Ключ | Ваш закрытый ключ |
-
Перекодируйте подпись с помощью Base64
-
Передайте полученную строку в заголовке X-Sign
$key = openssl_get_privatekey("file://private.key", "");
$str = $time.$t.$url;
openssl_sign($str, $sig, $key, OPENSSL_ALGO_SHA256);
openssl_free_key($key);
return base64_encode($sig);
import base64
import ecdsa
...
data = (timestamp + permissions + url).encode('utf-8')
sign = PrivateSigningKey.sign(data, hashfunc=hashlib.sha256)
signB64 = base64.b64encode(sign)
См. https://github.com/shal/mono
Убедитесь, что путь к webhook-у остаётся в тайне
- Формат входных данных:
{
"type": "StatementItem",
"data": {
"account": Account.id,
"statementItem": <StatementItem>
}
}
- 2-й ингредиент подписи пуст.
- Тело запроса
{"webHookUrl": "%webhook%"}
, где%webhook%
- URL вашего Webhook Endpoint. - Ответ пустой
- 2-й ингредиент подписи пуст
- Сервер генерирует уникальный %token% для пользователя и секретный %proof%, который должен знать только monobank.
- Создайте обработчик, который будет получать %proof% и %token% в качестве GET параметров или в uri (например,
/webhook/%token%/%proof%
или/webhook?token=%token%&proof=%proof%
). Это будет ваш %webhook%. - POST /personal/auth/request Monobank Request: Headers(X-Callback: %webhook%; X-Permissions: %permissions%)
- %webhook% - ваш webhook обработчик для получения токена от monobank
- %permissions%:
Список прав, которые сервис хочет получить (1 буква на 1 разрешение). Список возможных прав:
s - выписка (включает баланс и саму выписку)
p - личная информация (имя и фамилия).
например, X-Permissions: sp
- Получите %requestId% из ответа
{"tokenRequestId": "***"}
и Auth URL %url%{"acceptUrl": "***"}
- Верните ошибку, если запрос прошел неправильно
- Сгенерируйте QR-код из Auth URL (Например, используя Google Charts API).
- Покажите QR-код/откройте ссылку на стороне клиента, чтобы пользователь открыл приложение monobank и смог подтвердить запрос на вход.
- Как только пользователь одобрит запрос на вход, вы получите входящий запрос на webhook с токеном пользователя Monobank в заголовке
X-Request-Id
(может быть такжеx-request-id
). - Проверьте, соответствуют ли %proof% и %token% друг другу, иначе запрос невалиден
- Создайте ассоциацию токена пользователя Monobank с вашим пользователем через ваш собственный %token%, но не используйте оригинальный токен пользователя Monobank как идентификатор пользователя.
- Предыдущие токены перестают работать, когда вы создаете новый, поэтому вам следует либо создать собственную систему учетных записей пользователей, либо обновить токен monobank во всех старых сессиях, запросив и сохранив clientId из /client-info на этапе 10.