Skip to content

Работа с колбеками

При изменении статуса платформа отправляет 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 подпись тела запроса.

Как проверить

  1. Возьми raw body запроса (до парсинга JSON)
  2. Вычисли HMAC-SHA256 от body используя свой secret_key
  3. Сравни результат с заголовком 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']));