在Telegram生态中,机器人不仅能聊天、发通知,还能直接向用户发送支付发票,实现商品或服务的在线收款。通过官方Bot API的sendInvoice方法,开发者可以构建完整的支付闭环,用户无需跳出Telegram即可完成付款。本文将带你掌握从创建发票到确认收款的每一步,并提供可直接运行的代码示例。
一、支付功能的前置条件
在使用机器人发送发票之前,需要完成以下关键配置:
- 创建机器人并获得Token:通过
@BotFather创建机器人,记录API Token。 - 开通支付服务:在
@BotFather中使用/mybots选择你的机器人,进入Bot Settings → Payments,然后选择或添加支付提供商(如Stripe、支付机器人等)。系统会生成一个支付提供商Token(Provider Token)。 - 确保Bot具备发票权限:默认情况下,支付功能无需额外权限,但如果是群组中使用,需将机器人设为管理员。
二、sendInvoice核心参数解析
sendInvoice是发送支付发票的核心方法,常用参数如下:
chat_id:接收发票的用户或群组ID。title:产品名称,不超过32个字符。description:产品描述,不超过255个字符。payload:自定义数据,用于确认支付时回传,如订单ID。provider_token:支付提供商Token。currency:三位货币代码,如USD、CNY。prices:价格列表,由LabeledPrice对象组成,每个对象包含label(说明)和amount(金额,单位为最小货币单位,如分)。start_parameter:传递深链参数(通常用于唯一标识支付)。
三、发起支付:Python完整代码示例
以下使用python-telegram-bot库演示发送一张10美元的电子券发票:
from telegram import Bot, LabeledPrice
import asyncio
TOKEN = 'YOUR_BOT_TOKEN'
PROVIDER_TOKEN = 'YOUR_PROVIDER_TOKEN'
async def send_invoice():
bot = Bot(token=TOKEN)
chat_id = 123456789 # 替换为用户ID
prices = [LabeledPrice(label="电子优惠券", amount=1000)] # 10美元 = 1000美分
await bot.send_invoice(
chat_id=chat_id,
title="VIP 会员月卡",
description="享受专属会员权益,支持自动续费",
payload="ORDER-20250101-001",
provider_token=PROVIDER_TOKEN,
currency="USD",
prices=prices,
start_parameter="vip-monthly"
)
asyncio.run(send_invoice())
运行这段代码后,用户会收到一张带有“支付”按钮的发票消息。点击按钮后,Telegram会弹出支付界面,用户确认支付后,支付提供商将处理扣款。
四、关键回调:处理预付款查询
用户点击支付按钮后,Telegram会向你的后端发送一个pre_checkout_query更新。此时必须在10秒内调用answerPreCheckoutQuery方法确认或拒绝付款。若未响应,支付将自动失败。
from telegram.ext import Application, PreCheckoutQueryHandler
async def pre_checkout_callback(update, context):
query = update.pre_checkout_query
# 在这里可校验订单状态、库存等业务逻辑
# 若一切正常,确认付款:
await query.answer(ok=True)
# 若需拒绝:await query.answer(ok=False, error_message="库存不足")
app = Application.builder().token(TOKEN).build()
app.add_handler(PreCheckoutQueryHandler(pre_checkout_callback))
五、最终确认:发送成功消息
用户付款成功后,Telegram会发送一条message更新,其中包含successful_payment字段。你应在此时向用户发送确认消息,并执行后续业务(如发放会员资格)。
from telegram.ext import MessageHandler, filters
async def successful_payment_handler(update, context):
payment = update.effective_message.successful_payment
await update.effective_message.reply_text(
f"付款成功!金额:{payment.total_amount / 100:.2f} {payment.currency}\n"
f"订单号:{payment.invoice_payload}"
)
app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, successful_payment_handler))
六、避坑指南:常见问题与排查
- Provider Token无效:确认Token是否与Bot绑定正确,在BotFather中重新生成。
- 货币金额问题:金额必须是正整数,且以最小单位计数(如人民币为分)。
- 预付款回调超时:确保handler响应时间小于10秒,如果业务逻辑复杂,可先确认再异步处理。
- 沙盒测试:使用测试环境(如Stripe的test key)验证流程,避免真实扣款。
总结
通过上述步骤,你已经掌握了Telegram机器人发送支付发票和完成收款的完整链路。核心要点包括:正确配置支付提供商、构造sendInvoice请求、及时响应pre_checkout_query、处理successful_payment事件。基于这些基础,你可以扩展订阅续费、商城下单等更复杂的支付场景。建议在开发环境中充分测试,确保支付体验顺畅无阻。