Fiat Module
Примечание: все числовые значения, суммы, курсы и идентификаторы в примерах являются иллюстративными и приведены только для демонстрации. Реальные значения зависят от рыночных условий, конфигурации аккаунта и параметров конкретной транзакции.
Обзор
Fiat Module — это подсистема платформы CryptoCash, которая позволяет мерчанту принимать фиатные платежи от конечных пользователей и получать криптовалюту на свой кошелёк. Интеграция выполняется через подписанные API-запросы. Платежи проводятся через платёжного провайдера (Mercuryo). Конечный пользователь завершает оплату в виджете CryptoCash, где выбирает способ оплаты. После обработки платежа мерчант получает webhook с финальным статусом. Поддерживаемые возможности:- Оплата картой, Apple Pay, Google Pay, SEPA и другие способы оплаты
- Подписанные запросы (
ED25519илиLEGACY/SHA256) для аутентификации мерчанта - Webhook-и мерчанту при каждом изменении статуса транзакции
- Автоматический расчёт заработка мерчанта на основе
partner_fee
Высокоуровневый сценарий
| Способ оплаты | Сценарий |
|---|---|
| Apple Pay (native) | Пользователь оплачивает прямо в виджете — без редиректа на внешнюю страницу |
| Карта / другие способы | Пользователь редиректится на страницу платёжного провайдера для завершения оплаты |
Настройка мерчанта и Fiat API Key
Что настраивает мерчант
После того как администратор подготовил аккаунт, мерчант генерирует Fiat API Key в личном кабинете. При создании ключа задаются параметры, которые применяются ко всем платежам, связанным с этим ключом:| Параметр | Описание |
|---|---|
keyType | Алгоритм подписи: ED25519 (рекомендуется) или LEGACY (SHA256) |
keyName | Произвольное название ключа |
partnerFee | Доля комиссии провайдера, которая идёт мерчанту; настраивается администратором на provider-аккаунте |
paymentMethods | Способы оплаты, доступные в виджете (например, ["card", "apple_pay"]) |
webhookUrl | URL для получения webhook о статусах платежей |
logoUrl | Логотип мерчанта, отображаемый в виджете |
ipRestrictionEnabled | Ограничивать ли API-доступ по IP-адресу |
allowedIpAddresses | Список разрешённых IP-адресов или CIDR-диапазонов |
expiresAt | Конкретная дата истечения ключа |
neverExpires | Если true, ключ не истекает (expiresAt = null); по умолчанию срок действия ключа — 1 год |
publicKey / privateKey. Приватный ключ хранится на платформе в зашифрованном виде и показывается мерчанту только один раз — при создании. Сохраните его сразу.
Если на аккаунте мерчанта включена двухфакторная аутентификация, для генерации ключа потребуется подтверждение 2FA.
Поля Fiat API Key
| Поле | Тип | Описание |
|---|---|---|
publicKey | string | Идентификатор ключа, передаётся в каждом запросе |
privateKey | string | Секрет для подписи запросов; на платформе хранится зашифрованным |
keyType | ED25519 | LEGACY | Алгоритм подписи |
isActive | boolean | Активен ли ключ |
expiresAt | datetime | null | Время истечения (null — без срока) |
paymentMethods | string[] | Разрешённые способы оплаты |
webhookUrl | string | null | URL для доставки webhook |
logoUrl | string | null | URL логотипа |
ipRestrictionEnabled | boolean | Включено ли ограничение по IP |
allowedIpAddresses | string[] | Разрешённые IP-адреса |
ED25519 vs LEGACY
ED25519 | LEGACY | |
|---|---|---|
| Алгоритм | Асимметричная криптография (Ed25519) | Подпись на основе SHA256 |
| Связь ключей | publicKey математически выводится из privateKey | publicKey — идентификатор; privateKey — общий секрет, используемый при подписи |
| Верификация | Подпись проверяется по publicKey без знания privateKey | Платформа использует сохранённый privateKey для проверки подписи |
| Рекомендуется | Да | Только для совместимости со старыми интеграциями |
Что проверяется при каждом запросе
При получении подписанного запроса платформа проверяет:- Ключ активен
- Срок действия ключа не истёк
- IP API-вызывающего (сервер мерчанта) входит в список разрешённых, если включено ограничение по IP
- Подпись валидна для выбранного алгоритма
Важно: ограничение по IP применяется к адресу сервера, который делает API-запрос, а не к IP конечного пользователя в поле ip payload-а платежа.
Подписанные запросы
Все API-запросы мерчанта должны быть подписаны. Алгоритм подписи определяется значениемkeyType, выбранным при создании ключа.
Структура запроса
publicKey передаётся либо в заголовке x-public-key, либо внутри объекта data. Если присутствуют оба, приоритет у заголовка.
ED25519 (рекомендуется)
LEGACY (SHA256)
Полный пример
Payload дляform/retrieve:
Создание платежа — form/retrieve
Endpoint
Запрос
Полеdata подписанного запроса содержит следующий JSON:
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
ticker | string | ✓* | Тикер крипто-актива и сети (например, "USDTTRC20") |
currency | string | ✓* | Код криптовалюты (например, "USDT") |
network | string | ✓* | Сеть блокчейна (например, "TRC20") |
fiatCurrency | string | ✓ | Код фиатной валюты (например, "SGD") |
fiatAmount | string | ✓ | Сумма в фиате как строка (например, "100") |
address | string | ✓ | Адрес кошелька для зачисления криптовалюты |
ip | string | ✓ | IP-адрес конечного пользователя |
email | string | — | E-mail клиента |
redirectUrl | string | — | URL, на который пользователя нужно вернуть после оплаты |
lang | string | — | Язык виджета (по умолчанию "en") |
externalId | string | — | Внешний ID заказа на стороне мерчанта (должен быть уникальным в рамках ключа) |
* Чтобы выбрать крипто-актив, передайте либо ticker, либо пару currency + network.
Ответ
| Поле | Описание |
|---|---|
id | Внутренний UUID транзакции |
externalId | Внешний ID из запроса либо null |
url | URL виджета CryptoCash — на него нужно перенаправить пользователя |
Что происходит после запроса
- Проверяется подпись и IP.
- Проверяется уникальность
externalIdв рамках ключа мерчанта. - Сумма в фиате сверяется с минимально допустимой для выбранной валюты.
- Значение
networkнормализуется (без учёта регистра). - Создаётся транзакция со статусом
New. - Генерируется URL виджета.
- Мерчанту отправляется webhook
payment::created. - Возвращаются
idиurl.
Виджет CryptoCash и страница провайдера
| Виджет CryptoCash | Страница платёжного провайдера | |
|---|---|---|
| URL | https://buy.cryptocash.world/merchant/payment/{id} | Генерируется внутри виджета |
| Брендинг | Логотип мерчанта | Стилистика провайдера |
| Назначение | Выбор способа оплаты, превью курса, native Apple Pay | Прямая обработка платежа |
Публичное API мерчанта
Получение платежа
data содержит одно из:
Список платежей
data:
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
page | number | 1 | Номер страницы |
pageSize | number | 100 | Количество элементов на странице |
dateAfter | datetime | — | Фильтр: создано после этой даты |
dateBefore | datetime | — | Фильтр: создано до этой даты |
Списки валют
data:
crypto-currencies/list возвращает доступные мерчанту криптовалюты вместе с сетями и тикерами. Значения из tickers можно передавать в form/retrieve вместо пары currency + network.
Поля ответа платежа
| Поле | Тип | Nullable | Описание |
|---|---|---|---|
id | string | UUID транзакции | |
externalId | string | ✓ | Внешний ID мерчанта |
status | string | Текущий статус | |
fiatCurrency | string | Код фиатной валюты | |
fiatAmount | string | Сумма в фиате | |
cryptoCurrency | string | Код криптовалюты | |
network | string | Сеть блокчейна | |
cryptoAmount | string | ✓ | Полученная сумма в крипто |
address | string | Адрес кошелька | |
hash | string | ✓ | Хеш транзакции в блокчейне |
widgetUrl | string | ✓ | URL виджета |
createdAt | datetime | Время создания | |
updatedAt | datetime | Время последнего обновления |
Статусы транзакций
| Статус | Описание |
|---|---|
New | Транзакция создана, ожидаются действия пользователя |
Waiting | Платёж принят и обрабатывается |
Paid | Криптовалюта отправлена на адрес кошелька |
Fail | Платёж завершился неуспешно |
Canceled | Платёж отменён |
Обработка ошибок
Все ошибки API возвращаются в одном из двух форматов: Формат A — кодированная ошибка:Коды ошибок
| Код | Описание |
|---|---|
1000 | Bad request |
1102 | Невалидный запрос (неподдерживаемая сеть, сумма ниже минимальной, дублирование externalId) |
1110 | Ошибка валидации запроса |
2010 | Ошибка декодирования data |
2011 | Ошибка декодирования signature |
2020 | Неверная подпись |
2021 | API key заблокирован |
2030 | IP-адрес запрещён |
3001 | Заказ не найден |
3002 | Транзакция не найдена |