为什么你的Telegram机器人需要付费订阅功能
随着Telegram生态的不断成熟,越来越多的开发者希望通过机器人提供增值服务。付费订阅不仅可以让你的机器人实现持续盈利,还能为用户提供更稳定、更高级的功能体验。Telegram官方支付平台为机器人开发者提供了安全、便捷的支付解决方案,无需自己搭建支付网关,即可实现全球范围内的收款。
准备工作:申请Telegram支付API
在开始开发之前,你需要先向Telegram申请支付API的权限。具体步骤如下:
- 通过
@BotFather创建或选择一个已有的机器人。 - 在
@BotFather对话框中发送/mybots,选择你的机器人。 - 依次点击:
Settings→Payments,然后根据提示提供必要的企业信息(如营业执照、地址等)。 - 等待Telegram审核,一般需要几天时间。审核通过后,你会获得一个Provider Token。
目前Telegram支持多种支付提供商(如Stripe、Apple Pay、Google Pay等),具体支持情况取决于你的商户账户区域。建议从Stripe开始,因为它的全球覆盖范围最广。
数据库设计:存储用户订阅状态
实现付费订阅功能,你需要在数据库中记录用户的订阅信息。这里推荐使用SQLite或PostgreSQL。以下是一个简单的数据表设计示例:
CREATE TABLE subscriptions (
user_id BIGINT PRIMARY KEY,
subscription_type VARCHAR(20), -- monthly/yearly
expires_at TIMESTAMP,
status VARCHAR(10) -- active/expired
);同时,为了记录每一笔订单,最好额外创建一张订单表:
CREATE TABLE payments (
id SERIAL PRIMARY KEY,
user_id BIGINT,
amount INT,
currency VARCHAR(10),
provider_charge_id VARCHAR(100),
created_at TIMESTAMP
);创建订阅订单:发送Invoice消息
Telegram支付的核心是sendInvoice方法。你需要构造一个发票消息,用户点击后即可通过Telegram自带的支付界面完成付款。以下是一个Python示例(使用python-telegram-bot库):
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler
def start_subscription(update, context):
chat_id = update.effective_chat.id
# 设置订阅价格,例如每月9.9美元
title = "订阅高级会员(月付)"
description = "解锁所有高级功能,每月自动续费"
payload = "monthly_subscription"
provider_token = "YOUR_PROVIDER_TOKEN"
currency = "USD"
prices = [LabeledPrice("高级会员月付", 990)] # 单位为分
context.bot.send_invoice(
chat_id,
title,
description,
payload,
provider_token,
currency,
prices,
start_parameter="subscription"
)这里的关键点:payload字段是自定义数据,在回调时会原样返回,可以用于识别订阅类型。
处理预付款回调:验证支付是否成功
当用户完成支付后,Telegram会发送一个PreCheckoutQuery回调。此时你可以做最后的校验(比如库存检查),然后确认订单。示例代码:
def pre_checkout_handler(update, context):
query = update.pre_checkout_query
# 这里可以检查用户是否合法,若不合法则回答错误
query.answer(ok=True)接下来,在successful_payment处理函数中,你需要根据payload为用户开通订阅权限:
def successful_payment_handler(update, context):
payment = update.effective_message.successful_payment
user_id = update.effective_user.id
if payment.invoice_payload == "monthly_subscription":
# 设置订阅到期时间为30天后
expires_at = datetime.now() + timedelta(days=30)
upsert_subscription(user_id, "monthly", expires_at)
update.message.reply_text("支付成功!你已经订阅了高级会员。")订阅状态校验:控制机器人功能权限
为需要付费的功能添加权限检查。例如在发送高级内容前,先检查用户是否拥有有效订阅:
def premium_feature(update, context):
user_id = update.effective_user.id
if not is_subscription_valid(user_id):
update.message.reply_text("请先订阅高级会员。")
return
# 执行高级功能逻辑订阅有效期的判断一般通过比较当前时间和expires_at来进行。
自动续费与到期处理
Telegram支付本身不支持自动扣款,你需要借助外部定时任务(如APScheduler)来实现。每天定时扫描所有已过期且开启了自动续费的用户,通过sendInvoice再次发送账单,引导用户续费。同时,对于已到期用户,要主动禁用其高级权限,并发送提醒消息。
常见问题与注意事项
- 测试支付:使用
provider_token时,可以先用Telegram提供的测试API(以TEST:开头),在测试环境中模拟支付。 - 支付验证:确保你的服务器正确接收并验证了所有回调,防止假回调导致权限发放错误。
- 多币种支持:根据用户所在国家动态调整货币和价格,提升购买转化率。
- 退款处理:Telegram暂不支持API直接退款,需要你通过支付提供商后台操作。
总结
通过Telegram官方支付API,我们可以为机器人快速添加付费订阅功能。关键在于理解Invoice流程、数据库设计以及回调处理。虽然自动续费需要额外设计,但总体上Telegram支付让中小开发者也能轻松实现商业化。如果你正在开发订阅型机器人,希望本文的实战步骤能助你顺利上线。