Перейти к основному содержанию

Documentation Index

Fetch the complete documentation index at: https://docs.crypto-cash.world/llms.txt

Use this file to discover all available pages before exploring further.

Fiat Module

Примечание: все числовые значения, суммы, курсы и идентификаторы в примерах являются иллюстративными и приведены только для демонстрации. Реальные значения зависят от рыночных условий, конфигурации аккаунта и параметров конкретной транзакции.

Обзор

Fiat Module — это подсистема платформы CryptoCash, которая позволяет мерчанту принимать фиатные платежи от конечных пользователей и получать криптовалюту на свой кошелёк. Интеграция выполняется через подписанные API-запросы. Платежи проводятся через платёжного провайдера (Mercuryo). Конечный пользователь завершает оплату в виджете CryptoCash, где выбирает способ оплаты. После обработки платежа мерчант получает webhook с финальным статусом. Поддерживаемые возможности:
  • Оплата картой, Apple Pay, Google Pay, SEPA и другие способы оплаты
  • Подписанные запросы (ED25519 или LEGACY/SHA256) для аутентификации мерчанта
  • Webhook-и мерчанту при каждом изменении статуса транзакции
  • Автоматический расчёт заработка мерчанта на основе partner_fee

Высокоуровневый сценарий

1. Мерчант отправляет подписанный API-запрос → получает URL для оплаты
2. Пользователь открывает URL → видит виджет CryptoCash
3. Пользователь выбирает способ оплаты
4. Платёжный провайдер обрабатывает платёж
5. Мерчант получает webhook при каждой смене статуса
6. После успешной оплаты автоматически рассчитывается заработок мерчанта
Два пути оплаты в виджете:
Способ оплатыСценарий
Apple Pay (native)Пользователь оплачивает прямо в виджете — без редиректа на внешнюю страницу
Карта / другие способыПользователь редиректится на страницу платёжного провайдера для завершения оплаты
Подробное описание native-сценария Apple Pay см. в разделе Apple Native Pay.

Настройка мерчанта и Fiat API Key

Что настраивает мерчант

После того как администратор подготовил аккаунт, мерчант генерирует Fiat API Key в личном кабинете. При создании ключа задаются параметры, которые применяются ко всем платежам, связанным с этим ключом:
ПараметрОписание
keyTypeАлгоритм подписи: ED25519 (рекомендуется) или LEGACY (SHA256)
keyNameПроизвольное название ключа
partnerFeeДоля комиссии провайдера, которая идёт мерчанту; настраивается администратором на provider-аккаунте
paymentMethodsСпособы оплаты, доступные в виджете (например, ["card", "apple_pay"])
webhookUrlURL для получения webhook о статусах платежей
logoUrlЛоготип мерчанта, отображаемый в виджете
ipRestrictionEnabledОграничивать ли API-доступ по IP-адресу
allowedIpAddressesСписок разрешённых IP-адресов или CIDR-диапазонов
expiresAtКонкретная дата истечения ключа
neverExpiresЕсли true, ключ не истекает (expiresAt = null); по умолчанию срок действия ключа — 1 год
В ответе возвращается пара publicKey / privateKey. Приватный ключ хранится на платформе в зашифрованном виде и показывается мерчанту только один раз — при создании. Сохраните его сразу.
Если на аккаунте мерчанта включена двухфакторная аутентификация, для генерации ключа потребуется подтверждение 2FA.

Поля Fiat API Key

ПолеТипОписание
publicKeystringИдентификатор ключа, передаётся в каждом запросе
privateKeystringСекрет для подписи запросов; на платформе хранится зашифрованным
keyTypeED25519 | LEGACYАлгоритм подписи
isActivebooleanАктивен ли ключ
expiresAtdatetime | nullВремя истечения (null — без срока)
paymentMethodsstring[]Разрешённые способы оплаты
webhookUrlstring | nullURL для доставки webhook
logoUrlstring | nullURL логотипа
ipRestrictionEnabledbooleanВключено ли ограничение по IP
allowedIpAddressesstring[]Разрешённые IP-адреса

ED25519 vs LEGACY

ED25519LEGACY
АлгоритмАсимметричная криптография (Ed25519)Подпись на основе SHA256
Связь ключейpublicKey математически выводится из privateKeypublicKey — идентификатор; privateKey — общий секрет, используемый при подписи
ВерификацияПодпись проверяется по publicKey без знания privateKeyПлатформа использует сохранённый privateKey для проверки подписи
РекомендуетсяДаТолько для совместимости со старыми интеграциями

