April 30

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 matnda XTRyulduzcha 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:

  • label- Valyuta ta'rifi. Bizning holatimizda shunday XTR.
  • amount- Yulduzlarda narx.

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 bu XTR.
  • 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:

  1. send_invoice_handler— Biz uni oddiy xabar sifatida ro'yxatdan o'tkazamiz, buyruq filtrini ko'rsatamiz donate.
  2. pre_checkout_handler- Biz buni voqea sifatida ro'yxatdan o'tkazamiz pre_checkout_query.
  3. success_payment_handler— Biz buni oddiy xabar sifatida ro'yxatdan o'tkazamiz. Filtr sifatida biz Fob'ekt bo'lgan "Sehrli filtr" dan foydalanamiz Message. Filtrda biz maydonga murojaat qilamiz successful_payment. Agar u bo'sh bo'lmasa (muvaffaqiyatli to'lov), ishlov beruvchi chaqiriladi.
  4. pay_support_handler— Biz uni oddiy xabar sifatida buyruq uchun filtr bilan ro'yxatdan o'tkazamiz paysupport.
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.