Работа с колбеками
При изменении статуса платформа отправляет POST запрос идентичный ответу по при создании сделки.
URL для колбека задается двумя путями:
1. В личном кабинете
2. При создании сделки можно указать callback_url
При наличии обоих значений приоритет будет отдан callback_url из запроса
В независимости от способа задачи ссылки, на этот адрес будет отправлен POST запрос идентичный ответу по при создании сделки:
{
"id": "50e3657f-fbd6-4df1-98b3-26386187e651",
"external_id": "194459774",
"merchant_id": "359172f8-d800-49c7-b59e-d9a041719cef",
"state": "confirmed",
"kind": "deposit",
"amount_cents": 151300,
"amount_currency": "RUB",
"payment_bill_url": nil,
"percent": 9.5,
"exchange_rate": 104.92,
"payment_data": {
"name": "Почуйко Иван",
"number": "2202208377731111",
"bank_name": "Сбербанк",
"url": "https://test.net/payment/50e3657f-fbd6-4df1-98b3-26386187e651"
}
}
Верификация подписи входящего callback
Каждый callback содержит заголовок Signature — HMAC-SHA256 подпись тела запроса.
Как проверить
- Возьми raw body запроса (до парсинга JSON)
- Вычисли HMAC-SHA256 от body используя свой
secret_key - Сравни результат с заголовком
Signature
PHP
$signature = hash_hmac('sha256', file_get_contents('php://input'), $secretKey);
$isValid = hash_equals($signature, $request->header('Signature'));
Python
import hmac, hashlib
signature = hmac.new(secret_key.encode(), raw_body, hashlib.sha256).hexdigest()
is_valid = hmac.compare_digest(signature, request.headers['Signature'])
Node.js
const crypto = require('crypto');
const signature = crypto.createHmac('sha256', secretKey).update(rawBody).digest('hex');
const isValid = crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(req.headers['signature']));