Что проверяется при каждом запросе

При получении подписанного запроса платформа проверяет:
  • Ключ активен
  • Срок действия ключа не истёк
  • IP API-вызывающего (сервер мерчанта) входит в список разрешённых, если включено ограничение по IP
  • Подпись валидна для выбранного алгоритма
Важно: ограничение по IP применяется к адресу сервера, который делает API-запрос, а не к IP конечного пользователя в поле ip payload-а платежа.

Подписанные запросы

Все API-запросы мерчанта должны быть подписаны. Алгоритм подписи определяется значением keyType, выбранным при создании ключа.

Структура запроса

{
  "data": "<base64-encoded JSON payload>",
  "signature": "<base64-encoded signature>"
}
publicKey передаётся либо в заголовке x-public-key, либо внутри объекта data. Если присутствуют оба, приоритет у заголовка.

ED25519 (рекомендуется)

1. payload    → JSON.stringify(payload)
2. json       → Buffer.from(json, 'utf8').toString('base64')  → data
3. sign       → Ed25519.sign(Buffer.from(data), privateKeyBytes) → signatureBytes
4. signature  → signatureBytes.toString('base64')

LEGACY (SHA256)

1. payload    → JSON.stringify(payload)
2. json       → Buffer.from(json, 'utf8').toString('base64')  → data
3. hash       → SHA256(privateKey + data) → hashHex
4. signature  → Buffer.from(hashHex, 'utf8').toString('base64')

Полный пример

Payload для form/retrieve:
{
  "publicKey": "a1b2c3d4...",
  "fiatCurrency": "SGD",
  "fiatAmount": "100",
  "currency": "USDT",
  "network": "TRC20",
  "address": "TXxxx...",
  "ip": "203.0.113.5"
}
Итоговое тело подписанного запроса:
{
  "data": "eyJwdWJsaWNLZXkiOiJhMWIyYzNkNC4uLiIsImZpYXRDdXJyZW5jeSI6IlNHRCIsImZpYXRBbW91bnQiOiIxMDAiLCJjdXJyZW5jeSI6IlVTRFQiLCJuZXR3b3JrIjoiVFJDMjAiLCJhZGRyZXNzIjoiVFh4eHguLi4iLCJpcCI6IjIwMy4wLjExMy41In0=",
  "signature": "base64-encoded-signature"
}

Создание платежа — form/retrieve

Endpoint

POST /merchant/api/v1/pay-fiat/form/retrieve
Подписанный запрос. Подпись и IP проверяются до обработки запроса.

Запрос

Поле data подписанного запроса содержит следующий JSON:
ПолеТипОбязательноеОписание
tickerstring✓*Тикер крипто-актива и сети (например, "USDTTRC20")
currencystring✓*Код криптовалюты (например, "USDT")
networkstring✓*Сеть блокчейна (например, "TRC20")
fiatCurrencystringКод фиатной валюты (например, "SGD")
fiatAmountstringСумма в фиате как строка (например, "100")
addressstringАдрес кошелька для зачисления криптовалюты
ipstringIP-адрес конечного пользователя
emailstringE-mail клиента
redirectUrlstringURL, на который пользователя нужно вернуть после оплаты
langstringЯзык виджета (по умолчанию "en")
externalIdstringВнешний ID заказа на стороне мерчанта (должен быть уникальным в рамках ключа)
* Чтобы выбрать крипто-актив, передайте либо ticker, либо пару currency + network.

Ответ

{
  "code": 200,
  "data": {
    "item": {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "externalId": "order-123",
      "url": "https://buy.cryptocash.world/merchant/payment/550e8400-e29b-41d4-a716-446655440000"
    }
  }
}
ПолеОписание
idВнутренний UUID транзакции
externalIdВнешний ID из запроса либо null
urlURL виджета CryptoCash — на него нужно перенаправить пользователя

Что происходит после запроса

  1. Проверяется подпись и IP.
  2. Проверяется уникальность externalId в рамках ключа мерчанта.
  3. Сумма в фиате сверяется с минимально допустимой для выбранной валюты.
  4. Значение network нормализуется (без учёта регистра).
  5. Создаётся транзакция со статусом New.
  6. Генерируется URL виджета.
  7. Мерчанту отправляется webhook payment::created.
  8. Возвращаются id и url.

