Qut Pay Сайт Кабинет Білім базасы Нұсқаулықтар API құжаттамасы ҚАЗРУС
Басты бетБілім базасы → Анықтамалық

Webhook баптау

Жаңартылды: 2026-09-14 · Markdown нұсқасы

Қысқаша

Webhook — счёттың күйі өзгергенде біз сіздің серверіңізге жіберетін HTTP сұрау. Оны қосу үшін кабинеттің Интеграциялар бөліміне барып, өз адресіңізді қосасыз: https://qut.kz/app

Продакшенде адрес тек https және нақты домен болуы керек. IP адрес, localhost және уақытша туннель адрестері қабылданбайды. Құпия (secret) бір рет көрсетіледі — сол сәтте көшіріп алыңыз.

Адресіңіз авторизациясыз ашық болуы тиіс: біз қарапайым сыртқы клиент ретінде келеміз, логин мен пароль жібермейміз.

Адрес қосу

  1. Кабинетке кіріңіз: https://qut.kz/app
  2. Интеграциялар бөліміне өтіңіз.
  3. Webhook адресін қосыңыз — толық жол, мысалы https://site.kz/qutpay-webhook.
  4. Керекті оқиғаларды белгілеңіз.
  5. Көрсетілген құпияны көшіріп, серверіңіздің құпия айнымалысына салыңыз (QUTPAY_WEBHOOK_SECRET сияқты).
  6. Сынау батырмасымен тексеріп көріңіз.

Құпия қайта көрсетілмейді. Жоғалтсаңыз жаңасын жасайсыз, ал жаңа құпия қосылған сәттен бастап қолданылады — серверіңізді бір мезетте жаңартыңыз.

Адреске қойылатын талаптар

ТалапПродакшенSandbox
ХаттамаТек httpshttp да болады
ДоменНақты домен керекlocalhost да болады
IP адресҚабылданбайдыБолады
Туннель адресіҚабылданбайдыБолады
АвторизацияБолмауы керекБолмауы керек

Талапқа сай келмесе, адресті сақтағанда бірден қате көресіз:

КодНе болды
invalid_urlАдрес дұрыс емес
webhook_url_requires_httpsHTTP адрес қабылданбайды
webhook_url_requires_domainIP немесе домені жоқ адрес
webhook_url_tunnel_forbiddenУақытша туннель адресі
too_many_endpointsWebhook саны шектен асты

Оқиғаларды таңдау

Барлық оқиғаны қосудың қажеті жоқ. Көбіне екеуі жеткілікті: invoice.paid және invoice.refunded.

ТопОқиғалар
Счётinvoice.created, invoice.pending, invoice.paid, invoice.cancelled, invoice.expired, invoice.failed, invoice.lost
Қайтаруinvoice.refunded, invoice.partially_refunded, refund.done, refund.failed, refund.unknown
Жалпыinvoice.status — кез келген күй ауысуына бір арна
Қателерinvoice.create_failed, invoice.cancel_failed, invoice.bulk
Жазылымsubscription.created, subscription.status

Қай оқиға қай сәтте келетіні: Счёттың өмірлік циклі.

Тақырыптар

Әр сұрауда төрт тақырып келеді:

ТақырыпНе
X-Webhook-EventОқиғаның атауы, мысалы invoice.paid
X-Webhook-TimestampЖіберілген уақыт, Unix секунд
X-Webhook-Signaturesha256= префиксі мен hex қолтаңба
X-Webhook-DeliveryЖеткізу нөмірі, журналмен салыстыруға ыңғайлы

Қолтаңбаны міндетті түрде тексеріңіз: Webhook қауіпсіздігі.

Дене мысалы

POST /qutpay-webhook HTTP/1.1
Host: site.kz
Content-Type: application/json
X-Webhook-Event: invoice.paid
X-Webhook-Timestamp: 1757167000
X-Webhook-Signature: sha256=3f1a…
X-Webhook-Delivery: 17

{
  "event": "invoice.paid",
  "invoice": {
    "id": "inv_…",
    "externalOrderId": "1001",
    "status": "paid",
    "amount": 2500,
    "metadata": { "branch": "almaty-1" },
    "receiptUrl": "…",
    "paidAt": "…"
  },
  "sentAt": "…"
}

externalOrderId пен metadata — сіз счёт жасағанда берген мәндер, олар өзгертілмей қайтады.

Қайталау кестесі

Серверіңіз 2xx емес жауап берсе немесе мүлдем жауап бермесе, біз сұрауды 11 рет қайталаймыз. Аралық 10 секундтан басталып, бір сағатқа дейін өседі.

Бұдан екі қорытынды шығады:

  1. Алдымен 200 қайтарыңыз, жұмысты содан кейін істеңіз. Ұзақ өңдеу таймаутқа әкеледі, ал таймаут — қайталау.
  2. Өңдеуіңіз идемпотентті болсын. Бір счёт бойынша бір күй бірнеше рет келуі мүмкін. (invoice.id, status) жұбы бойынша бір рет орындаңыз: Идемпоттылық.
