Telegram机器人早已不止于自动回复或群管理,支付功能的接入让机器人能够直接售卖数字商品、会员服务或订阅内容。本教程将从零开始,带你完整实现Telegram机器人支付功能接入,涵盖原理、准备、编码、部署及注意事项,让开发者少走弯路。
一、Telegram支付机制核心概念
Telegram支付基于Bot Payments API,它并不直接处理资金,而是通过支付服务提供商(如Stripe、PayPal、YooMoney等)完成交易。机器人发送一张发票(Invoice),用户点击后进入支付流程,支付结果通过Update或Webhook回传,机器人再据此执行后续动作。
关键组件包括:
- Bot Token:机器人身份凭证。
- 支付提供商Token:绑定支付网关的凭证,由@BotFather生成。
- 商品/服务:需要出售的数字货物,可以是telegram stars或外部支付。
- 发票(Invoice):包含价格、描述、支付方式等信息的消息。
- 回调处理:处理支付成功或失败的通知。
二、支付功能开通前提条件
在进行代码开发前,必须完成以下准备:
- 注册一个Telegram机器人,获取Bot Token(通过@BotFather)。
- 为机器人开启支付能力:向@BotFather发送
/payments,选择机器人和需要接入的支付提供商。 - 获取支付提供商Token:在BotFather流程中,根据提示选择商家账号并生成Token。
- 确保运行环境支持HTTPS(如果是Webhook方式)或使用长轮询
getUpdates。 - 为了测试,可以使用官方提供的支付测试卡号(如
4000 0000 0000 0002)。
注意:Telegram支付需要在机器人设置中绑定国家或地区,且部分支付提供商有地区限制。
三、接入支付功能完整流程
步骤1:创建商品信息
在代码中定义商品信息,包括唯一ID、标题、描述、货币单位、价格(以最小单位表示,如美分)、支付提供商Token。
步骤2:发送发票
使用sendInvoice方法向用户发送发票。需要传递chat_id、title、description、payload(自定义参数)、provider_token、currency、prices等参数。
步骤3:处理预检查询(PreCheckoutQuery)
当用户确认支付前,Telegram会发送pre_checkout_query更新。开发者必须及时响应answerPreCheckoutQuery,为兼容货币或库存问题,可在此时拒绝订单。
步骤4:处理支付回调
支付成功后,Telegram发送包含successful_payment的Update。在此处更新数据库、发货或增加用户权限。
四、代码示例(Python + python-telegram-bot)
以下是一个极简实现,基于PTB v20+:
import logging
from telegram import Update, LabeledPrice
from telegram.ext import Application, CommandHandler, PreCheckoutQueryHandler, MessageHandler, filters, ContextTypes
TOKEN = "YOUR_BOT_TOKEN"
PROVIDER_TOKEN = "YOUR_PROVIDER_TOKEN"
PAYMENT_CURRENCY = "USD"
PAYMENT_PRICE = 299 # 等价于 $2.99
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("点击 /pay 体验支付")
async def pay(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
title = "高级会员"
description = "解锁30天高级功能"
payload = "vip-1month"
prices = [LabeledPrice("会员费", PAYMENT_PRICE)]
await context.bot.send_invoice(
chat_id, title, description, payload, PROVIDER_TOKEN,
PAYMENT_CURRENCY, prices
)
async def pre_checkout(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.pre_checkout_query
await query.answer(ok=True) # 若拒绝则传 ok=False
async def successful_payment(update: Update, context: ContextTypes.DEFAULT_TYPE):
payment = update.effective_message.successful_payment
await update.effective_message.reply_text("支付成功!感谢购买")
# 这里可以发放权益,如修改数据库
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("pay", pay))
app.add_handler(PreCheckoutQueryHandler(pre_checkout))
app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, successful_payment))
app.run_polling()
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()
务必用你自己的Token替换,并测试支付流程。
五、最佳实践与注意事项
- 安全验证:务必验证回调来源,确保请求来自Telegram服务器。
- 订单幂等:使用
payload参数携带内部订单号,避免重复发货。 - 错误处理:处理
answerPreCheckoutQuery的异常情况,及时告知用户失败原因。 - 测试与沙盒:在正式收款前,使用测试支付网关和生产环境隔离。
- 接受法规:遵守当地法律法规和支付机构要求,提供充分退款机制。
- 多语言支持:发票内容可本地化,提升用户体验。
六、常见问题解答
Q1: 无法生成支付Token怎么办?
请确认你的机器人所在的国家的支付服务覆盖范围,并在BotFather中正确选择支付提供商。部分国家需要企业资质。
Q2: 支付成功后没有回调?
如果是Webhook模式,检查Webhook是否正常;同时确认处理成功时返回HTTP 200。使用轮询模式则不存在这个问题。
Q3: 如何退款?
可以通过支付服务商后台操作,或调用对应支付服务商API实现自动化退款。
Q4: 支持人民币支付吗?
取决于你绑定的支付服务商是否支持CNY。如Stripe支持,但需要对应商家账户。
Q5: 发票里的价格支持固定数字吗?
支持。也可以动态计算,价格单位必须为最小货币单位。
结语
Telegram机器人支付功能接入并不复杂,但需要细心配置与严谨编码。掌握本指南中的流程和要点后,你完全可以在短时间内为自己的机器人增加变现能力。建议先在实际小范围测试,再推广到全部用户。祝开发顺利!