1. События
| type | Когда |
|---|---|
payment.succeeded | Платёж оплачен |
payment.failed | Оплата отклонена |
payment.expired | Истёк срок оплаты |
payment.cancelled | Платёж отменён через API |
payout.processing | Вывод принят провайдером |
payout.succeeded / payout.failed | Вывод исполнен / не исполнен |
payout.unknown | Статус вывода уточняется |
test.ping | Тестовое событие |
2. Тело запроса
json
{
"id": "evt_01k7x5…",
"type": "payment.succeeded",
"environment": "sandbox",
"created_at": "2026-10-14T12:03:13.000Z",
"data": { "id": "pay_01k7x3m9qz2hb8c4r6t1vw5yfe", "object": "payment", "status": "SUCCEEDED", "amount": 1000000, … }
}3. Подпись
| Key | Value |
|---|---|
| X-LC-Event-Id | ID события — обрабатывайте идемпотентно |
| X-LC-Event-Type | Тип события |
| X-LC-Timestamp | Unix-время отправки |
| X-LC-Signature | v1=HEX(HMAC_SHA256(secret, timestamp + "." + body)) |
Проверяйте подпись по сырому телу запроса и отклоняйте события старше 5 минут. Секрет — в кабинете, разный для Sandbox и Production.
Node.js
import crypto from "node:crypto";
export function verify(rawBody, headers, secret) {
const ts = Number(headers["x-lc-timestamp"]);
if (Math.abs(Date.now() / 1000 - ts) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
const got = String(headers["x-lc-signature"] || "").replace(/^v1=/, "");
return expected.length === got.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(got));
}Python
import hmac, hashlib, time
def verify(raw_body: bytes, headers, secret: str) -> bool:
ts = int(headers["X-LC-Timestamp"])
if abs(time.time() - ts) > 300:
return False
expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, headers["X-LC-Signature"].removeprefix("v1="))4. Повторы
Ответьте 2xx в течение 10 секунд. Иначе доставка повторится до 8 раз: через 30 с, 2 мин, 10 мин, 30 мин, 1 ч, 3 ч, 6 ч. Адреса во внутренних сетях не принимаются, в Production — только HTTPS.