-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpayments.py
More file actions
213 lines (191 loc) · 8.55 KB
/
Copy pathpayments.py
File metadata and controls
213 lines (191 loc) · 8.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import json
from dotenv import load_dotenv
import os
import uuid
import asyncio
import yookassa
import logging
# Настройка логирования
logging.basicConfig(
level=logging.INFO, # Уровень логирования (INFO, DEBUG, WARNING, ERROR, CRITICAL)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Формат логов
handlers=[
logging.FileHandler('logs/bot.log',encoding='utf-8'), # Логи записываются в файл bot.log
logging.StreamHandler() # Логи также выводятся в консоль (опционально)
]
)
logger = logging.getLogger(__name__)
load_dotenv('keys.env')
shop_id = os.getenv('SHOP_ID')
secret_key = os.getenv('SECRET_KEY')
async def create_payment(price: str, expires_at: str, user_id: int, sub_type: str, tokens: int):
"""
Создает платеж через ЮKassa.
:param price: Цена подписки.
:param expires_at: Время истечения срока действия платежа (в формате ISO 8601).
:param user_id: ID пользователя.
:param sub_type: Тип подписки.
:param tokens: Количество токенов.
:return: Ссылка на оплату и ID платежа.
"""
try:
inn = int(os.getenv('INN'))
shop_id = os.getenv('SHOP_ID')
secret_key = os.getenv('SECRET_KEY')
yookassa.Configuration.configure(shop_id, secret_key)
idempotence_key = str(uuid.uuid4())
invoice = yookassa.Invoice.create({
"payment_data": {
"amount": {
"value": f"{price}.00",
"currency": "RUB"
},
"capture": True,
"save_payment_method": True,
"description": f"Подписка на AVRORA AI ({sub_type})",
"metadata": {
"user_id": user_id,
"sub_type": sub_type,
"tokens": tokens
}
},
"cart": [
{
"description": f"Подписка на AVRORA AI ({sub_type})",
"price": {
"value": f"{price}.00",
"currency": "RUB"
},
"quantity": 1.000
}
],
"delivery_method_data": {
"type": "self"
},
"locale": "ru_RU",
"expires_at": expires_at,
"description": f"Счет на оплату подписки {sub_type}",
"metadata": {
"user_id": user_id,
"sub_type": sub_type,
"tokens": tokens
}
}, idempotence_key)
# Получаем ссылку на оплату и ID платежа
link_to_invoice = invoice.delivery_method.url
payment_id = invoice.id
logger.info(f"Платеж создан: ID={payment_id}, ссылка={link_to_invoice}")
return link_to_invoice, payment_id
except Exception as e:
logger.error(f"Ошибка при создании платежа: {e}")
return None, None
# async def create_payment(price):
# inn = int(os.getenv('INN'))
# try:
# idempotence_key = str(uuid.uuid4())
# yookassa.Configuration.account_id = shop_id
# yookassa.Configuration.secret_key = secret_key
# payment = yookassa.Payment.create({
# "amount": {
# "value": f"{price}.00",
# "currency": "RUB"
# },
# # "payment_method_data": {
# # "type": "bank_card"
# # },
# "confirmation": {
# "type": "redirect",
# "return_url": "https://t.me/avroraai_bot?start"
# },
# "receipt": {
# "customer":{
# "inn":inn,
# "email":'catkonfis@gmail.com'
# },
# "items": [
# {
# "description": "Подписка",
# "quantity": "1.00",
# "amount": {
# "value": f"{price}", # Сумма в рублях
# "currency": "RUB"
# },
# "vat_code": 1
# }
# ]
# },
# "description": "Покупка подписки",
# "capture": True
# }, idempotence_key)
# url = payment.confirmation.confirmation_url
# return url, payment.id
# except Exception as e:
# # Логируем ошибку и возвращаем None
# print(f"Произошла ошибка при создании платежа: {e}")
# return None, None
async def create_auto_payment(price: str, expires_at: str, user_id: int, sub_type: str, tokens: int, payment_method_id: str):
"""
Создает автоматический платеж через ЮKassa с использованием сохраненного способа оплаты.
:param price: Цена подписки.
:param expires_at: Время истечения срока действия платежа (в формате ISO 8601).
:param user_id: ID пользователя.
:param sub_type: Тип подписки.
:param tokens: Количество токенов.
:param payment_method_id: Идентификатор сохраненного способа оплаты.
:return: ID платежа или None в случае ошибки.
"""
try:
# Настройка ЮKassa
shop_id = os.getenv('SHOP_ID')
secret_key = os.getenv('SECRET_KEY')
yookassa.Configuration.configure(shop_id, secret_key)
# Генерация уникального ключа идемпотентности
idempotence_key = str(uuid.uuid4())
# Создание платежа
payment = yookassa.Payment.create({
"amount": {
"value": f"{price}.00", # Форматируем цену
"currency": "RUB"
},
"capture": True, # Автоматическое подтверждение платежа
"payment_method_id": payment_method_id, # Используем сохраненный способ оплаты
"description": f"Автоплатеж за подписку на AVRORA AI ({sub_type})", # Описание платежа
"metadata": {
"user_id": user_id, # ID пользователя
"sub_type": sub_type, # Тип подписки
"tokens": tokens, # Количество токенов
"auto": True # Указываем, что это автоплатеж
},
# "confirmation": {
# "type": "redirect", # Тип подтверждения (например, редирект на страницу оплаты)
# "return_url": "https://yourdomain.com/return_url" # URL для возврата после оплаты
# },
"expires_at": expires_at # Время истечения срока действия платежа
}, idempotence_key)
# Проверяем статус платежа
if payment.status == "succeeded":
logger.info(f"Автоплатеж успешно создан. ID: {payment.id}")
return payment.id
else:
logger.error(f"Автоплатеж не был успешным. Статус: {payment.status}")
return None
except Exception as e:
# Логируем ошибку
logger.error(f"Произошла ошибка при создании автоплатежа: {e}", exc_info=True)
return None
async def get_payment(id):
try:
payment = yookassa.Invoice.find_one(id)
# Проверяем статус платежа
if payment.status == 'succeeded':
# Проверяем, сохранён ли метод оплаты
if hasattr(payment.payment_method, 'saved') and payment.payment_method.saved:
return payment.status, payment.payment_method.id
else:
return payment.status
else:
return False
except Exception as e:
# Логируем ошибку и возвращаем False
print(f"Произошла ошибка: {e}")
return False