import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from database import Database
from payment import create_payment
import config
logging.basicConfig(level=logging.INFO)
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
db = Database()
class OrderState(StatesGroup):
waiting_for_quantity = State()
waiting_for_address = State()
Команда /start
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
user_id = message.from_user.id
username = message.from_user.username
if not db.user_exists(user_id):
db.add_user(user_id, username)
await message.answer(
"🛒 Добро пожаловать в наш магазин!\n\n"
"Доступные команды:\n"
"/catalog - Просмотреть товары\n"
"/cart - Корзина\n"
"/orders - Мои заказы\n"
"/support - Поддержка"
)
Показать каталог
@dp.message_handler(commands=['catalog'])
async def show_catalog(message: types.Message):
products = db.get_all_products()
if not products:
await message.answer("📭 Товаров пока нет")
return
for product in products:
caption = f"🛍️ {product[1]}\n💵 Цена: {product[2]} руб.\n📦 {product[3]}"
with open(f"products/{product[4]}", 'rb') as photo:
await message.answer_photo(
photo,
caption=caption,
reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton(
"✅ Добавить в корзину",
callback_data=f"add_{product[0]}"
)
)
)
Обработка добавления в корзину
@dp.callback_query_handler(lambda c: c.data.startswith('add_'))
async def add_to_cart(callback: types.CallbackQuery):
product_id = int(callback.data.split('_')[1])
user_id = callback.from_user.id
db.add_to_cart(user_id, product_id, 1)
await callback.answer("Товар добавлен в корзину!")
await callback.message.answer(
"Товар добавлен. Продолжить покупки или перейти в корзину?",
reply_markup=types.InlineKeyboardMarkup(row_width=2).add(
types.InlineKeyboardButton("🛒 Корзина", callback_data="view_cart"),
types.InlineKeyboardButton("📋 Каталог", callback_data="view_catalog")
)
)
Команда /cart
@dp.message_handler(commands=['cart'])
async def view_cart(message: types.Message):
cart_items = db.get_cart(message.from_user.id)
if not cart_items:
await message.answer("🛒 Корзина пуста")
return
total = 0
cart_text = "🛒 Ваша корзина:\n\n"
for item in cart_items:
product = db.get_product(item[1])
cart_text += f"{product[1]} x{item[2]} = {product[2] * item[2]} руб.\n"
total += product[2] * item[2]
cart_text += f"\n💰 Итого: {total} руб."
await message.answer(
cart_text,
reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton("💳 Оформить заказ", callback_data="checkout"),
types.InlineKeyboardButton("🗑️ Очистить корзину", callback_data="clear_cart")
)
)
Оформление заказа с оплатой
@dp.callback_query_handler(lambda c: c.data == 'checkout')
async def checkout_order(callback: types.CallbackQuery):
user_id = callback.from_user.id
cart_items = db.get_cart(user_id)
if not cart_items:
await callback.answer("Корзина пуста!")
return
total = sum(db.get_product(item[1])[2] * item[2] for item in cart_items)
# Создаем оплату через ЮKassa
payment_url = create_payment(total, user_id)
order_id = db.create_order(user_id, total, "ожидает оплаты")
await callback.message.answer(
f"💳 Сумма к оплате: {total} руб.\n\n"
f"Для оплаты перейдите по ссылке:\n{payment_url}\n\n"
"После оплаты нажмите /paid для подтверждения",
reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton("🔗 Перейти к оплате", url=payment_url)
)
)
Админ-панель
@dp.message_handler(commands=['admin'])
async def admin_panel(message: types.Message):
if message.from_user.id not in config.ADMIN_IDS:
return
await message.answer(
"⚙️ Панель администратора",
reply_markup=types.InlineKeyboardMarkup(row_width=2).add(
types.InlineKeyboardButton("📊 Статистика", callback_data="admin_stats"),
types.InlineKeyboardButton("➕ Добавить товар", callback_data="add_product"),
types.InlineKeyboardButton("📦 Заказы", callback_data="view_orders"),
types.InlineKeyboardButton("📢 Рассылка", callback_data="send_broadcast")
)
)
if name == 'main':
db.init_db() # Инициализируем базу данных
asyncio.run(dp.start_polling())
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from database import Database
from payment import create_payment
import config
logging.basicConfig(level=logging.INFO)
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
db = Database()
class OrderState(StatesGroup):
waiting_for_quantity = State()
waiting_for_address = State()
Команда /start
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
user_id = message.from_user.id
username = message.from_user.username
Показать каталог
@dp.message_handler(commands=['catalog'])
async def show_catalog(message: types.Message):
products = db.get_all_products()
Обработка добавления в корзину
@dp.callback_query_handler(lambda c: c.data.startswith('add_'))
async def add_to_cart(callback: types.CallbackQuery):
product_id = int(callback.data.split('_')[1])
user_id = callback.from_user.id
Команда /cart
@dp.message_handler(commands=['cart'])
async def view_cart(message: types.Message):
cart_items = db.get_cart(message.from_user.id)
Оформление заказа с оплатой
@dp.callback_query_handler(lambda c: c.data == 'checkout')
async def checkout_order(callback: types.CallbackQuery):
user_id = callback.from_user.id
cart_items = db.get_cart(user_id)
Админ-панель
@dp.message_handler(commands=['admin'])
async def admin_panel(message: types.Message):
if message.from_user.id not in config.ADMIN_IDS:
return
if name == 'main':
db.init_db() # Инициализируем базу данных
asyncio.run(dp.start_polling())