Hosted-checkout с вашим брендингом, прямой карточный API с 3-D Secure, вебхуки с HMAC-подписью и сверка. Один договор, одна интеграция.
# Create a payment session
curl -X POST \
https://api.calibripay.com/api/v1/payment-sessions \
-H "X-Access-Key: $CALIBRIPAY_ACCESS_KEY" \
-H "X-Signature: $HMAC_SHA256" \
-H "Idempotency-Key: order-20260817-001" \
-d '{
"order_id": "order-20260817-001",
"amount_minor": 1001,
"currency": "EUR",
"return_url": "https://shop.example/return"
}'Страница оплаты на pay.calibripay.com: карточные данные не касаются вашего backend, PCI-скоуп остаётся у нас. Логотип и акцентный цвет — ваши.
Про white-label →H2H-приём карт для мерчантов со своим PCI DSS: 3-DS 2, OTP-шаги и статусная модель из 13 состояний с явным признаком final.
Справочник API →Выплаты на карты, рекуррентные списания по расписанию, возвраты — полные и частичные — через тот же подписанный API.
Выплаты в доках →Доставка at-least-once с HMAC-подписью каждого события. Дедупликация по X-Webhook-Id, ретраи с backoff, replay из кабинета.
Каждый POST несёт Idempotency-Key. Потерянный ответ повторяется безопасно: вторая операция не создаётся никогда.
Выгрузки платежей и выплат по расписанию, суммы в минорных единицах, статусы с признаком финальности — реестр сходится сам.
Создайте API-ключ в кабинете. secret_key показывается один раз — храните его в secret manager, отдельным ключом на каждый сервис.
# secret manager, не репозиторий
CALIBRIPAY_ACCESS_KEY=<access_key>
CALIBRIPAY_SECRET_KEY=<secret_key>
# secret_key показывается один раз, восстановить нельзя — только ротацияКаноническая строка из шести строк: метод, путь, timestamp, nonce, Idempotency-Key и SHA-256 тела. Подпись — HMAC-SHA256.
# canonical string (6 lines)
POST\n/api/v1/payment-sessions\n1755436800
\n<nonce>\n<idempotency-key>\n<sha256(body)>
X-Signature: hmac_sha256(secret, canonical)Проверьте X-Webhook-Signature constant-time, дедуплицируйте по X-Webhook-Id и считайте оплату успешной только при status=succeeded и final=true.
# webhook handler
verify(sig, ts + "." + raw_body)
if seen(webhook_id): return 200
ok = status == "succeeded" and finalРасчёты — T+1 по рабочим дням для карточных операций. Статус succeeded с final=true означает, что деньги зафиксированы за вами; выплата на расчётный счёт идёт по расписанию вашего договора.
Ключи создаются в кабинете, интеграция идёт по подписанному контракту Client API.