Skip to main content

pykaspi

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

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

Установка

pip install pykaspi

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

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

Один раз создайте файл для кассира:

pykaspi-terminal-init \
  --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.1

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.1
File Size Uploaded
pykaspi-0.1.1.tar.gz 23.0 kB Details

Built distribution (wheel)

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

Total release size: 55.5 kB

Release files / pykaspi-0.1.1.tar.gz

Download URL pykaspi-0.1.1.tar.gz
Size 23.0 kB
Tags Source
SHA-256 checksum
How to use checksums
92893eab6002a8d55c7e93a86ac50d240e325fe93eefa9680ea9df3fc39af8aa
BLAKE2b-256 checksum
How to use checksums
944b5e7c87b584231cd8ddfa4afa772e492708e02e9cd2cf73f89e07a277c37b
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.1-py3-none-any.whl

Download URL pykaspi-0.1.1-py3-none-any.whl
Size 32.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
edf621deb9759e4bb59767d1249b15f23ad43fc549251a52e7980a42e8ba5bf6
BLAKE2b-256 checksum
How to use checksums
7d2a923e0652aa11b64de2bc6c37cfa2b916722d726bea3127789b272d6ee070
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

0.1.2

2 release files

This release

0.1.1 This release

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