Kaspi Pay + Halyk + Forte — интеграция платежей для онлайн-магазина в Казахстане

Коротко (TL;DR)Kaspi Pay — самый быстрый старт (1 день на интеграцию, 2.5-3.5% комиссия). Halyk — для B2B и сетей (2.5-2.9% + better SLA). Forte — премиум (2.7-3.2%, 3D Secure, Apple Pay). Рекомендуем интегрировать все три: покроют 80% платежей в Казахстане. Webhook + retry logic = гарантированный платёж. Шаблоны кода в этой статье.

Казахские платёжные системы — рынок 2026

Когда вы запускаете интернет-магазин в Алматы или Казахстане, первое, что нужно решить — как принимать платежи от покупателей. За 19 лет и 500+ проектов мы интегрировали казахские платёжные системы с сотнями магазинов. Выяснили что работает, а что нет.

На 2026 год рынок эквайринга в Казахстане выглядит так:

Главное правило: не полагайтесь на одного эквайрера. Если Kaspi будет на техническом обслуживании — вы потеряете платежи. Интегрируйте минимум два параллельно. Мы рекомендуем Kaspi (основной) + Halyk (резервный).

Kaspi Pay — быстрый старт

Когда выбирать Kaspi

Процесс подключения к Kaspi

  1. Регистрация БИН: заявка на kaspi.kz/business → KYC документы (паспорт директора, БИН, выписка из реестра) → 3-5 дней
  2. Получение API-ключа: Kaspi выдаст merchant_id и secret_key
  3. Подписание договора: комиссия обычно 2.5-3.5% (зависит от оборота)
  4. Тестирование: используйте sandbox учётные данные
  5. Production: производство 1-2 дня

REST API Kaspi — основные endpoint'ы

// 1. Создание платежа (Initiate Payment)
POST https://api.kaspi.kz/v2/payment/create
Content-Type: application/json
Authorization: Bearer SECRET_KEY

{
  "merchantId": "YOUR_MERCHANT_ID",
  "orderId": "ORDER_123",
  "amount": 150000,
  "currency": "KZT",
  "description": "Товар: Samsung Galaxy S25",
  "returnUrl": "https://yourshop.kz/checkout/success",
  "failureUrl": "https://yourshop.kz/checkout/failure",
  "webhookUrl": "https://yourshop.kz/webhook/kaspi"
}

// Response:
{
  "transactionId": "TXN_ABC123",
  "paymentUrl": "https://kaspi.kz/checkout?token=...",
  "status": "PENDING"
}

// 2. Проверка статуса платежа (Poll Payment Status)
GET https://api.kaspi.kz/v2/payment/TXN_ABC123/status
Authorization: Bearer SECRET_KEY

// Response:
{
  "transactionId": "TXN_ABC123",
  "status": "COMPLETED",
  "amount": 150000,
  "orderId": "ORDER_123"
}

// 3. Refund (возврат денег)
POST https://api.kaspi.kz/v2/payment/TXN_ABC123/refund
Content-Type: application/json
Authorization: Bearer SECRET_KEY

{
  "amount": 150000,
  "reason": "Customer requested"
}

Webhook обработка (критично!)

Kaspi отправляет POST запрос к вашему webhook URL с результатом платежа. Никогда не полагайтесь только на redirect — webhook нужен для гарантии.

// Kaspi отправляет:
POST /webhook/kaspi
Content-Type: application/json

{
  "transactionId": "TXN_ABC123",
  "orderId": "ORDER_123",
  "status": "COMPLETED",
  "amount": 150000,
  "timestamp": "2026-05-13T14:30:00Z",
  "signature": "SHA256_HASH"
}

// Ваше приложение должно ответить:
{
  "acknowledged": true
}

// Обработка в коде (Node.js пример):
const crypto = require('crypto');

app.post('/webhook/kaspi', (req, res) => {
  const { transactionId, orderId, status, amount, signature } = req.body;

  // Проверка подписи (безопасность)
  const payload = `${transactionId}${orderId}${status}${amount}`;
  const expectedSig = crypto.createHmac('sha256', SECRET_KEY)
    .update(payload)
    .digest('hex');

  if (signature !== expectedSig) {
    return res.status(400).json({ error: 'Invalid signature' });
  }

  // Обновление заказа в БД
  if (status === 'COMPLETED') {
    await Order.findByIdAndUpdate(orderId, { status: 'paid', transactionId });
    await sendConfirmationEmail(orderId);
    await notifyWarehouse(orderId);
  } else if (status === 'FAILED') {
    await Order.findByIdAndUpdate(orderId, { status: 'payment_failed' });
  }

  res.json({ acknowledged: true });
});

Комиссии Kaspi (mai 2026)

Годовой оборот Процент комиссии Fixed fee (за 1 транзакцию)
0 - 50M ₸ 3.5% 50 ₸
50M - 100M ₸ 3.0% 40 ₸
100M+ ₸ 2.5% 30 ₸

Halyk Bank — надёжность и интеграция с 1С

Когда выбирать Halyk

Halyk API — основные отличия от Kaspi

Halyk использует похожую REST архитектуру, но с собственными endpoint'ами и форматом:

