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

Кеш келген төлем — счёт жабылған, ал ақша келді

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

Қысқаша

Счёт cancelled немесе expired күйіне өтіп кеткен соң да, оған ақша кешігіп келуі мүмкін. Бұл қалыпты жағдай, сирек болғанымен, болады. Ондайда сізге invoice.paid оқиғасы late: true белгісімен келеді. Сіз екі жолдың бірін таңдайсыз: қызметті беру немесе ақшаны қайтару. Үшінші жол — елемеу — жарамайды: ақша мерчант шотында тұр, ал клиент тауарын күтіп отыр.

Ең бастысы — кодыңыз мұндай оқиғаны күте білсін. Көп интеграция invoice.paid оқиғасын «счёт ашық болса ғана» өңдейді және кеш төлемді үнсіз тастап кетеді.

Неге бұлай болады

Счёт бізде де, Kaspi-де де жүреді, әрі екі жақтың уақыт есебі әрдайым бірдей болмайды.

Kaspi төлемнің дәл уақытын бермейді. Payload-та «клиент қай секундта растады» деген өріс жоқ, сондықтан кідіріс қанша болғанын деректерден өлшеу мүмкін емес. Сіз тек фактіні көресіз: счёт жабық еді, ақша келді.

Қалай білесіз

БелгіҚайдан көресіз
invoice.paid оқиғасы late: true белгісіменWebhook payload-ынан
Счёттың күйі жабық күйден paid күйіне өткенGET /api/v1/invoices/{id}
Kaspi Pay-де транзакция бар, ал жүйеңізде тапсырыс жабылғанKaspi шоты мен өз базаңызды салыстырғанда

Webhook-ты тыңдамасаңыз, мұндай төлемді тек айдың соңында, есеп айырысқанда байқайсыз. Сондықтан invoice.paid оқиғасын әрқашан өңдеген жөн.

Кодта дайын болу

Кеш төлемді бөлек оқиға деп қарамаңыз — бұл жай ғана invoice.paid, оның үстінде белгісі бар. Негізгі ереже: төлемді өңдеуді счёттың алдыңғы күйіне байлап қоймаңыз.

app.post('/webhooks/qutpay', async (req, res) => {
  const event = req.headers['x-webhook-event'];
  const body = JSON.parse(req.rawBody); // қолтаңбаны тексергеннен кейін

  if (event === 'invoice.paid') {
    const orderId = body.invoice.externalOrderId;
    const order = await orders.find(orderId);

    // Идемпоттылық: бұл счёт бойынша бұрын өңдедік пе?
    if (order.paidInvoiceId === body.invoice.id) return res.sendStatus(200);

    if (body.late) {
      // Счёт жабық болатын, бірақ ақша келді
      if (order.status === 'cancelled') {
        await flagForReview(order, body.invoice); // адам шешеді
      } else {
        await fulfil(order, body.invoice); // қызметті береміз
      }
    } else {
      await fulfil(order, body.invoice);
    }
  }

  res.sendStatus(200);
});

Үш нәрсеге назар аударыңыз:

Шешім қабылдау

ЖағдайДұрыс әрекет
Тапсырыс әлі орындалмаған, тауар барҚызметті беріңіз, тапсырысты paid деп белгілеңіз
Тауар қоймада жоқ, тапсырыс жабылғанАқшаны қайтарыңыз, клиентке хабарлаңыз
Клиент екінші рет төлеп қойғанАртығын қайтарыңыз
Қызмет мерзімдік (жазылым, абонемент)Мерзімді сол сәттен бастап ашыңыз
Іс-шара өтіп кеткен, билет жарамсызАқшаны қайтарыңыз

Ақшаны қайтару POST /api/v1/invoices/{id}/refund арқылы жасалады. Қайтару жауабы refund_unknown немесе refund_pending_unknown десе, қайталап жібермеңіз — алдымен счёт күйін оқыңыз, әйтпесе екі рет қайтарып жіберуіңіз мүмкін.

Клиентпен қалай сөйлесу керек

Кеш төлем клиенттің кінәсі емес. Ол растау батырмасын басты, ақшасы шықты — оның көзқарасы бойынша бәрі дұрыс болды.

Қайталанбауы үшін

Егер счёттар мүлде төленбей жатса, себебі басқа: Мәселе менде ме, Kaspi-де ме.

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

Кеш төлем жиі бола ма? Жоқ, сирек. Бірақ ай сайын жүздеген счёт шығаратын болсаңыз, кездеседі. Сондықтан кодта дайын болған дұрыс.

Ақша қайда түседі — жабық счёт болса да? Тіке сіздің Kaspi шотыңызға. Счёттың күйі ақшаның қозғалысына әсер етпейді.

late: true белгісі қай оқиғада келеді? invoice.paid оқиғасында. Счёт бұрын cancelled немесе expired болған жағдайда.

Мен оқиғаны елеместен қалдырсам, қайталана ма? Иә, 2xx емес жауап берсеңіз 11 ретке дейін қайталанады. Бірақ 200 қайтарып, ішінде елемей тастасаңыз — оқиға жоғалады.

Қайтару жасауға қанша уақыт бар? Мерзім Kaspi жағында анықталады, сондықтан кешіктірмеген дұрыс. Қайтару өтпей жатса, счёттың күйін алдымен оқып алыңыз.

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

Счёт төленді, ал ақша түспедіҮш себебі бар: тест режимі қосулы, ақшаны дұрыс емес жерден іздеп жүрсіз, немесе кассир басқа Kaspi ұйымына тиесілі. Әрқайсысын қалай тексеру керек және не істеу керек.Webhook қолтаңбасы сәйкес келмейдіҚолтаңба HMAC-SHA256(secret, timestamp + "." + rawBody) арқылы есептеледі. Ең жиі қате — денені JSON-ға айналдырып, қайта жолға түрлендіру. Raw body алудың Express, Laravel, Django мысалдары.Мәселе менде ме, Kaspi-де ме — екі минуттық диагностикаҮш сұраққа жауап беріп, ақаудың қай жақта екенін анықтайсыз: интеграцияда, Kaspi байланысында әлде қызметте. Әр жауапқа нақты әрекет және қолдауға не жинау керегі.

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

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