Telegram机器人发送支付发票全流程:从创建到收款的官方实现指南

本文详细介绍如何通过Telegram Bot API发送支付发票(sendInvoice)并完成收款,涵盖创建Bot、设置支付提供商、处理预付款回调与确认付款的完整流程,并提供Python代码示例和常见问题排查。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在Telegram生态中,机器人不仅能聊天、发通知,还能直接向用户发送支付发票,实现商品或服务的在线收款。通过官方Bot API的sendInvoice方法,开发者可以构建完整的支付闭环,用户无需跳出Telegram即可完成付款。本文将带你掌握从创建发票到确认收款的每一步,并提供可直接运行的代码示例。

一、支付功能的前置条件

在使用机器人发送发票之前,需要完成以下关键配置:

  1. 创建机器人并获得Token:通过@BotFather创建机器人,记录API Token。
  2. 开通支付服务:在@BotFather中使用/mybots选择你的机器人,进入Bot Settings → Payments,然后选择或添加支付提供商(如Stripe、支付机器人等)。系统会生成一个支付提供商Token(Provider Token)。
  3. 确保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事件。基于这些基础,你可以扩展订阅续费、商城下单等更复杂的支付场景。建议在开发环境中充分测试,确保支付体验顺畅无阻。

FAQ

下载与安装

常见问题

Telegram机器人发送支付发票需要什么前提?

首先需要有一个Bot Token,然后在BotFather中为该机器人开通支付功能并获取Provider Token。另外,支付功能通常要求目标用户已启用Telegram支付(即绑定支付方式)。

sendInvoice中prices参数如何定义?

prices是一个包含LabeledPrice对象的数组,每个对象包含label(价格说明字符串)和amount(整数,以最小货币单位计,如美元用美分、人民币用分)。例如10美元应写成amount=1000。

如何处理用户取消支付或支付失败?

当用户取消支付时,Telegram不会发送pre_checkout_query,因此无需专门处理。而支付失败通常指预付款确认被拒绝(ok=False)或超时未响应,此时用户会看到失败提示。你可以在answerPreCheckoutQuery传入error_message来提示原因。

能否在群组中让多个成员各自付款?

可以。sendInvoice的chat_id可指向群组,但发票是发送给整个群组,任何成员点击支付都会使用自己的账号付款。只需确保机器人是群组管理员,并且付款流程在群组内正常显示。