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

Қайтару API — толық және ішінара қайтару

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

Қысқаша

Ақшаны қайтару — бір ғана әдіс:

POST /api/v1/invoices/{id}/refund
X-API-Key: qp_live_…
Content-Type: application/json

{ "amount": 1500, "reason": "Тауар қайтарылды" }

amount жазбасаңыз — счёт толық қайтарылады. Жазсаңыз — сол сома ғана қайтады, счёт partially_refunded күйіне өтеді.

Екі нәрсені бірден есте ұстаңыз: кілтте refunds:write құқығы болуы керек, ал refund_unknown немесе refund_pending_unknown қатесі келсе сұрауды қайталамау керек — оның орнына счёт күйін оқисыз.

Сұрау өрістері

ӨрісТипМіндеттіСипаттама
amountnumberжоқҚайтарылатын сома, теңге. Жазылмаса — толық қайтару
reasonstringжоқСебебі. Есепте және кабинетте көрінеді

Жол параметрі {id} — счёттың id мәні (inv_…). externalOrderId бойынша қайтару жоқ: алдымен GET /api/v1/invoices?externalOrderId=… арқылы счётты тауып, содан соң оның id мәнін қолданыңыз.

Қайтару қандай счётқа жасалады

Счёт күйіҚайтаруға бола ма
new, pendingЖоқ. Ақша әлі түспеген — счётты болдырмау керек: POST /invoices/{id}/cancel
paidИә, толық та, ішінара да
partially_refundedИә, қалған сома шегінде
refundedЖоқ, бәрі қайтарылған
cancelled, expiredЖоқ

Ақша біздің шотымыздан емес, сіздің Kaspi шотыңыздан кетеді. Біз ақшаны ешқашан ұстамаймыз, сондықтан қайтаруды да Kaspi орындайды. Шотта қалдық жеткіліксіз болса, операция өтпейді.

Толық және ішінара қайтару

Толық қайтару — денесі бос немесе тек reason бар сұрау:

curl -X POST https://api.qut.kz/api/v1/invoices/inv_7Kd2/refund \
  -H "X-API-Key: $QUTPAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Клиент бас тартты"}'

Ішінара қайтаруamount көрсетілген сұрау. Бірнеше рет ішінара қайтаруға болады, бірақ ереже қатаң:

Барлық қайтарулардың қосындысы төленген сомадан аспауы керек.

Мысалы, 10 000 ₸ счёт бойынша 3 000 және 4 000 қайтарсаңыз, үшінші рет ең көбі 3 000 қайтара аласыз. Одан асырсаңыз invalid_refund_amount келеді. Соңғы қалдықты қайтарғаныңызда счёт refunded күйіне өтеді.

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

Қате кодтары

КодHTTPНе болдыНе істеу керек
invoice_not_refundable409Бұл счётты қайтаруға болмайдыКүйін оқыңыз: төленген бе, мерзімі өтпеген бе
invalid_refund_amount422Сома дұрыс емесОң сан, төленген сомадан аспауы керек
refund_failed502Kaspi қайтаруды орындамадыKaspi шотындағы қалдықты тексеріп, қайталауға болады
refund_unknown502Kaspi жауап бермеді, нәтижесі белгісізҚайталамаңыз. Счёт күйін оқыңыз
refund_pending_unknown409Алдыңғы қайтарудың нәтижесі әлі белгісізҚайталамаңыз. Күте тұрыңыз
refund_state_conflict409Қайтару күйі күткеннен басқаСчёт күйін қайта оқып, содан шешіңіз
insufficient_scope403Кілтте refunds:write жоқКабинетте кілтке құқық қосыңыз
invoice_not_found404Счёт жоқ немесе кілтке көрінбейдіИдентификаторды және кілт байланған кассирді тексеріңіз
kaspi_session_expired409Кассир байланысы үзілгенҚайта байланыстырыңыз

Қателерді әрқашан error коды бойынша өңдеңіз — message мәтіні өзгеруі мүмкін, код өзгермейді.

Нәтижесі белгісіз болғанда

refund_unknown — Kaspi сұрауға жауап бермеді. Ақша кетті ме, жоқ па — бұл сәтте біз де білмейміз. refund_pending_unknown — алдыңғы қайтару әлі анықталмағандықтан жаңа сұрау қабылданбайды.

