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

Счёттың өмірлік циклі

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

Қысқаша

Счёт мынандай жолмен жүреді:

new ──▶ pending ──┬──▶ paid ──┬──▶ refunded
                  │           └──▶ partially_refunded
                  ├──▶ cancelled
                  └──▶ expired

Кодыңызда екі топты ажыратыңыз: ашық счёттар — new және pending; төленген деп есептелетіндер — paid, refunded, partially_refunded. Қайтарылған счёт та төленген болып қалады: ақша келген, сосын қайтарылған.

Ең маңызды шекті жағдай — кеш төлем: жабылған счётқа ақша кейін де келуі мүмкін.

Күйлер кестесі

КүйМағынасыАшық паТөленген деп есептеле ме
newСчёт жасалды, әлі Kaspi-де күтудеИәЖоқ
pendingКлиенттің төлеуін күтіп тұрИәЖоқ
paidТөлендіЖоқИә
cancelledСіз болдырдыңызЖоқЖоқ
expiredМерзімі өтті, төленбедіЖоқЖоқ
refundedТолық қайтарылдыЖоқИә
partially_refundedІшінара қайтарылдыЖоқИә

Тізімді сүзгенде немесе есеп жасағанда осы екі топқа сүйеніңіз, әр күйді бөлек тізіп жазбаңыз — кейін жаңа күй қосылса, кодыңыз бұзылмайды.

Ауысулар

ҚайданҚайдаНе болды
newpendingСчёт Kaspi-ге тіркелді, клиент төлей алады
pendingpaidКлиент төледі
pendingcancelledСіз POST /invoices/{id}/cancel жібердіңіз
pendingexpiredexpiresAt өтті, ешкім төлемеді
paidrefundedТолық сома қайтарылды
paidpartially_refundedСома бөлігі қайтарылды
cancelled / expiredpaidКеш төлем. Ақша кешігіп келді

Кері ауысу жоқ: paid счёт қайта pending болмайды, expired счёт өзінен өзі жанданбайды.

Қай оқиға қай сәтте келеді

ОқиғаҚашанДене ерекшелігі
invoice.createdСчёт жасалғандаid, externalOrderId, amount
invoice.pendingСчёт төлеуге дайын болғанда
invoice.paidКлиент төлегендеpaidAt, receiptUrl
invoice.cancelledБолдырғанда
invoice.expiredМерзімі өткенде
invoice.failedСчёт өтпей қалғанда
invoice.refundedТолық қайтарғанда
invoice.partially_refundedІшінара қайтарғанда
invoice.statusКүй өзгергенде жалпы оқиғаБарлық ауысуға бір арна керек болса
invoice.lostСчёт Kaspi жағында жоғалғанда

Оқиға тізімін кабинеттің Интеграциялар бөлімінде таңдайсыз. Барлығын қосудың қажеті жоқ: көбіне invoice.paid пен invoice.refunded жеткілікті. Баптау: Webhook баптау.

Уақыттар

НеҚанша
QR-дың сканерлеу терезесіШамамен 3 минут, нақты уақыты expiresAt өрісінде
Төлемді тексеру цикліӘр 3 секунд сайын
3 минуттан жас счётӘр айналымда тексеріледі
30 минутқа дейінгі счёт20 секунд сайын
Одан ескі счёт90 секунд сайын
Клиент төлегеннен webhook-қа дейінӘдетте 5 секунд ішінде

Кезек ең жаңа счёттан басталады, сондықтан жаңа ғана жасалған счёт бірінші тексеріледі.

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

Мерзім туралы толығырақ: Счёттың жарамдылық мерзімі.

Кеш төлем: ең маңызды шекті жағдай

cancelled немесе expired болып жабылған счётқа ақша кешігіп келуі мүмкін. Ондайда invoice.paid оқиғасы late: true белгісімен кейін де келеді.

Бұл қате емес және сирек болса да болады. Кодыңыз оны елемеуі тиіс емес — ақша шынымен түсті.

Не істеу керек:

  1. Оқиғаны қабылдап, 200 қайтарыңыз.
  2. Тапсырысты іздеп, оның қазіргі күйін қараңыз.
  3. Екі жолдың бірін таңдаңыз: қызметті беріңіз (тауар бар, тапсырыс күші жойылмаған) немесе ақшаны қайтарыңыз (Қайтару API).
  4. Клиентке хабарлаңыз. Үнсіз қалу ең жаман нұсқа.
