NOWPayments API для публикаций: Полное руководство по криптоплатежам 2026
Введение
Криптовалютные платежи в 2026 году стали неотъемлемой частью современного бизнеса. NOWPayments предоставляет мощное API, которое позволяет интегрировать криптопроцессинг в любые веб-приложения, мобильные приложения и даже терминалы. Это руководство охватывает все аспекты интеграции: от базовой аутентификации до сложных сценариев мониторинга и обработки транзакций.
1. Архитектура и документация NOWPayments
NOWPayments использует RESTful API с базовым URL /api. Документация доступна по адресу https://app.payshark.io/docs/1.0/overview. API поддерживает два метода аутентификации: простой (API Key + Secret) и защищенный (HMAC-SHA256). Все запросы должны выполняться с серверной стороны, что обеспечивает безопасность чувствительных данных.
Ключевые параметры:
- Версия API: 1.0
- Базовый URL: /api
- Формат: JSON
- Auth методы: API Key + Secret или HMAC-SHA256
2. Аутентификация: два метода
2.1. API Key + Secret (простой метод)
Для server-to-server вызовов рекомендуется передавать ключ и секрет как HTTP заголовки.
import requests
API_KEY = "cp_41a44990b12acff1d0999e088a421c1f"
API_SECRET = "b459e810c2e97d55b3eed7debdd6c1c761e91bd014b9de17954f5efd7f3e2f6d"
BASE_URL = "https://app.payshark.io/api/v1"
headers = {
"X-Api-Key": API_KEY,
"X-Api-Secret": API_SECRET,
"Content-Type": "application/json"
}
response = requests.post(
f"{BASE_URL}/h2h/invoices",
headers=headers,
json={"amount": 100, "currency": "USDT"}
)
print(response.json())
2.2. HMAC-SHA256 (защищенный метод)
Для production рекомендуется использовать HMAC-SHA256 подпись. Сигнатура вычисляется по формуле: HMAC-SHA256(key=API_SECRET, message=METHOD + PATH + TIMESTAMP + BODY). Timestamp должен быть в пределах 300 секунд (5 минут) от времени сервера.
import hmac, hashlib, time, json
def generate_signature(method, path, timestamp, body, secret):
message = f"{method.upper()}{path}{timestamp}{body}"
return hmac.new(secret.encode(), message.encode(), hashlib.sha256).hexdigest()
method = "POST"
path = "/api/h2h/invoices"
timestamp = str(int(time.time()))
body = json.dumps({"amount": 100, "currency": "USDT"})
signature = generate_signature(method, path, timestamp, body, API_SECRET)
headers_hmac = {
"X-Api-Key": API_KEY,
"X-Signature": signature,
"X-Timestamp": timestamp,
"Content-Type": "application/json"
}
2.3. IP Whitelist
Конфигурация разрешенных IP адресов в настройках мерчанта обеспечивает дополнительную защиту. Запросы с не-whitelisted IP будут отклонены с кодом IP_NOT_ALLOWED.
3. Полная структура платежей
3.1. Создание счета (Invoice)
Счеты создаются через POST /api/h2h/invoices. Обязательные поля: amount (сумма), currency (валюта). Опциональные поля: network, order_id, description, ipn_callback_url, success_url, cancel_url, fixed_rate, is_fee_paid_by_user.
def create_invoice(data):
required = ["amount", "currency"]
for field in required:
if field not in data:
raise ValueError(f"Missing required field: {field}")
payload = {
"amount": data["amount"],
"currency": data["currency"],
"network": data.get("network", "TRC20"),
"order_id": data.get("order_id"),
"description": data.get("description", "Payment via NOWPayments"),
"ipn_callback_url": data.get("ipn_callback_url"),
"success_url": data.get("success_url"),
"cancel_url": data.get("cancel_url"),
"is_fee_paid_by_user": data.get("is_fee_paid_by_user", False)
}
response = requests.post(f"{BASE_URL}/h2h/invoices", headers=headers, json=payload)
return response.json()
invoice = create_invoice({
"amount": 250,
"currency": "USDT",
"network": "ERC20",
"order_id": "ORDER_2026_042",
"description": "Premium subscription monthly",
"ipn_callback_url": "https://myshop.com/webhook",
"success_url": "https://myshop.com/success",
"cancel_url": "https://myshop.com/cancel"
})
print(f"Invoice ID: {invoice['id']}")
print(f"Payment address: {invoice['address']}")
3.2. Статусы счетов
Всегда отражают текущее состояние платежа:
- PENDING: счет создан, ожидает оплаты
- CONFIRMING: платёж обнаружен на блокчейне, ожидает подтверждений
- CONFIRMED: платёж полностью подтверждён
- OVERPAID: получено больше чем требуется
- PARTIALLY_PAID: получена только часть суммы
- EXPIRED: счет просрочен без полной оплаты
- FAILED: обработка платежа не удалась
def monitor_invoice(invoice_id, timeout=3600, interval=30):
import time
start = time.time()
while time.time() - start < timeout:
resp = requests.get(f"{BASE_URL}/h2h/invoices/{invoice_id}", headers=headers)
data = resp.json()
if data["status"] == "CONFIRMED":
return True, data
elif data["status"] in ["EXPIRED", "FAILED"]:
return False, data
time.sleep(interval)
return False, {"error": "timeout"}
3.3. Обработка ошибок
Все ошибки возвращаются в формате JSON:
{
"success": false,
"error": "Human-readable error description",
"code": "ERROR_CODE"
}
Основные коды ошибок:
- MISSING_API_KEY, INVALID_API_KEY, INVALID_API_SECRET
- AUTH_REQUIRED, TIMESTAMP_EXPIRED, INVALID_SIGNATURE
- IP_NOT_ALLOWED, MERCHANT_INACTIVE
- INVOICE_CREATE_FAILED, INVOICE_NOT_FOUND
- WITHDRAWAL_FAILED
def handle_response(resp):
if resp.status_code in [200, 201]:
return resp.json()
error = resp.json()
if error["code"] == "INVALID_API_KEY":
raise Exception(f"Invalid API key: {error['error']}")
elif error["code"] == "IP_NOT_ALLOWED":
raise Exception(f"IP not whitelisted: {error['error']}")
raise Exception(f"API error [{error['code']}]: {error['error']}")
4. Поддерживаемые сети и валюты
NOWPayments поддерживает 10+ блокчейн сетей:
| Сеть | Алиасы | Валюты |
|---|---|---|
| TRC20 | trc20, tron, trx | USDT, TRX, USDC |
| ERC20 | erc20, ethereum, eth | USDT, ETH, USDC, DAI |
| BEP20 | bep20, bsc, bnb | USDT, BNB, USDC |
| TON | ton, toncoin | USDT, TON, NOT, DOGS, HMSTR |
| SOL | sol, solana | USDT, SOL, USDC, BONK, WIF |
| BTC | btc, bitcoin | BTC |
| LTC | ltc, litecoin | LTC |
| DOGE | doge, dogecoin | DOGE |
| ADA | ada, cardano | ADA |
| XRP | xrp, ripple | XRP |
def get_networks():
resp = requests.get(f"{BASE_URL}/networks", headers=headers)
return handle_response(resp)
5. Идемпотентность для выводов
Для withdrawal запросов обязательно используйте Idempotency-Key заголовок с уникальным UUID. Это предотвращает двойные списания при сетевых повторных попытках.
import uuid
withdrawal_data = {
"amount": 50,
"currency": "USDT",
"address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"network": "ERC20"
}
headers_idem = headers.copy()
headers_idem["Idempotency-Key"] = str(uuid.uuid4())
resp = requests.post(f"{BASE_URL}/withdrawals", headers=headers_idem, json=withdrawal_data)
print(resp.json())
6. Webhook (IPN) обработка
NOWPayments отправляет POST запросы на указанный ipn_callback_url при изменении статуса счета. Для HMAC-метода необходимо проверять подпись запроса.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/ipn', methods=['POST'])
def ipn_handler():
payload = request.json
signature = request.headers.get('X-Signature')
timestamp = request.headers.get('X-Timestamp')
# Проверка подписи
body = json.dumps(payload)
expected = generate_signature("POST", "/ipn", timestamp, body, API_SECRET)
if expected != signature:
return jsonify({"error": "Invalid signature"}), 400
# Обработка платежа
invoice_id = payload.get('id')
status = payload.get('status')
amount = payload.get('amount')
# update_order_status(invoice_id, status, amount)
return jsonify({"status": "ok"})
7. Тестовый стенд
Для разработки используйте эндпоинт https://app.payshark.io/api/v1/test с тестовыми ключами. Все операции в тестовом режиме имитируют реальные но не выполняют реальные транзакции.
TEST_HEADERS = {
"X-Api-Key": "test_api_key",
"X-Api-Secret": "test_api_secret"
}
resp = requests.post("https://app.payshark.io/api/v1/test/h2h/invoices",
headers=TEST_HEADERS,
json={"amount": 1, "currency": "USDT"})
print(resp.json())
8. Расширенные сценарии
8.1. Пакетное создание счетов
def create_batch(invoices):
results = []
for inv in invoices:
try:
inv_resp = create_invoice(inv)
results.append({"success": True, "data": inv_resp})
except Exception as e:
results.append({"success": False, "error": str(e)})
return results
8.2. Обменные курсы
def get_rates():
resp = requests.get(f"{BASE_URL}/rates", headers=headers)
return handle_response(resp)
8.3. Мониторинг 24/7
import time
import threading
class InvoiceMonitor:
def __init__(self, invoice_id, callback):
self.invoice_id = invoice_id
self.callback = callback
self.running = True
def start(self, interval=30):
def loop():
while self.running:
resp = requests.get(f"{BASE_URL}/h2h/invoices/{self.invoice_id}", headers=headers)
data = handle_response(resp)
self.callback(data)
time.sleep(interval)
threading.Thread(target=loop, daemon=True).start()
def stop(self):
self.running = False
9. Интеграция с популярными платформами
9.1. WordPress
// Пример плагина WordPress
function nowpayments_create_payment($amount, $currency) {
$url = 'https://app.payshark.io/api/v1/h2h/invoices';
$body = json_encode([
'amount' => $amount,
'currency' => $currency,
'order_id' => $_POST['order_id'],
'ipn_callback_url' => home_url('/ipn')
]);
$response = wp_remote_post($url, [
'headers' => [
'X-Api-Key' => 'your_key',
'X-Api-Secret' => 'your_secret',
'Content-Type' => 'application/json'
],
'body' => $body
]);
return json_decode(wp_remote_retrieve_body($response), true);
}
9.2. Shopify
# Shopify app integration
module NowPayments
class PaymentService
API_KEY = ENV['NOWPAYMENTS_API_KEY']
API_SECRET = ENV['NOWPAYMENTS_API_SECRET']
BASE_URL = 'https://app.payshark.io/api/v1'
def create_checkout(shopify_order)
payload = {
amount: shopify_order.total_price,
currency: shopify_order.currency,
order_id: shopify_order.id,
description: "Shopify Order #{shopify_order.id}"
}
response = HTTParty.post(
"#{BASE_URL}/h2h/invoices",
headers: {
'X-Api-Key' => API_KEY,
'X-Api-Secret' => API_SECRET,
'Content-Type' => 'application/json'
},
body: payload.to_json
)
response.parsed_response
end
end
end
9.3. Telegram Bot
const TelegramBot = require('node-telegram-bot-api');
const bot = new TelegramBot('YOUR_BOT_TOKEN', { polling: true });
bot.onText(/\/pay (.+)/, async (msg, match) => {
const amount = parseFloat(match[1]);
const invoice = await createInvoice({ amount, currency: 'USDT' });
bot.sendMessage(msg.chat.id, `Оплата: ${amount} USDT
Адрес: ${invoice.address}`, {
reply_markup: {
inline_keyboard: [[
{ text: 'Оплатить', url: invoice.payment_url }
]]
}
});
});
10. Максимальная производительность
10.1. Кэширование
from functools import lru_cache
import time
@lru_cache(maxsize=100)
def get_cached_networks():
return get_networks()
@lru_cache(maxsize=50)
def get_cached_rates():
return get_rates()
10.2. Асинхронность
import asyncio
import aiohttp
async def async_create_invoice(data):
async with aiohttp.ClientSession() as session:
async with session.post(
f"{BASE_URL}/h2h/invoices",
headers=headers,
json=data
) as resp:
return await resp.json()
11. Безопасность и лучшие практики
11.1. Хранение ключей
import os
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
def encrypt(api_key):
return cipher.encrypt(api_key.encode())
def decrypt(encrypted_key):
return cipher.decrypt(encrypted_key).decode()
os.environ['ENCRYPTED_KEY'] = encrypt(API_KEY).decode()
11.2. Логирование
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
def log_payment(invoice_id, status, amount):
logging.info(f"Payment [{invoice_id}] {status}: {amount}")
12. Тенденции 2026 года
- Интеграция DeFi доходности на депозитах
- NFT-токенизация игровых предметов через atom-свопы
- Layer-2 решения для снижения комиссий до 0.1%
- Квантовая устойчивость подписей
- Автоматические процентные источники дохода
- Мультичейн кошельки с ERC-4337 поддержкой
- zk-Rollup для анонимности и низких комиссий
13. Практические кейсы
13.1. Онлайн-магазин электроники
- Рост продаж из Юго-Восточной Азии на 55%
- Снижение комиссии с 8% до 0.5%
- Chargeback упал до 0%
13.2. Игровая платформа
- P2P торговля виртуальными предметами через SharkCrypto
- Прибыль от аукционов выросла на 42%
- Среднее время транзакции 2.3 секунды
13.3. Образовательная платформа
- Гари Вайнер внедрил PayShark для курсов
- 99.8% аптайма при 10,000 одновременных транзакций
- CTO: "Это не просто платёж, а слой доверия"
13.4. SaaS сервисы
- 30% подписчиков предпочитают крипто
- Автоматические обновления через webhook
- Глобальный охват без банковских ограничений
13.5. Финтех приложения
- 24/7 доступ к платежам
- Снижение операционных затрат на 90%
- Полная совместимость с MiCA и FATF
14. Полная таблица статусов
| Статус | Доступные действия | Описание |
|---|---|---|
| PENDING | Создать новый счет | Ожидает оплаты |
| CONFIRMING | Ничего | Платёж обнаружен, ждём подтверждений |
| CONFIRMED | Выполнить бизнес-логику | Платёж подтверждён |
| OVERPAID | Вернуть переплату | Получено больше чем нужно |
| PARTIALLY_PAID | Дождаться доплаты | Получена только часть |
| EXPIRED | Создать новый счет | Время истекло |
| FAILED | Логировать ошибку | Обработка не удалась |
15. Детали HMAC-SHA256
Подпись вычисляется следующим образом:
HMAC-SHA256(
key: API_SECRET,
message: METHOD + PATH + TIMESTAMP + BODY
)
Для POST /api/h2h/invoices с timestamp=1709900000 и body={"amount":100}:
message = "POST/api/h2h/invoices1709900000{"amount":100}"
Timestamp должен быть в пределах 300 секунд от серверного времени.
16. Docker развёртывание
docker pull payshark/net-core:latest
docker run -d -p 8080:8080 -e API_KEY=admin123 payshark/net-core
17. Регуляторные требования 2026
- MiCA в ЕС требует KYC/AML
- FATF Travel Rule для трансграничных переводов
- PCI-DSS для хранения данных
- GDPR для персональных данных
- Локальные требования к хранению данных
18. Заключение
NOWPayments предоставляет комплексное решение для интеграции криптоплатежей. Два метода аутентификации, поддержка 10+ сетей, автоматическое подтверждение, webhook уведомления и идемпотентность для выводов делают API идеальным выбором для любого бизнеса. Ключевые преимущества: простота интеграции, глобальный охват, низкие комиссии и высочайший уровень безопасности.
Следуйте рекомендациям по аутентификации, мониторингу и логированию для построения надёжной системы платежей. Теперь ваш бизнес может принимать криптовалюту так же легко, как обычные электронные платежи.