Документация / Справочник

Клиенты и примеры

Каждый клиент — один файл без внешних зависимостей. Скопируйте его в проект — и у вас есть подпись запросов, создание и чтение счёта и проверка вебхука.

Node.js

Node 22+. Классы CoineticClient, CoineticError, функция verifyWebhook.

Скачать cryptopay.js ↓

PHP

PHP 8.1+, расширения curl и json. \Cryptopay\Client, \Cryptopay\verify_webhook.

Скачать Cryptopay.php ↓

Python

Python 3.9+, только стандартная библиотека. CoineticClient, verify_webhook.

Скачать cryptopay.py ↓

Go

Go 1.22+, только стандартная библиотека. Пакет cryptopayclient.

Скачать cryptopay.go ↓

Что внутри

ФункцияNode.jsPHPPythonGo
Подпись запросаsignRequestsign_requestsign_requestSignRequest
Создать счётcreateInvoicecreateInvoicecreate_invoiceCreateInvoice
Получить счётgetInvoicegetInvoiceget_invoiceGetInvoice
Проверить вебхукverifyWebhookverify_webhookverify_webhookVerifyWebhook
Статусы «можно выдавать»PAID_STATUSESPAID_STATUSESPAID_STATUSESPaidStatuses

Технические имена файлов и классов (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 и сетевых ошибках.
  • Не работают в браузере и мобильном приложении — только на сервере: там живёт секрет.