Перейти к содержимому

Быстрый старт

Это обычный способ подключить Invoise к сайту или бэкенду: человек входит в интерфейс, настраивает магазин, а сервер дальше работает с API по ключу.

Делаете агента, который работает без браузера и без почты? Вам в раздел Вход агента. Эта страница исходит из того, что настройку делает человек.

Откройте platform.invoise.me и войдите по коду на почту или через Google. При первом входе создаётся мерчант; магазинов у него ещё нет, поэтому создайте один.

Магазину нужен получатель — кошелёк, на который приходят деньги, — либо магазин платит в ваш кошелёк Invoise. Получателя и необязательного делегата можно изменить позже; уже созданные инвойсы и адреса сохраняют значения на момент создания.

Хотите потренироваться без реальных средств — создайте sandbox-магазин. См. Sandbox.

В магазине создайте ключ с правами read и write. Он начинается с ivk_ и показывается один раз, поэтому сохраните его сразу.

Сервер передаёт его в каждом запросе:

Authorization: Bearer ivk_...

Ключ работает только для одного магазина и не может тронуть аккаунт или команду. См. API-ключи.

Окно терминала
curl https://platform.invoise.me/api/v1/networks

Возьмите chain_id, адрес токена и decimals из ответа. Выберите сеть, включённую для мерчанта, и готовый токен. Доступные активы меняются; не зашивайте их список в код. См. Сети и токены.

Суммы — целочисленные строки в минимальных единицах токена. При 6 знаках 10000000 — это 10 токенов.

Перед запросом задайте переменные окружения:

Переменная Значение
CHAIN_ID chain_id выбранной сети из API.
TOKEN_ADDRESS tokens[].address выбранного токена в этой сети.
AMOUNT Сумма инвойса в минимальных единицах, рассчитанная по tokens[].decimals.
Окно терминала
curl -X POST https://platform.invoise.me/api/v1/shops/{shop_id}/invoices \
-H 'Authorization: Bearer ivk_...' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 2a8b1f47-6d0c-4a1f-8f0b-4f2c9f3a77d2' \
-d "{\"chain_id\":${CHAIN_ID:?},\"token\":\"${TOKEN_ADDRESS:?}\",\"amount\":\"${AMOUNT:?}\"}"

Замените {shop_id} на ID магазина. Создайте и сохраните уникальный Idempotency-Key для этого инвойса; ключ в примере — только образец.

В ответе 202 Accepted сохраните id как issuance_id. Код 202 означает принятие запроса на создание, а не оплату клиентом.

Нужен многоразовый адрес для пополнений без фиксированной суммы? Вызовите /deposits. См. Депозиты и инвойсы.

Окно терминала
curl https://platform.invoise.me/api/v1/shops/{shop_id}/issuances/{issuance_id} \
-H 'Authorization: Bearer ivk_...'

Опрашивайте, пока не вернётся адрес, и отправьте плательщика на payment_url из этого ответа. Это готовая платёжная страница — адрес, QR-код и статус там уже есть.

Инвойс оплачен, когда его statusfunded или settled. При funded нужная сумма уже подтверждена, при settled инвойс закрыт в блокчейне. Статус можно получить через API, а об изменении узнать через вебхук.

До первого платежа зарегистрируйте адрес вашего сервера:

Окно терминала
curl -X POST 'https://platform.invoise.me/api/v1/shops/{shop_id}/webhooks' \
-H 'Authorization: Bearer ivk_...' \
-H 'Idempotency-Key: <saved-webhook-key>' \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com/invoise","filters":["transfer","invoice","payout"]}'

Замените URL на свой публичный HTTPS-адрес и сохраните secret из ответа.

  1. При получении события проверьте Invoise-Signature с этим секретом и отсейте повторы по Invoise-Event-ID. Пример проверки подписи.
  2. transfer.confirmed сообщает о подтверждённом входящем переводе. Возьмите data.issuance_id и запросите статус инвойса через GET ниже: один перевод может покрывать лишь часть суммы.
  3. Если statusfunded или settled и cancelled_at равен null, учтите оплату инвойса в вашей системе один раз. Событие payout.confirmed отдельно подтверждает полный учёт пейаута получателю.

Запросите состояние инвойса с вашего сервера:

Окно терминала
curl 'https://platform.invoise.me/api/v1/shops/{shop_id}/issuances/{issuance_id}' \
-H 'Authorization: Bearer ivk_...'

Важные поля ответа при оплате:

{
"status": "funded",
"amount": "10000000",
"received": "10000000",
"cancelled_at": null
}

Здесь вся сумма инвойса подтверждена. Учтите оплату инвойса в вашей системе; повторный GET или вебхук не должен зачислить его второй раз.

При open продолжайте ждать: оплата ещё не пришла полностью. Можно опрашивать раз в 3–5 секунд и увеличивать интервал при долгом ожидании. registering и reconciling также не означают успех. Если cancelled_at заполнен, обработайте оплату отменённого инвойса отдельно.

Все состояния и особенности депозитов — в статусе инвойса и депозита.

Создание инвойса или депозита требует Idempotency-Key. Сохраните ключ: если запрос отвалился по таймауту и непонятно, прошёл он или нет, отправьте тот же запрос с тем же ключом. Вернётся исходный результат, а не второй инвойс. См. Идемпотентность и ошибки.