91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
"""Heleket payment integration."""
|
|
|
|
import logging
|
|
from typing import Optional
|
|
import aiohttp
|
|
|
|
from config.settings import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class HelketPayment:
|
|
"""Heleket payment gateway. Принимает сумму в рублях напрямую."""
|
|
|
|
BASE_URL = "https://api.heleket.com/v1"
|
|
|
|
def __init__(self):
|
|
self.api_key = settings.HELEKET_API_KEY
|
|
self.shop_id = settings.HELEKET_SHOP_ID
|
|
self._mock = not (self.api_key and self.shop_id)
|
|
|
|
async def create_invoice(self, amount_rub: int, order_id: str) -> Optional[dict]:
|
|
"""
|
|
Создаёт счёт на сумму в рублях.
|
|
Возвращает dict: payment_id, address, url. None при ошибке.
|
|
"""
|
|
if self._mock:
|
|
return {
|
|
"payment_id": f"mock_{order_id}",
|
|
"address": None,
|
|
"url": None,
|
|
"mock": True,
|
|
}
|
|
|
|
try:
|
|
async with aiohttp.ClientSession() as session:
|
|
payload = {
|
|
"shop_id": self.shop_id,
|
|
"amount": str(amount_rub),
|
|
"currency": "RUB",
|
|
"order_id": order_id,
|
|
"url_return": "",
|
|
"url_callback": "",
|
|
}
|
|
headers = {"merchant": self.api_key, "Content-Type": "application/json"}
|
|
async with session.post(
|
|
f"{self.BASE_URL}/payment",
|
|
json=payload,
|
|
headers=headers,
|
|
timeout=aiohttp.ClientTimeout(total=15),
|
|
) as resp:
|
|
data = await resp.json()
|
|
if data.get("state") == 0:
|
|
r = data.get("result", {})
|
|
return {
|
|
"payment_id": r.get("uuid"),
|
|
"address": r.get("address"),
|
|
"url": r.get("url"),
|
|
"mock": False,
|
|
}
|
|
logger.error(f"Heleket create error: {data}")
|
|
return None
|
|
except Exception as e:
|
|
logger.error(f"Heleket request error: {e}")
|
|
return None
|
|
|
|
async def check_status(self, payment_id: str) -> str:
|
|
"""Возвращает: 'paid' | 'pending' | 'expired' | 'error'"""
|
|
if payment_id.startswith("mock_"):
|
|
return "pending"
|
|
try:
|
|
async with aiohttp.ClientSession() as session:
|
|
headers = {"merchant": self.api_key}
|
|
async with session.get(
|
|
f"{self.BASE_URL}/payment/info/{payment_id}",
|
|
headers=headers,
|
|
timeout=aiohttp.ClientTimeout(total=15),
|
|
) as resp:
|
|
data = await resp.json()
|
|
if data.get("state") == 0:
|
|
status = data.get("result", {}).get("status", "")
|
|
if status == "paid":
|
|
return "paid"
|
|
if status in ("cancel", "expired"):
|
|
return "expired"
|
|
return "pending"
|
|
return "error"
|
|
except Exception as e:
|
|
logger.error(f"Heleket check error: {e}")
|
|
return "error"
|