fix rates for wata payments

This commit is contained in:
Max Shalenkov
2025-08-01 19:56:13 +04:00
parent e9ff8d851e
commit adfb556259
+56 -13
View File
@@ -265,20 +265,63 @@ async def generate_wata_payment_link(amount, tg_id, cassa):
}
if cassa["name"] == "int":
import json
import xml.etree.ElementTree as ET
from datetime import datetime
async def get_usd_rate():
url = "https://api.exchangerate.host/latest?base=RUB&symbols=USD"
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=10) as resp:
data = await resp.json()
return data["rates"]["USD"]
usd_rate = await get_usd_rate()
rub_per_usd = 1 / usd_rate
rub_per_usd_plus_5 = rub_per_usd + 5
new_usd_rate = 1 / rub_per_usd_plus_5
amount_usd = round(float(amount) * new_usd_rate, 2)
data["amount"] = amount_usd
data["currency"] = "USD"
# Используем API Центробанка России для получения курса USD
# Формат: сколько рублей стоит 1 доллар
today = datetime.now().strftime("%d/%m/%Y")
url = f"http://www.cbr.ru/scripts/XML_daily.asp?date_req={today}"
try:
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=15) as resp:
if resp.status == 200:
xml_content = await resp.text()
root = ET.fromstring(xml_content)
# Ищем курс USD (код R01235)
for valute in root.findall('Valute'):
char_code = valute.find('CharCode')
if char_code is not None and char_code.text == 'USD':
value_elem = valute.find('Value')
if value_elem is not None:
# Заменяем запятую на точку для корректного парсинга float
usd_rub_rate = float(value_elem.text.replace(',', '.'))
# Конвертируем в курс RUB к USD (сколько USD стоит 1 RUB)
rub_usd_rate = 1 / usd_rub_rate
logger.info(f"Successfully got USD rate from CBR: 1 USD = {usd_rub_rate} RUB, 1 RUB = {rub_usd_rate} USD")
return rub_usd_rate
logger.warning("USD rate not found in CBR response")
except Exception as e:
logger.error(f"Failed to get USD rate from CBR: {e}")
# Fallback значение если API ЦБ недоступен
fallback_rate = 0.0105 # Примерно 1 RUB = 0.0105 USD
logger.warning(f"Using fallback USD rate: {fallback_rate}")
return fallback_rate
try:
usd_rate = await get_usd_rate()
rub_per_usd = 1 / usd_rate
rub_per_usd_plus_5 = rub_per_usd + 5
new_usd_rate = 1 / rub_per_usd_plus_5
amount_usd = round(float(amount) * new_usd_rate, 2)
data["amount"] = amount_usd
data["currency"] = "USD"
except Exception as e:
logger.error(f"Failed to convert RUB to USD: {e}")
# В случае критической ошибки используем примерный курс
fallback_usd_rate = 0.0105
rub_per_usd = 1 / fallback_usd_rate
rub_per_usd_plus_5 = rub_per_usd + 5
new_usd_rate = 1 / rub_per_usd_plus_5
amount_usd = round(float(amount) * new_usd_rate, 2)
data["amount"] = amount_usd
data["currency"] = "USD"
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=headers, json=data, timeout=60) as resp:
if resp.status == 200: