Что можно принимать
Это нативный ATOM в Cosmos Hub, не все Cosmos SDK-сети и IBC-токены. Сканеру нужны индексированные события транзакций. Используй адрес счёта, не депозит биржи.
Настрой свой магазин
- Установи Wholly Crypto, создай проект и магазин и сохрани закрытую резервную копию кошелька.
- Проверь подключения для сканера и включи сеть и нужные активы в Store → Payment methods.
- Задай подтверждения и срок оплаты. Проверь небольшой счёт и убедись в завершении оплаты перед выполнением заказов.
Куда поступают платежи
У счетов отдельные адреса. Сохрани полную копию, список адресов и пути деривации: импортированный кошелёк может найти не все адреса сразу.
Как принимать платежиПереводи средства, когда готов
Отправка и автосбор поддерживают нативную монету. Оставь средства на комиссии, резерв и хранение. Поддержка приёма не означает, что провайдер умеет отправлять транзакции.
Руководство по автосборуПроблемы с платежами
Сначала проверь эту сеть
Используй нативный ATOM Cosmos Hub, не IBC-токен другой зоны. Отправка поддерживает адреса без обязательного memo; никогда не пропускай memo, требуемое биржей.
Платёж не найден или задерживается
Сверь сеть, адрес, актив и обязательную ссылку со счётом. Проверь сканер и подтверждения. Не проси повторную оплату, пока не проверена первая транзакция.
Как принимать платежиВосстановление кошельков и сбор средств
Храни закрытую резервную копию и пути деривации. Другой кошелёк может показать не все адреса. Отправка и восстановление зависят от сети и формата; одни слова восстановления ничего не гарантируют.
Резервные копии и восстановлениеКомиссии и проверка
Стандартная комиссия: 1% от фиатной суммы счёта, списывается с отдельного баланса кредитов. Действует твой назначенный тариф. Сеть и сервер оплачиваются отдельно.
Публичные провайдеры могут сбоить или ограничивать запросы. Отправленная транзакция или перенаправление не доказывают оплату. Используй проверенный статус счёта и подписанные уведомления.
Кредиты на обработку API, IPN и вебхукиКалькулятор курсов
Пересчитать сумму
Это оценка, а не платёжная котировка. Сетевые и биржевые комиссии, а также наценка продавца не включены.
Откуда берутся курсы?
Криптовалютные оценки используют кешированные публичные цены Kraken и, где доступны, Binance. Для некоторых цен Binance USDT используется как ориентир USD. Фиатные курсы берутся из Frankfurter: это ежедневные справочные значения, а не текущие торговые котировки.
Снимок данных обновляется автоматически. Проверь даты источников под результатом. Введённая сумма остаётся в браузере. Наличие актива в списке не гарантирует поддержку оплаты.
Kraken · Binance · Frankfurter · Названия и иконки активов: CoinGecko
Создай счёт через API
Запускай примеры на сервере. Замени API-хост, ID проекта и магазина. Храни ключ в секрете. Суммы передаются десятичными строками.
Сначала включи метод в магазине. Выбор сужает активные методы, но не добавляет активы. Если совпадений нет, используются настройки магазина. Проверь возвращённые методы перед показом оплаты.
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "cosmos",
"asset_tickers": [
"ATOM"
]
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "cosmos",
"asset_tickers": [
"ATOM"
]
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "cosmos",
"asset_tickers": [
"ATOM"
]
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "cosmos",
"asset_tickers": [
"ATOM"
]
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))