Telegram Premium To'lov Tizimi: MTProto, Smart Glocal API va 3DS Integratsiyasini To'liq Avtomatlashtirish
Telegram Premium xizmatini Telegram ilovasi ichidan emas, balki tashqi dasturlar (Python botlar, backend xizmatlar) orqali avtomatlashtirilgan holda xarid qilish dasturchilar uchun doim qiziqarli muammolardan biri bo'lib kelgan. Telegram ushbu to'lovlar uchun o'zining rasmiy @PremiumBot boti va Smart Glocal to'lov shlyuzidan foydalanadi.
Ushbu maqolada biz Telegram MTProto protokoli va Smart Glocal REST API'si o'rtasidagi to'lov zanjirini bosqichma-bosqich qanday qurishni, kartani tokenlashni, 3DS SMS tasdiqlash havolasini tutib olishni va kelgusidagi ortiqcha avto-yechishlarni to'xtatish (/stop) usullarini ko'rib chiqamiz.
To'lov Jarayonining Umumiy Arxitekturasi
Jarayon 5 ta asosiy bo'g'indan iborat bo'lib, quyidagi ketma-ketlikda ishlaydi:
@PremiumBot ga /start yuborilib, MTProto orqali Invoice Message ID va checkout URL olinadi.
Karta ma'lumotlari (PAN, MM/YY, CVV) Smart Glocal API ga POST qilinib, to'lov tokeni olinadi.
Token MTProto SendPaymentFormRequest orqali Telegram serveriga tasdiqlash uchun uzatiladi.
Bank tomonidan talab qilingan 3DS xavfsizlik havolasi olinib, brauzerda SMS OTP kodi kiritiladi.
Obuna har oy avtomatik karta yechib ketmasligi uchun /stop buyrug'i bilan rekurring to'lov to'xtatiladi.
1. Invoys olish va MTProto GetPaymentFormRequest
Foydalanuvchi akkaunti nomidan @PremiumBot ga /start yuboriladi. Telethon kutubxonasi yordamida invoys xabari identifikatori va to'lov shakli URL manzili olinadi:
## manba: chorshamov.uz
from telethon import TelegramClient, functions
from telethon.tl.types import InputInvoiceMessage
# 1. @PremiumBot ga /start yuborish
bot_entity = await client.get_entity("PremiumBot")
input_peer = await client.get_input_entity(bot_entity)
async with client.conversation(bot_entity, timeout=25) as conv:
await conv.send_message("/start")
response = await conv.get_response()
invoice_msg_id = response.id
# 2. GetPaymentForm orqali checkout URL olish
input_invoice = InputInvoiceMessage(peer=input_peer, msg_id=invoice_msg_id)
payment_form = await client(functions.payments.GetPaymentFormRequest(invoice=input_invoice))
checkout_url = getattr(payment_form, "url", None)
form_id = payment_form.form_id
https://payment.smart-glocal.com/en/apm/tokenize/{public_token_base64}/{hash}
2. Smart Glocal API orqali kartani tokenlash
Telegram o'z serverlarida to'g'ridan-to'g'ri bank kartalarining ochiq ma'lumotlarini (PAN va CVV) qabul qilmaydi. PCI-DSS xavfsizlik standartlariga binoan, avval karta to'lov shlyuzi bo'lgan Smart Glocal API orqali tokenlanishi zarur:
## manba: chorshamov.uz
import urllib.request, json
def tokenize_card(checkout_url: str, card_info: dict) -> dict:
# Web tokenize manzilini REST API ga aylantirish
api_url = checkout_url.replace("/en/apm/tokenize/", "/api/apm/tokenize/")
payload = {
"customerDetails": {},
"paymentDetails": {
"card": {
"number": card_info["number"],
"securityCode": card_info["cvv"],
"expirationMonth": card_info["exp_month"],
"expirationYear": card_info["exp_year"]
}
},
"systemInfo": {
"deviceSessionIdList": []
}
}
headers = {
"Content-Type": "application/json",
"Origin": "https://payment.smart-glocal.com",
"Referer": checkout_url
}
req = urllib.request.Request(api_url, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
with urllib.request.urlopen(req, timeout=15) as resp:
return json.loads(resp.read().decode("utf-8"))
3. MTProto SendPaymentFormRequest va 3DS Redirect URL
Token muvaffaqiyatli olingach, u Telegram MTProto protokolidagi InputPaymentCredentials tuzilmasiga joylashtirilib, SendPaymentFormRequest orqali yuboriladi:
## manba: chorshamov.uz
from telethon.tl.types import InputPaymentCredentials, DataJSON
# Tokenni MTProto JSON credentials shakliga o'tkazish
credentials_data = json.dumps({"token": card_token, "type": "card"})
credentials = InputPaymentCredentials(data=DataJSON(data=credentials_data), save=False)
# To'lov shaklini Telegram serveriga yuborish
result = await client(functions.payments.SendPaymentFormRequest(
form_id=form_id,
invoice=input_invoice,
credentials=credentials
))
# 3DS SMS tasdiqlash manzilini tutib olish
verification_url = getattr(result, "url", None)
if not verification_url and hasattr(result, "payment_form"):
verification_url = getattr(result.payment_form, "url", None)
4. Muntazam obunani to'xtatish (/stop mexanizmi)
Telegram Premium xarid qilinganda, Telegram keyingi oylarda ham kartadan avtomatik pul yechib borish uchun uni Muntazam obuna (Recurring Subscription) rejimiga o'tkazadi. Foydalanuvchilarning kartasidan kelgusida kutilmagan to'lovlar yechilmasligi uchun, xarid yakunlanishi bilanoq /stop komandasi orqali obunani to'xtatish zarur:
## manba: chorshamov.uz
async with client.conversation(bot_entity, timeout=30) as conv:
await conv.send_message("/stop")
resp1 = await conv.get_response()
# 1-bosqich: "Ha, obunani to'xtatish" tugmasini bosish
if resp1.buttons and len(resp1.buttons[0]) > 0:
await resp1.buttons[0][0].click()
else:
await conv.send_message("Ha, obunani to'xtatish")
resp2 = await conv.get_response()
# 2-bosqich: Sababni tanlash ("Narx juda baland" / 1-tugma)
if resp2.buttons and len(resp2.buttons[0]) > 0:
await resp2.buttons[0][0].click()
else:
await conv.send_message("Narx juda baland")
final_resp = await conv.get_response()
# Obuna to'xtatildi, lekin joriy 1 oylik Premium to'liq saqlanib qoladi!
To'liq va Yagona Ishga Tushuvchi Python Skript
Quyida butun jarayonni (invoys olish, Smart Glocal tokenlash, 3DS havolasini ochish va obunani to'xtatish) birlashtirgan, to'g'ridan-to'g'ri terminalda ishga tushadigan to'liq namuna keltirilgan:
## manba: chorshamov.uz
import asyncio
import json
import urllib.request
import webbrowser
from telethon import TelegramClient, functions
from telethon.tl.types import (
KeyboardButtonBuy,
InputInvoiceMessage,
InputPaymentCredentials,
DataJSON,
)
# 1. Telegram API sozlamalari
API_ID = 2040
API_HASH = "b18441a1ff607e10a989891a5462e627"
SESSION_NAME = "my_account"
PREMIUM_BOT = "PremiumBot"
# 2. To'lov karta ma'lumotlari
CARD_DATA = {
"number": "4000111222333444",
"exp_month": "09",
"exp_year": "30",
"cvv": "222"
}
def tokenize_card(checkout_url: str, card_info: dict) -> dict:
api_url = checkout_url.replace("/en/apm/tokenize/", "/api/apm/tokenize/")
payload = {
"customerDetails": {},
"paymentDetails": {
"card": {
"number": card_info["number"],
"securityCode": card_info["cvv"],
"expirationMonth": card_info["exp_month"],
"expirationYear": card_info["exp_year"]
}
},
"systemInfo": {"deviceSessionIdList": []}
}
headers = {
"Content-Type": "application/json",
"Origin": "https://payment.smart-glocal.com",
"Referer": checkout_url
}
req = urllib.request.Request(api_url, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
with urllib.request.urlopen(req, timeout=15) as resp:
return json.loads(resp.read().decode("utf-8"))
async def buy_and_cancel_renewal():
client = TelegramClient(SESSION_NAME, API_ID, API_HASH)
await client.connect()
if not await client.is_user_authorized():
print("❌ Akkaunt avtorizatsiyadan o'tmagan!")
await client.disconnect()
return
# 1-qadam: @PremiumBot bilan bog'lanish va /start
bot_entity = await client.get_entity(PREMIUM_BOT)
input_peer = await client.get_input_entity(bot_entity)
async with client.conversation(bot_entity, timeout=25) as conv:
await conv.send_message("/start")
response = await conv.get_response()
invoice_msg_id = response.id
# 2-qadam: MTProto GetPaymentFormRequest
input_invoice = InputInvoiceMessage(peer=input_peer, msg_id=invoice_msg_id)
payment_form = await client(functions.payments.GetPaymentFormRequest(invoice=input_invoice))
checkout_url = getattr(payment_form, "url", None)
form_id = payment_form.form_id
# 3-qadam: Smart Glocal API Tokenlash
token_res = tokenize_card(checkout_url, CARD_DATA)
card_token = token_res["token"]
# 4-qadam: SendPaymentFormRequest & 3DS URL
credentials_data = json.dumps({"token": card_token, "type": "card"})
credentials = InputPaymentCredentials(data=DataJSON(data=credentials_data), save=False)
result = await client(functions.payments.SendPaymentFormRequest(
form_id=form_id,
invoice=input_invoice,
credentials=credentials
))
verification_url = getattr(result, "url", None)
if not verification_url and hasattr(result, "payment_form"):
verification_url = getattr(result.payment_form, "url", None)
if verification_url:
print(f"🔗 3DS SMS Tasdiqlash Havolasi: {verification_url}")
webbrowser.open(verification_url)
input("SMS kodni brauzerda kiritgach, davom etish uchun Enter bosing...")
# 5-qadam: Avto-to'lovni to'xtatish (/stop)
async with client.conversation(bot_entity, timeout=30) as conv:
await conv.send_message("/stop")
resp1 = await conv.get_response()
if resp1.buttons:
await resp1.buttons[0][0].click()
resp2 = await conv.get_response()
if resp2.buttons:
await resp2.buttons[0][0].click()
resp3 = await conv.get_response()
print(f"✅ Obuna muvaffaqiyatli yakunlandi: {resp3.text}")
await client.disconnect()
if __name__ == "__main__":
asyncio.run(buy_and_cancel_renewal())
Loyiha Strukturasi va Ishga Tushirish
Skriptni ishga tushirishdan oldin quyidagi papka tuzilishini yarating. Bu barcha fayllarni tartibli saqlash va loyihani boshqa joyga ko'chirishni osonlashtiradi:
telegram-premium-purchase/
├── full_telegram_premium_purchase.py # asosiy skript
├── requirements.txt # kutubxonalar ro'yxati
├── .env # API_ID, API_HASH shu yerda saqlanadi
└── my_account.session # birinchi ishga tushirishda avtomatik yaraladi
1. requirements.txt
Loyiha faqat bitta tashqi kutubxonaga bog'liq — telethon:
telethon>=1.34.0
2. Muhitni tayyorlash va ishga tushirish
Terminalda loyiha papkasi ichida quyidagi buyruqlarni ketma-ket bajaring:
## manba: chorshamov.uz
# 1. Loyiha papkasini yaratish va ichiga kirish
mkdir telegram-premium-purchase && cd telegram-premium-purchase
# 2. Virtual muhit yaratish
python3 -m venv venv
# 3. Virtual muhitni faollashtirish (Linux / macOS)
source venv/bin/activate
# 3-b. Virtual muhitni faollashtirish (Windows)
venv\\Scripts\\activate
# 4. Kutubxonalarni o'rnatish
pip install -r requirements.txt
# 5. Skriptni ishga tushirish
python full_telegram_premium_purchase.py
Skript birinchi marta ishga tushganda Telethon sizdan telefon raqami va Telegram'dan kelgan tasdiqlash kodini so'raydi. Muvaffaqiyatli kirishdan so'ng my_account.session fayli avtomatik yaratiladi va keyingi ishga tushirishlarda qayta login talab qilinmaydi.
my.telegram.org saytiga o'z Telegram akkauntingiz orqali kirib, "API development tools" bo'limidan shaxsiy API_ID va API_HASH qiymatlaringizni oling va skriptdagi mos o'zgaruvchilarga joylashtiring.
Xavfsizlik va Optimal Arxitektura Tavsiyalari
Diskda og'ir SQLite .session va .session-journal fayllarini saqlash o'rniga, foydalanuvchilar sessiyalarini xotirada StringSession shaklida vaqtinchalik saqlab, xarid yakunlangach darhol o'chirib tashlash foydalanuvchi ma'lumotlari daxlsizligini kafolatlaydi.
Foydalanuvchiga xarid amalga oshgach, o'zining Telegram ilovasidagi Sozlamalar $\rightarrow$ Maxfiylik va Xavfsizlik $\rightarrow$ Qurilmalar bo'limiga kirib, bot orqali ochilgan sessiyani qo'lda ham yakunlab qo'yishni maslahat berish eng to'g'ri xavfsizlik odatidir.
Xulosa
Telegram MTProto protokoli va Smart Glocal API integratsiyasi to'lov jarayonini to'liq nazorat qilish, avtomatlashtirish va yuqori darajada xavfsiz qilish imkonini beradi. Yuqorida keltirilgan yondashuv orqali siz o'z fintech botlaringizda Telegram Premium xarid qilish va obunalarni boshqarish tizimini bemalol joriy qila olasiz.