Документация / Справочник
Клиенты и примеры
Каждый клиент — один файл без внешних зависимостей. Скопируйте его в проект — и у вас есть подпись запросов, создание и чтение счёта и проверка вебхука.
Node.js
Node 22+. Классы CoineticClient, CoineticError, функция verifyWebhook.
PHP
PHP 8.1+, расширения curl и json. \Cryptopay\Client, \Cryptopay\verify_webhook.
Python
Python 3.9+, только стандартная библиотека. CoineticClient, verify_webhook.
Что внутри
| Функция | Node.js | PHP | Python | Go |
|---|---|---|---|---|
| Подпись запроса | signRequest | sign_request | sign_request | SignRequest |
| Создать счёт | createInvoice | createInvoice | create_invoice | CreateInvoice |
| Получить счёт | getInvoice | getInvoice | get_invoice | GetInvoice |
| Проверить вебхук | verifyWebhook | verify_webhook | verify_webhook | VerifyWebhook |
| Статусы «можно выдавать» | PAID_STATUSES | PAID_STATUSES | PAID_STATUSES | PaidStatuses |
Технические имена файлов и классов (cryptopay.*, CryptopayClient) — исторические и не меняются; в Node.js и Python есть псевдонимы CoineticClient и CoineticError.
Все четыре проверены на одних эталонах
Подписи запросов и вебхуков у всех клиентов совпадают с эталонными значениями. Пишете клиент на другом языке — сначала добейтесь совпадения с ними: так быстрее всего найти ошибку в подписи.
Минимальный поток
псевдокод
invoice = client.createInvoice({order_id, price_amount: "3.00", price_currency: "USD",
return_url: "https://shop.example/orders/42"},
idempotencyKey = "order-42")
redirect(invoice.checkout_url)
on POST /webhooks/coinetic (raw body!):
event = verifyWebhook(WEBHOOK_SECRET, headers, rawBody) # иначе 400/401
if seen(event.id): return 200 # повторная доставка
inv = client.getInvoice(event.data.invoice_id) # перепроверка
if inv.status in PAID_STATUSES: grantOnce(inv.order_id)
return 200Чего клиенты не делают
- Не хранят секреты — ключ и секрет передаются извне, из переменных окружения или секрет-менеджера.
- Не хранят обработанные
X-Webhook-Id— это ваша база. - Не превращают суммы в числа: все суммы — строки.
- Не повторяют запросы сами — повторяйте с тем же
Idempotency-Keyпри429,5xxи сетевых ошибках. - Не работают в браузере и мобильном приложении — только на сервере: там живёт секрет.