Открыть бота
Документация / Вебхуки

Вебхуки

Kivix Pay сам сообщает вашему серверу о событиях — например, что счёт оплачен. Не нужно опрашивать API.

Настройка

Задайте HTTPS-адрес в боте (Kivix Pay → приложение → 🔗 Webhook) или через API, затем пришлите тестовое событие:

pay.webhook.set("https://shop.example/kivix")
pay.webhook.test()   # придёт событие webhook.test
GET/v1/webhook— адрес и статистика доставок
PUT/v1/webhook— {"url": "https://…"}
DELETE/v1/webhook— отключить
POST/v1/webhook/test— прислать webhook.test

Адрес — только HTTPS на порту 443, без логина в URL, не локальный и не во внутренней сети.

События

{
  "id": "Qm3xR8vLp2KdT6wZ0c",
  "object": "event",
  "type": "invoice.paid",
  "created_at": "2026-10-26T12:31:05Z",
  "data": { "invoice": { /* объект счёта, status = "paid" */ } }
}
СобытиеКогда
invoice.paidСчёт оплачен — выдавайте товар
webhook.testПроверка из POST /v1/webhook/test

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

Заголовок Kivix-Signature: t=1761481865,v1=5f2c…, где v1 = HMAC-SHA256(секрет вебхуков, t + "." + тело_запроса) в hex. Берите тело как пришло, до разбора JSON, и отклоняйте запросы старше 5 минут. С SDK — одна строка:

from kivix_pay import construct_event, SignatureVerificationError

@app.post("/kivix")                      # Flask
def kivix_webhook():
    try:
        event = construct_event(request.get_data(), request.headers.get("Kivix-Signature"), WEBHOOK_SECRET)
    except SignatureVerificationError:
        return "", 400
    if event.type == "invoice.paid":
        fulfill(event.data.invoice.order_id)
    return "", 200

Без SDK

import hashlib, hmac, time

def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(item.split("=", 1) for item in header.split(","))
    timestamp, signature = parts.get("t", ""), parts.get("v1", "")
    if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

Доставка и повторы

ЗаголовокЗначение
Kivix-Signaturet=<unix>,v1=<hex>
Kivix-Event-Idid события
Kivix-Event-Typeтип события, например invoice.paid