// Создание платежа у Halyk
POST https://secure.halyk.kz/api/v1/invoice
Content-Type: application/json

{
  "merchantCode": "YOUR_MERCHANT_CODE",
  "invoiceId": "INV_123",
  "amount": 150000,
  "currency": "KZT",
  "description": "Order #123",
  "notifyUrl": "https://yourshop.kz/webhook/halyk",
  "returnUrl": "https://yourshop.kz/checkout/success"
}

// Halyk возвращает:
{
  "invoiceId": "INV_123",
  "transactionId": "HALYK_TXN_456",
  "paymentUrl": "https://secure.halyk.kz/checkout?invoice=...",
  "status": "NEW"
}

Halyk комиссии (2026)

Forte — премиум решение

Когда использовать Forte

Forte особенности

Сравнительная таблица

Параметр Kaspi Pay Halyk Forte
Скорость подключения 1-2 недели 2-4 недели 2-4 недели
Базовая комиссия 2.5-3.5% 2.5-2.9% 2.7-3.2%
3D Secure ✓ (опционально) ✓ (встроено) ✓ (встроено)
Apple Pay / Google Pay Нет Нет
Интеграция 1С Кастом API ✓ Встроено Кастом API
Подписки (Recurring) Нет Есть ✓ (лучшее)
SLA (uptime) 99.7% 99.95% 99.98%

Паттерн интеграции нескольких эквайреров одновременно

В своих проектах мы часто интегрируем Kaspi как основной + Halyk как fallback. Вот как это устроено:

// Checkout страница (Vue.js / React пример)
const handlePayment = async (amount, orderId) => {
  // Сначала пытаемся Kaspi
  try {
    const kaspiPayment = await initPaymentKaspi({
      orderId,
      amount,
      webhookUrl: '/webhook/kaspi'
    });
    window.location = kaspiPayment.paymentUrl;
  } catch (kaspiError) {
    // Если Kaspi недоступен, падаем на Halyk
    console.warn('Kaspi failed:', kaspiError.message);
    try {
      const halykPayment = await initPaymentHalyk({
        orderId,
        amount,
        webhookUrl: '/webhook/halyk'
      });
      window.location = halykPayment.paymentUrl;
    } catch (halykError) {
      alert('Оба способа недоступны, попробуйте позже');
    }
  }
};

// Backend: улучшенная обработка webhook с retry
app.post('/webhook/payment', async (req, res) => {
  const { provider, transactionId, orderId, status } = req.body;

  try {
    // Проверка статуса (идемпотентность)
    const existingPayment = await Payment.findOne({ transactionId });
    if (existingPayment) {
      return res.json({ acknowledged: true }); // Уже обработан
    }

    if (status === 'COMPLETED') {
      // Обновляем заказ
      const order = await Order.findByIdAndUpdate(
        orderId,
        { status: 'paid', provider, transactionId },
        { new: true }
      );

      // Queue worker (важно!) - отправляем в очередь, не синхронно
      await queue.push('process_paid_order', { orderId });

      // Логируем платёж
      await Payment.create({
        orderId,
        transactionId,
        provider,
        amount: req.body.amount,
        status: 'completed'
      });
    }

    res.json({ acknowledged: true });
  } catch (error) {
    console.error('Webhook processing failed:', error);
    res.status(500).json({ error: 'Processing failed' });
  }
});

Чек-лист подключения платежей

На этапе переговоров (неделя 1)

На этапе разработки (неделя 2-3)

На этапе production (неделя 4)

Нужна интеграция платежей для вашего магазина в Алматы?

Мы подключили 500+ магазинов к казахским эквайреров. Знаем все подводные камни.

Создать интернет-магазин с платежами

Часто задаваемые вопросы

+ Какой эквайрер выбрать для интернет-магазина?
Kaspi — самый популярный (60% магазинов), меньше всего документов для подключения. Halyk — для крупных сетей, лучше по комиссиям (2.5-2.7%). Forte — премиум-вариант для high-ticket товаров. Рекомендуем интегрировать все три параллельно, чтобы покрыть 80% аудитории.
+ Сколько времени занимает интеграция Kaspi Pay?
Если эквайрер уже одобрил БИН и выдал credentials: 3-5 дней на разработку. Если включать первичное подключение у эквайрера (KYC, договор): 2-4 недели. Рекомендуем запустить на тестовых учётных данных параллельно с документами.
+ Какие комиссии у казахских эквайреров в 2026?
Kaspi Pay: 2.5-3.5% (зависит от оборота). Halyk: 2.5-2.9%. Forte: 2.7-3.2%. Все включают fixed fee (~30-50 ₸ за транзакцию). Договоритесь напрямую, часто можно скинуть на 0.3% при обороте 100M+ в год.
+ Что такое webhook и зачем он нужен?
Webhook — это HTTP POST запрос от платёжной системы к вашему магазину с уведомлением о результате платежа (success/failed). Нужен потому что платёжный шлюз асинхронный: покупатель платит, а результат приходит через несколько секунд. Webhook автоматизирует обработку: оплачена → отправить заказ в склад → отправить email.