aiogram/examples/stars_invoice.py
Alex Root Junior 1f7bbeb355
Added full support of Bot API 7.5 (#1518)
* Added full support of Bot API 7.5

* Added changelog

* Update date type in RevenueWithdrawalStateSucceeded

* Added example
2024-06-19 00:54:22 +03:00

64 lines
1.8 KiB
Python

import asyncio
import logging
from os import getenv
from aiogram import Bot, Dispatcher, F, Router
from aiogram.filters import Command
from aiogram.types import LabeledPrice, Message, PreCheckoutQuery
TOKEN = getenv("BOT_TOKEN")
GOODS = { # Fake storage for goods, in real life it should be a database
"demo": 1,
"another": 0,
}
logger = logging.getLogger(__name__)
invoices_router = Router(name=__name__)
@invoices_router.message(Command("start"))
async def command_start(message: Message) -> None:
# Send demo invoice to user, the payment will be refunded after successful payment
await message.answer_invoice(
title="Demo invoice",
description="Demo invoice description",
prices=[
LabeledPrice(label="Demo", amount=42),
],
payload="demo",
currency="XTR",
)
@invoices_router.pre_checkout_query(F.invoice_payload == "demo")
async def pre_checkout_query(query: PreCheckoutQuery) -> None:
# if your product is available for sale,
# confirm that you are ready to accept payment
if GOODS.get(query.invoice_payload) > 0:
await query.answer(ok=True)
else:
await query.answer(ok=False, error_message="The product is out of stock")
@invoices_router.message(F.successful_payment)
async def successful_payment(message: Message, bot: Bot) -> None:
await bot.refund_star_payment(
user_id=message.from_user.id,
telegram_payment_charge_id=message.successful_payment.telegram_payment_charge_id,
)
await message.answer("Thanks. Your payment has been refunded.")
async def main() -> None:
bot = Bot(token=TOKEN)
dispatcher = Dispatcher()
dispatcher.include_router(invoices_router)
await dispatcher.start_polling(bot)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
asyncio.run(main())