"""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"