if (event === 'invoice.paid') {
  const order = await findOrder(invoice.externalOrderId);
  if (invoice.late && order.status === 'closed') {
    await notifyStaff(order, invoice);   // қолмен шешім керек
  } else {
    await fulfil(order, invoice);
  }
}

Толығырақ: Кеш келген төлем.

Күйді қалай оқу керек

Екі арна бар, екеуі бірін-бірі алмастырмайды:

АрнаҚашан қолдану
WebhookНегізгі арна. Күй өзгергенде өзі келеді
GET /api/v1/invoices/{id}Нақты бір счёттың қазіргі күйін білу керек болғанда

Клиент құрылғының алдында тұрып нәтиже күтетін сценарийде (вендинг, турникет, шлагбаум) екеуін қатар жүргізіңіз: алғашқы 30 секундта секундына бір рет күйді сұрап, қайсысы бұрын келсе соны қабылдаңыз. Сондықтан өңдеуіңіз идемпотентті болуы керек. Толығырақ: Webhook пен күйді сұрау.

GET /api/v1/invoices/{id} жауабында счёттың оқиғалары мен қайтарулары да келеді — журнал ретінде пайдалы.

Идемпотентті өңдеу

Бір счёт бойынша бір оқиға бірнеше рет келуі мүмкін: желі үзілді, сіз 200 қайтара алмадыңыз, біз қайталадық. Сондықтан өңдеуді (invoice.id, status) жұбы бойынша бір рет орындаңыз.

Тәжірибеде бұл былай көрінеді: осы жұпты өз базаңызға бірегей индекспен жазып, жазылмаса (яғни бұрын болған) ештеңе істемейсіз. Толығырақ: Идемпоттылық.

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

refunded счёт төленген деп есептеле ме? Иә. Ақша келген, содан кейін қайтарылған. Есепте оны төленген топтан шығарып тастамаңыз — қайтару бөлек көрсеткіш.

pending күйінде ұзақ тұрып қалса? Бұл қалыпты: клиент әлі төлемеген. expiresAt өткенде счёт expired болады. Толығырақ: Счёт pending күйінде тұрып қалды.

new күйін көрмеймін, бірден pending келеді. Қалыпты жағдай: счёт Kaspi-ге тез тіркеледі, сондықтан new күйі көбіне көрінбей қалады.

Болдырылған счётты қайта ашуға бола ма? Жоқ. Жаңа счёт жасаңыз.

Күй өзгерісін өткізіп алсам ше? Webhook журналы кабинеттің Интеграциялар бөлімінде сақталады, ал счёттың қазіргі күйін әрқашан GET /api/v1/invoices/{id} арқылы оқи аласыз.

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

Счёттың жарамдылық мерзімі — қанша тұрады және не істеу керекQR счёттың сканерлеу терезесі мен телефонға счёттың мерзімі неден анықталады, expiresAt өрісін қалай дұрыс оқу керек, expired күйінен кейін не істеу керек және неге жабылған счётқа ақша кешігіп келуі мүмкін.Кеш келген төлем — счёт жабылған, ал ақша келдіБолдырылған немесе мерзімі өткен счётқа ақша кешігіп келуі мүмкін. Ондайда invoice.paid оқиғасы late: true белгісімен келеді. Не істеу керек және кодта бұған қалай дайын болу керек.Webhook баптауКабинетте webhook адресін қосу, оқиғаларды таңдау, құпияны сақтау, тақырыптар мен дене пішімі, 11 рет қайталау кестесі, журналды оқу, адресті сынау және қайта бағыттау ережесі.Webhook пен күйді сұрау: қайсысы қашанWebhook — негізгі әдіс, бірақ жеткізу кепілдігі абсолютті емес. Кідіріске сезімтал сценарийлерде екеуін қатар жүргізу керек: қалай, қандай жиілікпен және неге бұл артық жұмыс емес.Қайтару API — толық және ішінара қайтаруPOST /invoices/{id}/refund әдісінің толық анықтамасы: сұрау өрістері, толық және ішінара қайтару, сома шектеуі, барлық қате коды, refund_unknown келгенде не істеу керек және қандай оқиғалар жіберіледі.

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

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