Автоматизация платежей для POS-систем через Kaspi Pay API. Проект предоставляет серверное приложение и веб-интерфейс для создания счетов, генерации QR-кодов, просмотра истории транзакций и оформления возвратов.
┌──────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Web UI │◄─────►│ Express Server │◄─────►│ Kaspi Pay API │
│ (public/) │ │ (server.js) │ │ (entrance/ │
│ │ │ │ │ mtoken/qrpay) │
└──────────────┘ └──────────────────┘ └──────────────────┘
│
┌─────────┴─────────┐
│ src/ │
│ ├─ config.js │ Keypair, device, constants
│ ├─ crypto.js │ ECDH, ECDSA, TOTP, AES
│ ├─ helpers.js │ Fetch wrapper, headers
│ ├─ session.js │ Stateless session factory
│ ├─ logger.js │ File & console logging
│ ├─ polling.js │ Payment status polling
│ ├─ webhookStore │ Webhook management
│ └─ routes/ │ API route handlers
│ ├─ auth.js │ SMS auth (3-step)
│ ├─ invoice.js │ Invoice creation
│ ├─ qr.js │ QR code generation
│ ├─ history.js │ Transaction history
│ ├─ refund.js │ Refund processing
│ └─ session.js │ Session management
└───────────────────┘
Сервер stateless после авторизации — данные сессии (зашифрованный vtokenSecret, tokenSN, profileId) хранятся на стороне клиента и передаются через заголовки.
Сервер автоматически отслеживает статусы созданных QR- и invoice-платежей (polling каждые 3 сек.) и отправляет HTTP POST-уведомления на указанные URL при изменении статуса.
- 📡 События:
payment.success·payment.failed·payment.expired - ⚙️ Настройка: файл
webhooks.json(см.webhooks.example.json) - 🔐 Подпись: HMAC SHA-256
- 🔄 Retry: до 3 попыток с нарастающей задержкой
📖 Подробнее — в документации API.
- Node.js ≥ 20.6
# 1. Клонировать репозиторий
git clone https://github.com/tapter-dev/kaspi-pos-automation.git
cd kaspi-pos-automation
# 2. Установить зависимости
npm install
# 3. Создать .env с ключом шифрования
echo "TOKEN_SECRET_KEY=$(openssl rand -hex 32)" > .env
# 4. (Опционально) Настроить вебхуки
cp webhooks.example.json webhooks.json
# Отредактируйте webhooks.json под свои нужды
# 5. Запустить сервер
npm startПри первом запуске автоматически генерируются keypair.json и device.json.
| Переменная | Описание | По умолчанию | Обязательная |
|---|---|---|---|
TOKEN_SECRET_KEY |
64-символьная hex-строка для AES-256-GCM | — | Да |
PORT |
Порт сервера | 3000 |
Нет |
APP_VERSION |
Версия приложения Kaspi Pay | 4.110.1 |
Нет |
APP_BUILD |
Номер сборки | 1099 |
Нет |
APP_PLATFORM |
Платформа устройства | iOS |
Нет |
APP_PLATFORM_VER |
Версия ОС | 18.5 |
Нет |
APP_LOCALE |
Локаль | ru-RU |
Нет |
APP_MODEL |
Модель устройства | iPhone17,3 |
Нет |
APP_BRAND |
Бренд устройства | Apple |
Нет |
APP_DEVICE_NAME |
Имя устройства | iPhone |
Нет |
APP_SCREEN_W |
Ширина экрана | 393.0 |
Нет |
APP_SCREEN_H |
Высота экрана | 852.0 |
Нет |
APP_CFNETWORK |
Версия CFNetwork | CFNetwork/3826.500.131 |
Нет |
APP_DARWIN |
Версия Darwin | Darwin/24.5.0 |
Нет |
⚠️ ПараметрыAPP_*соответствуют реальному клиенту Kaspi Pay. API Kaspi валидирует эти значения и может отклонить запросы с неизвестными параметрами. Обновляйте их при выходе новой версии приложения.
npm run regen:keypair # Перегенерация ECDSA-ключей
npm run regen:device # Перегенерация идентификатора устройстваСтарые файлы сохраняются как .bak. После ротации существующие сессии становятся недействительными.
В папке public/ находится встроенный веб-интерфейс (SPA), который запускается автоматически вместе с сервером и доступен по адресу http://localhost:3000.
Возможности интерфейса:
- 🔐 Авторизация — вход по номеру телефона кассира Kaspi Pay через 3-шаговый SMS-flow (ввод номера → OTP-код → завершение)
- 🧾 Выставление счёта — создание счёта по номеру телефона клиента с указанием суммы и комментария
- 📱 QR-оплата — генерация QR-кода для оплаты с отслеживанием статуса в реальном времени
- 📋 История операций — просмотр списка транзакций с детализацией
- 💰 Продажи и возвраты — статистика продаж и оформление возвратов
Файлы:
| Файл | Описание |
|---|---|
public/index.html |
HTML-разметка и стили интерфейса |
public/app.js |
Клиентская логика (API-вызовы, управление состоянием) |
Интерфейс предназначен для демонстрации и тестирования API. Для продакшена рекомендуется использовать собственный фронтенд.
Подробная документация по всем эндпоинтам API: docs/API.md.
📗 Документация также доступна на казахском языке: README.kk.md | docs/API.kk.md
# Линтинг
npm run lint
# Форматирование
npm run format
# Тесты
npm testЭтот проект распространяется под лицензией MIT.
Мы приветствуем вклад сообщества! Пожалуйста, ознакомьтесь с CONTRIBUTING.md перед созданием pull request.