Перейти до основного вмісту

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Секрет для підпису запитів; на платформі зберігається зашифрованим
keyTypeED25519LEGACYАлгоритм підпису
isActivebooleanЧи активний ключ
expiresAtdatetimenullЧас закінчення дії (null — без строку)
paymentMethodsstring[]Дозволені способи оплати
webhookUrlstringnullURL для доставки webhook
logoUrlstringnullURL логотипа
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 https://buy.crypto-cash.world/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 https://buy.cryptocash.world/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 https://buy.cryptocash.world/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 https://buy.cryptocash.world/merchant/api/v1/fiat-currencies/list
POST https://buy.cryptocash.world/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.

Діаграми

Загальний сценарій оплати