app.post('/qutpay-webhook', express.raw({ type: '*/*' }), async (req, res) => {
  if (!verify(req)) return res.sendStatus(401);
  res.sendStatus(200);              // бірінші жауап
  await enqueue(JSON.parse(req.body)); // сосын жұмыс
});

Журнал

Кабинеттің Интеграциялар бөлімінде әр жіберілім жазылады: оқиға түрі, уақыты, серверіңіздің HTTP жауабы. Бір нәрсе келмей жатса, диагностика осыдан басталады.

Журналда не тұрМағынасы
Бірде-бір жазба жоқБіз жібермедік: адрес қосылмаған, оқиға таңдалмаған немесе күй әлі өзгермеген
«Жіберілді», жауап 401/403Адрес авторизациямен жабық
Жауап 404Жол дұрыс емес немесе маршрут тіркелмеген
Жауап 301/302Қайта бағыттау — біз оны ұстамаймыз
Жауап 500Сіздің өңдеушіңіз құлап жатыр
ТаймаутӨңдеу тым ұзақ

Толық диагностика: Webhook келмей жатыр.

Қайта бағыттау ережесі

307 және 308 қайта бағыттауларын біз тек сол адрестің өзіне ұстаймыз: httphttps және қиғаш сызық қосылған нұсқа. Басқа жерге апаратын қайта бағыттауды ұстамаймыз.

Себебі қарапайым: қайта бағыттауды соқыр ұстау сұрауды бөтен адреске жіберіп қоюы мүмкін. Сондықтан кабинетке соңғы адресті жазыңыз, аралық адресті емес.

Сынау

  1. Кабинеттегі сынау батырмасымен сынама сұрау жіберіңіз — қолтаңбаны тексеретін кодыңыз жұмыс істеп тұрғанын осыдан көресіз.
  2. Sandbox-қа ауысып, счёт жасаңыз да, POST /api/v1/invoices/{id}/simulate {"status":"paid"} арқылы төлемді симуляциялаңыз. Webhook шынайы жіберіледі.
  3. Қайталауды сынау үшін өңдеушіңізді әдейі 500 қайтаратын етіп қойып, журналда қайталаудың келгенін қараңыз.

Толық сценарий: Интеграцияны қалай сынау керек.

Жиі қойылатын сұрақтар

Бірнеше адрес қосуға бола ма? Иә. Мысалы бір адрес сайтқа, екіншісі ішкі мониторингке. Әрқайсысының өз оқиға тізімі болады.

Webhook жалғыз жеткілікті ме? Көп жағдайда иә. Клиент құрылғының алдында тұрып нәтиже күтетін болса, қатар күйді де сұраңыз: Webhook пен күйді сұрау.

Құпияны жоғалттым. Кабинеттен жаңасын жасаңыз және серверіңіздегі мәнді сол сәтте ауыстырыңыз.

Адресімді өзгерттім, ескі оқиғалар не болады? Қайталау кезегінде тұрған оқиғалар жаңа адреске жіберіледі.

Sandbox-та да webhook келе ме? Иә, шынайы жіберіледі. Айырмашылығы — адрес http және localhost болуына рұқсат.

Байланысты мақалалар

Webhook қауіпсіздігі және қолтаңбаны тексеруҚолтаңба қалай құралады, неге raw body міндетті, timestamp-ты қалай тексеру керек, Express, Laravel, Django және таза Node үшін код мысалдары, идемпотентті өңдеу және жиі кездесетін қателер.Webhook келмей жатыр — себебін қалай табу керекСчёт төленді, бірақ сіздің серверіңізге хабарлама жетпеді. Диагностиканы қай жерден бастау керек, ең жиі кездесетін себеп қайсы және оны бір сынаумен қалай анықтауға болады.Счёттың өмірлік цикліСчёттың барлық күйлері мен ауысулары, қай күйде қандай webhook оқиғасы келеді, қайсысы ашық және қайсысы төленген деп есептеледі, кеш келген төлемді қалай өңдеу керек.Webhook пен күйді сұрау: қайсысы қашанWebhook — негізгі әдіс, бірақ жеткізу кепілдігі абсолютті емес. Кідіріске сезімтал сценарийлерде екеуін қатар жүргізу керек: қалай, қандай жиілікпен және неге бұл артық жұмыс емес.Интеграцияны қалай сынау керекSandbox-та өтуге тиіс сценарийлер тізімі: сәтті төлем, болдырмау, мерзімі өту, толық және ішінара қайтару, кеш төлем. Webhook-ты қалай сынау, қандай шекті жағдайларды тексеру керек және автоматты тестті қалай жазу керек.

Сұрағыңыз қалды ма? WhatsApp +77788813333 · kazprose@gmail.com
Кабинеттен де жазуға болады: Қолдау.

Qut Pay — тәуелсіз сервис, «Kaspi Bank» АҚ-мен аффилирленбеген. Kaspi және Kaspi Pay — құқық иесінің тауар белгілері.