pykaspi
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)
| File | Size | Uploaded | |
|---|---|---|---|
| pykaspi-0.1.2.tar.gz | 23.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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}
|