Aiogram 3x da Telegram Stars ulash
6-iyun kuni Pavel Durov Telegram yangi pul birligi — Yulduzlarni muomalaga kiritayotganini ma’lum qildi. Yulduzlar sizga raqamli tovarlar va xizmatlarni xarid qilish yoki boshqacha qilib aytganda Telegram’da xaridlar uchun to‘lovni amalga oshirish imkonini beradi, masalan, botlar yoki MiniApps. Biroq, hamma narsa juda qizg'ish emas. Yangi to'lov usulini joriy etish barcha boshqa to'lov usullarini o'chirib qo'yishga olib keladi. Agar sizning botingiz Ukassa orqali to'lovlarni qabul qilgan bo'lsa, endi faqat "Yulduzlar". Biz bunday o‘zgarishlarning sabablarini chetga surib, muhimroq narsalarga, xususan, Telegram botiga yangi to‘lov usuli – Telegram Starsni qanday joriy etishga e’tibor qaratamiz.
Telegram sozlamalarini ochib, “Telegram yulduzlari” bandini topib, yulduzlarni xarid qilishingiz mumkin.
Shuni ta'kidlash kerak. Yozish vaqtida foydalanuvchilardan olingan yulduzlardan qanday va qayerda foydalanish haqida so‘nggi ma’lumotlar yo‘q edi. Maqola Telegram’dagi ma’lumotlarning yangilanishi bilan yangilanadi. Agar biror narsa bilsangiz, iltimos, bizga xabar bering!
Yangi toʻlov usulini toʻliq qoʻllab-quvvatlash uchun minimum AIOgram 3.7.0 versiyasi talab qilinadi. Kutubxonani yangilash uchun buyruqni bajaring:
pip install -U aiogram
Shundan so'ng, versiyani yangilang requirements.txt.
aiogram==3.7.0
To'lov tugmasi
Hisob-faktura buyrug'i ishlovchisini yozishni boshlashdan oldin, biz bosilganda to'lov oynasini ochadigan to'lov tugmachasini yaratishimiz kerak.
Paketda botlogicbiz yangi paket yaratamiz keyboardsva unda fayl payment_keyboard.py.
payment_keyboardHech narsani qabul qilmaydigan funksiya yozamiz .
Funktsiya tanasida biz o'zgaruvchi yaratamiz, builderunda biz sinfning namunasini aniqlaymiz InlineKeyboardBuilder.
Siz unga tugmalar sinfi ob'ektlari bilan ro'yxatlar ro'yxatini o'tkazishingiz mumkin, ammo bu juda qulay emas; sinf usullaridan foydalanish osonroq. Keyingi qatorda biz sinf ob'ektining usulini chaqiramiz .button, bu klaviatura yaratuvchisiga tugma qo'shadi. Biz ikkita dalil keltiramiz:
text— Tugmadagi matnni belgilaydi. Agar matndaXTRyulduzcha kulgich ⭐️ bo‘lsa, u avtomatik ravishda Telegram yulduzlari belgisi bilan almashtiriladi.pay— Tugma turini toʻlov tugmasi sifatida belgilaydi.
Keyinchalik, ob'ektni klaviatura xabariga joylashtirishga tayyor bo'lish uchun builderusulni qo'llash orqali o'zgaruvchini qaytaramiz ..as_markup
Fayl kodi:
from aiogram.utils.keyboard import InlineKeyboardBuilder
def payment_keyboard():
builder = InlineKeyboardBuilder()
builder.button(text=f"Оплатить 20 ⭐️", pay=True)
return builder.as_markup()Klaviatura yaratish shart emas; hisob-fakturani usiz yuborishingiz mumkin. Biroq, bu sizga tugma matnini sozlash imkonini beradi, shuningdek, to'lovni bekor qilish, boshqa mahsulotni tanlash va hokazo kabi qo'shimcha funktsional tugmalarni qo'shish imkonini beradi.
Hisob-faktura protsessor
Buyruqlar ishlovchisini yozishni boshlaylik.
Paketda handlersbiz fayl yaratamiz payment.py.
Ushbu faylda biz sinf ob'ektini send_invoice_handlerqabul qiladigan asinxron funksiyani yozamiz .messageMessage
Keling, sinf ob'ektlari ro'yxatini , aniqrog'i, bitta ob'ekt bilan pricesjoylashadigan o'zgaruvchi yarataylik , chunki Telegram Stars orqali to'lash uchun bu ro'yxat bitta elementdan iborat bo'lishi kerak. LabeledPriceBiz quyidagi argumentlarni sinf ob'ektiga o'tkazamiz:
Keyinchalik, messagebiz o'zgaruvchi bo'yicha usulni chaqiramiz .answer_invoice, shunda bot foydalanuvchining xabariga to'lov uchun hisob-faktura bilan tugma bilan javob beradi. Usulga quyidagi argumentlarni beramiz:
title— Toʻlov, mahsulot yoki xizmat nomi.description— Toʻlov, mahsulot yoki xizmat tavsifi.pricesLabeledPrice— Oldin bir xil nomdagi oʻzgaruvchida aniqlangan obyektlar roʻyxati .provider_token— To‘lov tizimi tokeni, Telegram Stars uchun biz shunchaki bo‘sh qator yuboramiz.payload- To'lov belgisi. U foydalanuvchiga ko'rsatilmaydi, lekin to'lovlarni turlari bo'yicha ajratish uchun ishlatilishi mumkin va hokazo. Maksimal 128 bayt ma'lumot (Pythonda bir belgi bir baytni egallaydi, lekin esda tutingki, maxsus belgilar yoki emoji ko'proq joy egallashi mumkin).currency— Toʻlov valyutasi, Telegram yulduzlari uchun buXTR.reply_markup— Klaviatura obyekti.
Ishlovchi kodi:
from aiogram.types import LabeledPrice, Message
from botlogic.keyboards.payment_keyboard import payment_keyboard
async def send_invoice_handler(message: Message):
prices = [LabeledPrice(label="XTR", amount=20)]
await message.answer_invoice(
title="Поддержка канала",
description="Поддержать канал на 20 звёзд!",
prices=prices,
provider_token="",
payload="channel_support",
currency="XTR",
reply_markup=payment_keyboard()
)Sotishdan oldin tekshirish
Hisob-faktura beriladi, foydalanuvchi "To'lash" tugmasini bosing. Agar uning yulduzlari etarli bo'lmasa, tizim ularni sotib olishni taklif qiladi. Agar uning yulduzlari yetarli bo‘lsa, u to‘lovni amalga oshiradi va shu daqiqada Telegram botga “hammasi yaxshimi?” degan so‘rov yuboradi. Javob berish uchun roppa-rosa 10 soniya vaqtimiz bor. Agar biron sababga ko'ra biz ushbu foydalanuvchidan to'lovlarni qabul qilishni xohlamasak yoki bot mantig'i to'lovni bekor qilish uchun o'rnatilgan bo'lsa, bu holda to'lovni bekor qilish to'g'risida signal beruvchi javobni bekor qilish sababi bilan birga berish kerak. Aks holda, biz hamma narsa "OK" ekanligini tasdiqlaymiz.
Xuddi shu faylda biz pre_checkout_handlerargumentni qabul qiladigan asinxron funktsiyani yaratamiz pre_checkout_query- sinf ob'ekti PreCheckoutQuery.
Funktsiyaning tanasida biz o'zgaruvchiga argumentni o'tkazib, o'zgaruvchidagi pre_checkout_queryusulni chaqiramiz ..answerokTrue
Funktsiya kodi:
from aiogram.types import PreCheckoutQueryasync
def pre_checkout_handler(pre_checkout_query: PreCheckoutQuery):
await pre_checkout_query.answer(ok=True)Sotib olish haqida ma'lumot
Byurokratiya ortda qoldi, foydalanuvchini xaridi bilan tabriklashgina qoldi!
Xuddi shu faylda biz success_payment_handlerargumentni qabul qiladigan asinxron funktsiyani yaratamiz message- sinf ob'ekti Message.
Sinf ob'ekti Messagejoriy xabar haqida turli ma'lumotlarni saqlaydi va maydonda successful_paymentto'lov identifikatori, summa, valyuta, foydalanuvchidan olingan ma'lumotlar kabi to'lov haqidagi ma'lumotlar mavjud. Ideal holda, bularning barchasi kelajakda yuzaga kelishi mumkin bo'lgan to'lov muammolarini oldini olish uchun saqlanishi kerak.
Funktsiyaning tanasida biz xarid muvaffaqiyatli bo'lganligi haqida xabar berib, oddiy javob beramiz.
Funktsiya kodi:
async def success_payment_handler(message: Message):
await message.answer(text="🥳Спасибо за вашу поддержку!🤗")Paysupport jamoasi va pulni qaytarish haqida bir oz
Telegram’da foydalanuvchilarning mablag‘larini qaytarish shartlari ham mavjud. Hamma mahsulot va xizmatlar pulni qaytarishga haqli emas, lekin foydalanuvchi hali ham pulni qaytarishni talab qilishi yoki bu haqda xabardor bo‘lishi kerak.
Foydalanuvchini xabardor qilish uchun buyruq bo'lishi kerak /paysupport. Qaytish shartlarini, aloqa ma'lumotlarini va hokazolarni belgilashingiz mumkin. Keling, ushbu buyruqni bajaramiz.
Keling, sinf ob'ektini pay_support_handlerqabul qiladigan asinxron funksiya yarataylik . Funktsiyaning asosiy qismida biz pul mablag'larini qaytarish shartlarini tavsiflovchi matn bilan xabarga javob yozamiz.messageMessage
Funktsiya kodi:
async def pay_support_handler(message: Message):
await message.answer(
text="Добровольные пожертвования не подразумевают возврат средств, "
"однако, если вы очень хотите вернуть средства - свяжитесь с нами.")To'lovning o'zi foydalanuvchiga taqdim etilishi mumkin. Buni amalga oshirish uchun siz .refund_star_paymentob'ekt usuliga kirishda Botsiz user_idva unga o'tadigan qaytish buyrug'i ishlovchisini yaratishingiz kerak telegram_payment_charge_id.
user_id— Pulni qaytarishni talab qilayotgan foydalanuvchining Telegram identifikatori.telegram_payment_charge_id— Foydalanuvchi tomonidan amalga oshirilgan to‘lov identifikatori.
Ishlovchilarni ro'yxatdan o'tkazish
Hammasi tayyor, ishlovchilarni ro'yxatdan o'tkazish qoladi main.py.
Keling, faylni ochamiz main.pyva funktsiyaga to'rtta ro'yxatga olish qo'shamiz start:
send_invoice_handler— Biz uni oddiy xabar sifatida ro'yxatdan o'tkazamiz, buyruq filtrini ko'rsatamizdonate.pre_checkout_handler- Biz buni voqea sifatida ro'yxatdan o'tkazamizpre_checkout_query.success_payment_handler— Biz buni oddiy xabar sifatida ro'yxatdan o'tkazamiz. Filtr sifatida bizFob'ekt bo'lgan "Sehrli filtr" dan foydalanamizMessage. Filtrda biz maydonga murojaat qilamizsuccessful_payment. Agar u bo'sh bo'lmasa (muvaffaqiyatli to'lov), ishlov beruvchi chaqiriladi.pay_support_handler— Biz uni oddiy xabar sifatida buyruq uchun filtr bilan ro'yxatdan o'tkazamizpaysupport.
from aiogram import F dp.message.register(payment.send_invoice_handler, Command(commands="donate")) dp.pre_checkout_query.register(payment.pre_checkout_handler) dp.message.register(payment.success_payment_handler, F.successful_payment) dp.message.register(payment.pay_support_handler, Command(commands="paysupport"))
Sinov
Keling, botni ishga tushiramiz va buyruqni bajaramiz /donate.
Biz to'lov ma'lumotlari va hisob-kitob tugmasi bilan xabar olamiz. Keling, tugmani bosamiz.
To'lovni tasdiqlovchi oyna ochiladi (agar sizda yulduzcha bo'lmasa, xabarning boshida birinchi skrinshotda bo'lgani kabi xarid oynasi ochiladi). "Tasdiqlash va to'lash" tugmasini bosing.
Confetti chatda chiqadi va biz muvaffaqiyatli to'lov haqida xabarni ko'ramiz.
Xulosa
Yangilik, albatta, barchani hayratda qoldirdi va ularni biroz hayratda qoldirdi. Ular o'tish uchun oz vaqt berishdi va ehtimol bu haqda hamma ham bilmas edi. Bularning barchasi qayerga olib kelishini ko'rish qiziq bo'ladi.