Виджет CryptoCash и страница провайдера

Виджет CryptoCashСтраница платёжного провайдера
URLhttps://buy.cryptocash.world/merchant/payment/{id}Генерируется внутри виджета
БрендингЛоготип мерчантаСтилистика провайдера
НазначениеВыбор способа оплаты, превью курса, native Apple PayПрямая обработка платежа
Мерчант всегда получает URL виджета CryptoCash. URL страницы провайдера формируется внутри виджета после выбора способа оплаты и мерчанту не возвращается.

Публичное API мерчанта

Получение платежа

POST /merchant/api/v1/pay-fiat/payments/retrieve
Подписанный запрос. Поле data содержит одно из:
{ "internalId": "550e8400-..." }
или
{ "externalId": "order-123" }
Ответ:
{
  "code": 200,
  "data": {
    "item": {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "externalId": "order-123",
      "status": "Paid",
      "fiatCurrency": "SGD",
      "fiatAmount": "100",
      "cryptoCurrency": "USDT",
      "network": "TRC20",
      "cryptoAmount": "73.21",
      "address": "TXxxx...",
      "hash": "blockchain-hash",
      "widgetUrl": "https://buy.cryptocash.world/merchant/payment/550e8400-...",
      "createdAt": "2026-04-16T10:00:00.000Z",
      "updatedAt": "2026-04-16T10:07:00.000Z"
    }
  }
}

Список платежей

POST /merchant/api/v1/pay-fiat/payments/list
Подписанный запрос. Поле data:
ПолеТипПо умолчаниюОписание
pagenumber1Номер страницы
pageSizenumber100Количество элементов на странице
dateAfterdatetimeФильтр: создано после этой даты
dateBeforedatetimeФильтр: создано до этой даты
Ответ:
{
  "code": 200,
  "data": {
    "items": [ /* массив платежей в той же структуре, что и retrieve */ ],
    "pagination": {
      "page": 1,
      "pageSize": 100,
      "total": 42
    }
  }
}

Списки валют

POST /merchant/api/v1/fiat-currencies/list
POST /merchant/api/v1/pay-fiat/crypto-currencies/list
Оба endpoint-а используют подписанные запросы. Минимальный payload в data:
{ "publicKey": "..." }
crypto-currencies/list возвращает доступные мерчанту криптовалюты вместе с сетями и тикерами. Значения из tickers можно передавать в form/retrieve вместо пары currency + network.

Поля ответа платежа

ПолеТипNullableОписание
idstringUUID транзакции
externalIdstringВнешний ID мерчанта
statusstringТекущий статус
fiatCurrencystringКод фиатной валюты
fiatAmountstringСумма в фиате
cryptoCurrencystringКод криптовалюты
networkstringСеть блокчейна
cryptoAmountstringПолученная сумма в крипто
addressstringАдрес кошелька
hashstringХеш транзакции в блокчейне
widgetUrlstringURL виджета
createdAtdatetimeВремя создания
updatedAtdatetimeВремя последнего обновления

Статусы транзакций

СтатусОписание
NewТранзакция создана, ожидаются действия пользователя
WaitingПлатёж принят и обрабатывается
PaidКриптовалюта отправлена на адрес кошелька
FailПлатёж завершился неуспешно
CanceledПлатёж отменён
Статусы выставляются платформой на основе событий платёжного провайдера. Мерчант не может изменить статус через API.

Обработка ошибок

Все ошибки API возвращаются в одном из двух форматов: Формат A — кодированная ошибка:
{ "code": 2020, "message": "..." }
Формат B — список ошибок (используется при ошибках декодирования):
{ "errors": [2010] }

Коды ошибок

КодОписание
1000Bad request
1102Невалидный запрос (неподдерживаемая сеть, сумма ниже минимальной, дублирование externalId)
1110Ошибка валидации запроса
2010Ошибка декодирования data
2011Ошибка декодирования signature
2020Неверная подпись
2021API key заблокирован
2030IP-адрес запрещён
3001Заказ не найден
3002Транзакция не найдена

Apple Pay

Виджет CryptoCash поддерживает native-сценарий Apple Pay: платёжная панель iOS открывается прямо в виджете без редиректа на внешнюю страницу. Подробное описание условий доступности native-режима, fallback-поведения и обработки ошибок см. в разделе Apple Native Pay.

Диаграммы

Общий сценарий оплаты