Платёжная ссылка
linkГотовая страница оплаты: на компьютере покупатель видит QR, на телефоне — кнопку «Открыть в Kaspi». Отправьте ссылку в мессенджер или сделайте редирект с сайта.
Sezgir Pay — платёжный шлюз Sezgir. Сайты, Telegram-боты, CRM и приложения принимают оплату через Kaspi.kz по одному REST API, а деньги сразу поступают на счёт Kaspi вашего ИП или ТОО.
Выберите сценарий под свой сервис: интернет-магазин, Telegram-бот, касса или CRM. Тип платежа — это одно поле в запросе.
linkГотовая страница оплаты: на компьютере покупатель видит QR, на телефоне — кнопку «Открыть в Kaspi». Отправьте ссылку в мессенджер или сделайте редирект с сайта.
qrQR-код под конкретную сумму для оплаты на месте: покажите его на экране кассы или планшета — покупатель сканирует его в приложении Kaspi.
invoiceСчёт приходит пушем прямо в приложение Kaspi покупателя по его номеру — остаётся только подтвердить оплату.
HMAC-SHA256, до 10 попыток доставки за ~2 суток и журнал доставок в кабинете.
Полные и частичные — из кабинета или одним запросом к API.
Ключи sk_test_… и симуляция оплаты без реальных денег.
Заголовок Idempotency-Key — повтор запроса не создаст второй платёж.
Подключите несколько ИП и ТОО — каждый сервис платит на свой счёт.
Владелец, админ, разработчик, наблюдатель — и журнал действий.
Выгрузите платежи для бухгалтерии и сверки в один клик.
Понятный интерфейс для всей команды — со светлой и тёмной темой.
Начните в тестовом режиме: ключи sk_test_… работают без Kaspi, а оплату можно симулировать прямо на странице оплаты.
Добавьте в Kaspi Pay сотрудника с ролью «Кассир» и подключите его в кабинете. Можно подключить несколько ИП и ТОО.
Один POST-запрос с суммой и типом: ссылка, QR или счёт. В ответе — id платежа, статус pending и checkout_url.
Когда покупатель оплатит, на ваш сервер придёт событие payment.succeeded с подписью Sezgir-Signature. Не ответили 2xx — повторим.
Обычный REST с JSON и Bearer-ключами. Создайте платёж, отправьте покупателя на checkout_url и дождитесь вебхука — статус придёт сам.
curl https://pay.sezgir.com/api/v1/payments \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: order-42" \
-H "Content-Type: application/json" \
-d '{"type":"link","amount":15000,"description":"Заказ #42"}'const res = await fetch('https://pay.sezgir.com/api/v1/payments', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SEZGIR_SECRET_KEY}`,
'Idempotency-Key': 'order-42',
'Content-Type': 'application/json',
},
body: JSON.stringify({ type: 'link', amount: 15000, description: 'Заказ #42' }),
});
const payment = await res.json();
// Перенаправьте покупателя на payment.checkout_urlimport os
import requests
payment = requests.post(
"https://pay.sezgir.com/api/v1/payments",
headers={
"Authorization": f"Bearer {os.environ['SEZGIR_SECRET_KEY']}",
"Idempotency-Key": "order-42",
},
json={"type": "link", "amount": 15000, "description": "Заказ #42"},
).json()
# Перенаправьте покупателя на payment["checkout_url"]{
"id": "pay_…",
"object": "payment",
"livemode": false,
"type": "link",
"status": "pending",
"amount": 15000,
"description": "Заказ #42",
"checkout_url": "https://pay.sezgir.com/pay/pay_…"
}Каждое событие подписано HMAC-SHA256: в заголовке Sezgir-Signature — метка времени и подпись тела. Если ваш сервер не ответил 2xx, доставка будет доставляться — до 10 попыток в течение ~2 суток, а каждая попытка видна в журнале доставок.
POST /webhooks/sezgir HTTP/1.1
Content-Type: application/json
Sezgir-Signature: t=1761379452,v1=9c1f3e…
{
"id": "evt_…",
"object": "event",
"type": "payment.succeeded",
"livemode": false,
"created": 1761379452,
"data": {
"object": {
"id": "pay_…",
"object": "payment",
"status": "succeeded",
"amount": 15000,
"description": "Заказ #42"
}
}
}import crypto from 'node:crypto';
// rawBody — тело запроса строкой, до JSON.parse; secret — whsec_… из настроек вебхука
export function verifySignature(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const expected = crypto
.createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && v1?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Подключите несколько ИП и ТОО и закрепите за каждым сервисом своего кассира. Оплата за заказ в боте уйдёт на один счёт, а оплата в CRM — на другой.
Боевые ключи sk_live_… и тестовые sk_test_… разделены, а всё, что касается денег и доступа, защищено на каждом уровне.
Шлюз не держит средства: каждая оплата зачисляется напрямую на счёт Kaspi вашего ИП или ТОО.
Секреты в базе хранятся зашифрованными алгоритмом AES-256-GCM.
HMAC-SHA256 с меткой времени в заголовке Sezgir-Signature — подделку и повтор старого запроса легко отсечь.
Ограничение частоты запросов на каждый API-ключ защищает от перебора и случайных циклов.
Кабинет и страница оплаты работают со строгой Content-Security-Policy — без сторонних скриптов.
Владелец, админ, разработчик, наблюдатель. Важные действия команды записываются в журнал аудита.
Не нашли ответ? Подробности об API, вебхуках и тестовом режиме — в документации.
sk_test_…: платежи создаются как настоящие, а результат оплаты можно симулировать прямо на странице оплаты — «Оплатить» или «Отклонить». Вебхуки при этом приходят так же, как в бою. Kaspi для теста подключать не нужно.payment.succeeded, подписанный HMAC-SHA256 (заголовок Sezgir-Signature). Если сервер не ответил 2xx, доставка будет доставляться — до 10 попыток в течение ~2 суток. Все попытки видны в журнале доставок, а статус всегда можно запросить через API.Idempotency-Key — например, номер заказа. Повтор с тем же ключом вернёт уже созданный платёж, а не создаст второй.Начните с тестовых ключей и симуляции оплаты, а когда всё готово — подключите кассира Kaspi и переключитесь на боевые ключи.