Skip to main content

pykaspi

pykaspi terminal

Unofficial Python client for Kaspi Pay terminals

Python-библиотека для удалённой оплаты через Kaspi Pay. Ваше приложение создаёт счёт по номеру покупателя и получает банковский статус: оплачено, отклонено, истекло или ещё ожидает оплаты.

Это неофициальный клиент внутреннего API Kaspi Pay. Kaspi может менять протокол или запрашивать повторную авторизацию.

Если Kaspi отклонил текущую версию приложения, можно временно подставить проверенную пару fingerprint без обновления пакета:

PYKASPI_APP_VERSION=26.0921 PYKASPI_APP_BUILD=1115 \
  python -m pykaspi.cli --state ./secrets/kaspi-terminal.json --phone +770...

Установка

python -m pip install pykaspi

Один файл терминала

Всё, что нужно библиотеке для работы от имени кассира, находится в одном секретном JSON-файле. Не коммитьте этот файл и не передавайте его содержимое: он даёт доступ к терминалу.

Используйте тот же Python, в который установлен пакет:

python -m pykaspi.cli \
  --state ./secrets/kaspi-terminal.json \
  --phone +77000000000

CLI запросит только те шаги, которые потребует Kaspi: пароль, SMS-код или подтверждение в приложении. Повторный запуск этой же команды с тем же путём проверит и при возможности обновит существующий терминал.

Если Kaspi запросит Face Check, библиотека не сможет пройти его вместо человека. В таком случае завершите проверку в официальном приложении Kaspi Pay либо используйте кассира, которому Kaspi выдаёт поддерживаемый способ входа.

Использование в своём приложении

import asyncio

from pykaspi import KaspiTerminal


async def create_payment() -> None:
    terminal = KaspiTerminal.load("./secrets/kaspi-terminal.json")

    async with terminal.client() as kaspi:
        invoice = await kaspi.invoice.create(
            terminal.session,
            phone_number="+77000000001",
            amount=100,
            comment="Заказ #42",
        )
        if not invoice.ok or invoice.data is None:
            raise RuntimeError(invoice.message or "Kaspi не создал счёт")

        operation_id = invoice.data.id or invoice.data.qr_operation_id
        if operation_id is None:
            raise RuntimeError("Kaspi не вернул ID счёта")

        # Сохраните operation_id в БД до дальнейшего ожидания.
        result = await kaspi.invoice.wait_for_payment(
            terminal.session, operation_id, timeout=300
        )
        if result.event == "payment.success":
            print("Оплата подтверждена Kaspi")
        else:
            print(result.event, result.status)


asyncio.run(create_payment())

payment.success — единственный статус, подтверждающий оплату. Если получен payment.timeout, это не отказ и не истечение счёта: сохранённый operation_id надо проверить позже. При потере ответа создания не создавайте второй счёт, пока не проверите историю Kaspi Pay.

Для серверного продукта лучше сразу записывать operation_id в БД и проверять его отдельной фоновой задачей. Публикуйте событие только при переходе статуса, чтобы не отправить два одинаковых уведомления.

Методы

  • kaspi.invoice.create, details, cancel, wait_for_payment — удалённые счета.
  • kaspi.qr.create и status — Kaspi QR.
  • kaspi.history — история операций.
  • kaspi.refund — возврат, если Kaspi разрешает его для операции.

Номер покупателя принимается как 87000000000, +77000000000 или с пробелами. Сумма — положительное число в тенге, до двух знаков после запятой.

Проверка

При разработке самого пакета:

uv sync --all-groups
.venv/bin/python -m pytest -q

Release files for pykaspi 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pykaspi 0.1.2
File Size Uploaded
pykaspi-0.1.2.tar.gz 23.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pykaspi 0.1.2
File Interpreter ABI Platform
pykaspi-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 56.3 kB

Release files / pykaspi-0.1.2.tar.gz

Download URL pykaspi-0.1.2.tar.gz
Size 23.5 kB
Tags Source
SHA-256 checksum
How to use checksums
982f25991ce7945d9f1abd232842bf149a0fe11b94bc0bdacb834f52596d87ee
BLAKE2b-256 checksum
How to use checksums
ba36c5cfcff089c41b644edda7ca3c4271612d18397bb44430d25f171d4498fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pykaspi-0.1.2-py3-none-any.whl

Download URL pykaspi-0.1.2-py3-none-any.whl
Size 32.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b75426b1a95eacedfe614f3f7b22ffc15e18ca95bf55d2321a733f06e108923f
BLAKE2b-256 checksum
How to use checksums
2d90f6b81f1a041f95e4f905269d31fa93ab1f149b3ae57fd89157853c9bf291
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page