Екі жағдайда да реті бірдей:

  1. Сұрауды қайталамаңыз. Қайтару әдісінде идемпоттылық кепілдігі жоқ — екінші сұрау екінші қайтаруға айналуы мүмкін.
  2. Бірнеше секунд, қажет болса бір минут күтіңіз.
  3. GET /api/v1/invoices/{id} арқылы күйді оқыңыз.
  4. Күй refunded немесе partially_refunded болса — қайтару өтті, қайталаудың қажеті жоқ.
  5. Күй әлі paid, ал қайтарулар тізімі бос болса — сонда ғана қайталаңыз.

Клиентке «ақша қайтарылды» деп счёт күйінен көрмей тұрып айтпаңыз.

async function refundOnce(id, amount) {
  const r = await fetch(`${API}/invoices/${id}/refund`, {
    method: 'POST',
    headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ amount, reason: 'Қайтару' }),
  });
  if (r.ok) return 'done';

  const { error } = await r.json();
  if (error === 'refund_unknown' || error === 'refund_pending_unknown') {
    // қайталамаймыз — күйді оқып барып шешеміз
    return 'check_status';
  }
  if (error === 'refund_failed') return 'retry_later';
  throw new Error(error);
}

Оқиғалар

Қайтару өткен соң webhook келеді:

ОқиғаҚашан
invoice.refundedСчёт толық қайтарылды
invoice.partially_refundedСома ішінара қайтарылды
refund.doneЖеке қайтару операциясы орындалды
refund.failedҚайтару орындалмады
refund.unknownНәтижесі белгісіз күйде қалды

Автоматты есеп жүргізсеңіз, күйді сұрап отырғаннан гөрі осы оқиғаларға сүйенген ыңғайлы. Webhook өңдеуіңіз идемпотентті болсын: бір қайтару туралы екі рет хабар келгенде бухгалтерияда екі жазба пайда болмауы керек.

Құқық және кассир

Мерзім

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

Sandbox режимінде бүкіл циклді қауіпсіз сынап көруге болады: счёт жасап, төлемді симуляциялап, содан кейін қайтаруды жіберіңіз.

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

Қайтаруды кері қайтаруға бола ма? Жоқ. Өткен қайтару кері оралмайды — клиенттен қайта төлеуді сұрауға тура келеді.

Комиссия қайтарыла ма? Kaspi өз комиссиясын өзі анықтайды, оны Kaspi қолдауынан сұраңыз. Біз транзакциядан пайыз алмаймыз, сондықтан бізден қайтаратын ештеңе жоқ.

Клиентке ақша қашан жетеді? Оны Kaspi шешеді, мерзімге біз әсер ете алмаймыз.

Қайтаруды кабинеттен жасауға бола ма? Иә, Счёттар бөлімінде счётты ашып, қайтару батырмасын басасыз. API мен кабинет бір операцияны орындайды.

Қате кодтарының толық тізімі қайда? Қателер каталогы бетінде. Қайтару өтпей жатқанда себебін іздеу реті: Қайтару өтпей жатыр.

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

Қайтару өтпей жатырҚайтару қатесін код бойынша ажырату: счёт қайтаруға жарамайды, сома дұрыс емес, Kaspi орындамады немесе нәтижесі белгісіз. Қайсысында қайталауға болады, қайсысында мүлде болмайды.Қателер каталогы — API не қайтарады және не істеу керекQut Pay API-інің барлық негізгі қате кодтары топтап берілген: авторизация, Kaspi байланысы, счёт, қайтару, тариф лимиті, webhook, жазылым. Әрқайсысының себебі және шешімі.Құқықтар (scopes) — кілт нені істей аладыАлты scope-тың толық кестесі: invoices:read, invoices:write, refunds:write, subscriptions:manage, webhooks:manage, partner:manage. Әрқайсысы қай әдістерді ашады, ең аз құқық принципі және insufficient_scope қатесі.API кілттер — жасау, сақтау, ауыстыруqp_live_ және qp_test_ кілттерінің айырмашылығы, кілтті кабинетте жасау, қайда сақтау керек және қайда мүлдем сақтамау керек, әр интеграцияға бөлек кілт, үзіліссіз ауыстыру реті және жою салдары.Клиентке төлем келмей жатырСчёт жасалды, бірақ клиенттің телефонына ештеңе келмеді немесе QR ашылмайды. Ең жиі себебі — тест режимі қосулы қалып қойған. Алты қадамдық тексеру реті.

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

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