Интеграция DV.net с вашим Python‑приложением с помощью dv-net-client
Библиотека dv-net-client предоставляет удобный способ взаимодействовать с API DV.net напрямую из ваших Python‑приложений. Независимо от того, создаёте ли вы веб‑бэкенд, скрипт или любую другую систему на Python, этот клиент упрощает задачи, такие как создание платёжных запросов (инвойсов) и обработка обновлений статуса через вебхуки.
Это руководство проведёт вас через основные шаги для начала работы с dv-net-client.
Предварительные требования:
- Установленный Python 3.8 или выше.
- pip (установщик пакетов Python).
- Активная учётная запись DV.net.
- Базовые знания Python (включая asyncio, если используете асинхронный клиент).
Шаг 1: Установка клиентской библиотеки DV.net
Сначала установите пакет с помощью pip. Откройте терминал или командную строку и выполните:
pip install dv-net-client
Эта команда загрузит и установит последнюю версию клиентской библиотеки и её зависимости.
Шаг 2: Получение ваших учётных данных DV.net API
Для взаимодействия с API DV.net вам нужны три параметра из вашей учётной записи DV.net:
- API URL: Базовый URL вашего экземпляра DV.net (например, https://api.your-dv-instance.com).
- API Key: Ваш публичный API‑ключ.
- API Secret: Ваш приватный секрет API.
Сгенерировать эти учётные данные можно в панели управления аккаунтом DV.net, обычно в разделе «API Keys» или «Developer».
Важно: Храните ваш API Secret в безопасности и не публикуйте его в клиентском коде или открытых репозиториях.
Шаг 3: Инициализация клиента
Библиотека предлагает синхронный и асинхронный клиенты. Выберите тот, который подходит архитектуре вашего приложения.
Синхронный клиент:
Подходит для традиционных скриптов или веб‑фреймворков вроде Flask/Django, если не используете асинхронные представления.
from dv_net_client import Client
API_URL = "YOUR_DV_NET_API_URL" # Replace with your actual API URL
API_KEY = "YOUR_API_KEY" # Replace with your API Key
API_SECRET = "YOUR_API_SECRET" # Replace with your API Secret
# Initialize the synchronous client
client = Client(host=API_URL, api_key=API_KEY, api_secret=API_SECRET)
# You can now use the 'client' object to make API calls
# Example: Get available currencies
try:
currencies_response = client.get_currencies()
print("Available Currencies:", currencies_response.currencies)
except Exception as e:
print(f"An error occurred: {e}")Асинхронный клиент:
Идеален для приложений на asyncio, таких как FastAPI, Starlette, или асинхронные скрипты.
import asyncio
from dv_net_client import AsyncClient
API_URL = "YOUR_DV_NET_API_URL" # Replace with your actual API URL
API_KEY = "YOUR_API_KEY" # Replace with your API Key
API_SECRET = "YOUR_API_SECRET" # Replace with your API Secret
async def main():
# Initialize the asynchronous client
async_client = AsyncClient(host=API_URL, api_key=API_KEY, api_secret=API_SECRET)
# You can now use the 'async_client' object to make API calls
# Example: Get available currencies asynchronously
try:
currencies_response = await async_client.get_currencies()
print("Available Currencies:", currencies_response.currencies)
except Exception as e:
print(f"An error occurred: {e}")
finally:
# Important: Close the client session when done
await async_client.close()
if __name__ == "__main__":
asyncio.run(main())Шаг 4: Создание платёжного запроса (счёта)
Создание инвойса — распространённый сценарий. Вам нужно указать сумму, валюту и при желании ID заказа вашей системы.
from dv_net_client import Client
from dv_net_client.dto.merchant_client import CreateInvoiceDto # Import the DTO
# Assume 'client' is initialized as shown in Step 3
# Define the invoice details using the DTO
invoice_data = CreateInvoiceDto(
amount=10.50, # The amount for the invoice
currency_code="USD", # The fiat currency code (e.g., USD, EUR)
order_id="MY_ORDER_123", # Your internal order ID (optional but recommended)
description="Payment for Order #MY_ORDER_123" # Optional description
# Add other optional parameters like return_url, success_url if needed
)
try:
# Create the invoice
invoice_response = client.create_invoice(invoice_data)
print(f"Invoice created successfully!")
print(f"Invoice ID: {invoice_response.invoice_id}")
print(f"Payment URL: {invoice_response.payment_url}") # Redirect customer here
# Store invoice_response.invoice_id with your order MY_ORDER_123
# Redirect the user to invoice_response.payment_url
except Exception as e:
print(f"Failed to create invoice: {e}")(Для асинхронного клиента используйте await async_client.create_invoice(invoice_data) внутри асинхронной функции).
Шаг 5: Обработка вебхуков
Вебхуки необходимы для получения обновлений статуса платежей в режиме реального времени (например, когда инвойс оплачен). DV.net отправляет POST‑запросы на URL, который вы настраиваете в своём аккаунте DV.net.
Безопасность: Важно проверять, что входящие запросы вебхука действительно отправлены DV.net. Библиотека dv-net-client предоставляет утилиту для этого, используя Webhook Secret, который вы задаёте.
- Настройка вебхука в DV.net:
- Перейдите в Project -> Your project -> Edit.
- Скопируйте API key и secret key со страницы.
- Настройте webhook URLs для событий, которые хотите получать (например, Confirmed transactions, Unconfirmed transaction и Withdrawal).
- Проверка и обработка вебхука в вашем приложении:
from fastapi import FastAPI, Request, Header, HTTPException # Example using FastAPI
import uvicorn
from dv_net_client.utils import verify_webhook_signature # Utility for verification
from dv_net_client.mappers import WebhookMapper # Mapper to parse data
from dv_net_client.dto.webhook import WebhookType # Enum for webhook types
# --- Configuration ---
DV_NET_WEBHOOK_SECRET = "YOUR_WEBHOOK_SECRET" # Replace with your actual secret
app = FastAPI()
@app.post("/webhooks/dvnet") # Your Payload URL endpoint
async def handle_dvnet_webhook(request: Request, x_dv_signature: str = Header(None)):
if not x_dv_signature:
raise HTTPException(status_code=400, detail="Missing X-DV-Signature header")
# Get raw body bytes
raw_body = await request.body()
# 1. Verify the signature
if not verify_webhook_signature(
signature=x_dv_signature,
payload=raw_body,
secret=DV_NET_WEBHOOK_SECRET
):
print("Webhook signature verification failed!")
raise HTTPException(status_code=400, detail="Invalid signature")
print("Webhook signature verified successfully.")
# 2. Parse the webhook data
try:
webhook_data = WebhookMapper.map_webhook(raw_body.decode('utf-8')) # Decode bytes to string
except Exception as e:
print(f"Error parsing webhook data: {e}")
raise HTTPException(status_code=400, detail="Invalid webhook payload")
# 3. Process based on webhook type
print(f"Received webhook type: {webhook_data.type}")
if webhook_data.type == WebhookType.CONFIRMED:
# Payment is confirmed (equivalent to payment.completed or invoice.paid)
invoice_id = webhook_data.invoice_id
order_id = webhook_data.order_id # The order_id you sent when creating the invoice
print(f"Payment confirmed for Invoice ID: {invoice_id}, Order ID: {order_id}")
# --- Update your order status in your database here ---
# Find the order associated with 'order_id' or 'invoice_id'
# Mark the order as paid/completed.
# Maybe send a confirmation email to the customer.
pass
elif webhook_data.type == WebhookType.UNCONFIRMED:
# Payment detected but waiting for blockchain confirmations (optional handling)
invoice_id = webhook_data.invoice_id
print(f"Payment unconfirmed for Invoice ID: {invoice_id}")
# You might update the order status to "Pending Confirmation"
pass
elif webhook_data.type == WebhookType.WITHDRAWAL:
# Related to withdrawal operations, not typically invoice payments
print(f"Received withdrawal webhook: {webhook_data}")
pass
else:
# Handle other types or unknown types if necessary
print(f"Received unhandled webhook type: {webhook_data.type}")
pass
# Return a 2xx status code to acknowledge receipt
return {"status": "received"}
# --- Running the Server (Example) ---
# if __name__ == "__main__":
# uvicorn.run(app, host="0.0.0.0", port=8000)
# Remember to run this behind a proper web server (like Nginx) and use HTTPS in production.(В примере используется FastAPI, но функции verify_webhook_signature и WebhookMapper.map_webhook можно применять с Flask, Django или любым другим Python‑фреймворком. Вам потребуется адаптировать способ получения тела запроса и заголовков.)
Заключение
Библиотека dv-net-client предоставляет синхронные и асинхронные интерфейсы для взаимодействия с API DV.net, а также необходимые утилиты для проверки вебхуков. Следуя этим шагам, вы сможете интегрировать криптоплатежи DV.net в своё Python‑приложение эффективно и безопасно. Не забудьте обращаться к исходному коду библиотеки или документации для подробностей по всем доступным методам и DTO.