diff --git a/examples/stars_invoice.py b/examples/stars_invoice.py new file mode 100644 index 00000000..917c491a --- /dev/null +++ b/examples/stars_invoice.py @@ -0,0 +1,64 @@ +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())