Telegram机器人支付接口对接全指南:从BotFather配置到API实战

本文详细介绍Telegram机器人支付接口的对接流程,涵盖BotFather配置、支付提供商选择、核心API调用及Python实战代码,帮助开发者快速实现机器人内付费功能。

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

在Telegram机器人生态中,支付功能是变现和业务闭环的关键一环。无论是售卖虚拟商品、会员订阅,还是线下服务预约,通过机器人内置的支付接口,用户无需跳出聊天即可完成付费,体验极其流畅。然而,很多开发者被复杂的支付流程和API细节劝退。本文将从零开始,带你完整对接Telegram机器人支付接口,涵盖配置、编码、调试全流程,确保你能够顺利上线付费机器人。

一、支付接口对接前的基础准备

在动手写代码之前,你需要确保具备以下条件和权限:

  • 一个已认证的Bot Token:通过BotFather创建机器人并获取Token。这是调用所有Telegram API的凭证。
  • 支付渠道资格:Telegram支付目前支持多种支付提供商(如Stripe、Tron、PayMaster等),不同提供商有不同的入驻要求。对于中国大陆开发者,通常选择支持国际业务的提供商,或使用加密货币支付方案。
  • 与BotFather绑定支付提供商:Telegram不会直接处理资金,你需要先在支付提供商平台创建账号并获取API密钥,然后在BotFather中发送/payment指令进行关联。

注意:支付功能仅对公开的机器人开放,且机器人必须通过BotFather完成付款设置。

二、通过BotFather开通支付并获取Provider Token

这是最容易出错的一步,操作如下:

  1. 打开Telegram,搜索@BotFather,输入/mybots,选择你的机器人。
  2. 点击Payment选项,进入支付设置。
  3. 选择可用的支付提供商,依据页面提示填入你在提供商平台获取的API密钥(如Stripe Secret Key)。
  4. 成功绑定后,BotFather会返回一个Provider Token,形如284685063:TEST:Y2JhYjE3MjA。注意区分测试令牌和正式令牌,测试令牌用于沙箱环境。

获取到Provider Token后,将其放在服务端环境变量中,切勿暴露到客户端。

三、支付接口核心API解析

Telegram Bot API提供了三个关键的支付接口,理解它们才能正确串联支付流程:

  • sendInvoice:向用户发送一张电子发票(账单),包含商品名称、描述、价格、货币等参数。用户看到的是一个带价格标签的卡片。
  • answerShippingQuery:当用户选择配送地址时触发,你需要回传可用的配送选项或错误提示(如果商品不需要物流,则无需配置)。
  • answerPreCheckoutQuery:在用户确认支付前,Telegram会发送预结算请求,你的后端必须返回ok: true才能放行,否则支付中断。

此外还有setPassportDataErrors等,但支付核心就是这三个。每个接口的具体参数可以通过官方文档查询,下面提供实战示例。

四、Python实战:完整对接示例代码

下面以Python为例,使用requests库手动实现支付流,不依赖重型框架,便于理解底层逻辑。假设你已设置好环境变量BOT_TOKENPROVIDER_TOKEN

import requests
import json
import time

BOT_TOKEN = "你的BOT_TOKEN"
PROVIDER_TOKEN = "你的PROVIDER_TOKEN"
API = f"https://api.telegram.org/bot"


def send_invoice(chat_id, title, description, payload, amount, currency="RUB"):
    """发送发票"""
    data = {
        "chat_id": chat_id,
        "title": title,
        "description": description[:255],
        "payload": payload,  # 自定义数据,用于关联订单
        "provider_token": PROVIDER_TOKEN,
        "currency": currency,
        "prices": [{"label": title, "amount": int(amount * 100)}]  # 注意金额以分为单位
    }
    r = requests.post(f"/sendInvoice", json=data)
    return r.json()


def answer_pre_checkout(pre_checkout_id, ok=True, error_message=""):
    """响应预结算"""
    data = {
        "pre_checkout_query_id": pre_checkout_id,
        "ok": ok
    }
    if not ok:
        data["error_message"] = error_message
    r = requests.post(f"/answerPreCheckoutQuery", json=data)
    return r.json()

# 示例:获取更新的长轮询
def get_updates(offset):
    r = requests.get(f"/getUpdates", params={"offset": offset, "timeout": 30})
    return r.json()["result"]


def main():
    offset = 0
    while True:
        try:
            updates = get_updates(offset)
            for upd in updates:
                offset = upd["update_id"] + 1
                # 处理消息或回调
                if "message" in upd:
                    msg = upd["message"]
                    text = msg.get("text", "")
                    if text == "/pay":
                        # 发送一张售价10元的测试商品
                        send_invoice(
                            chat_id=msg["chat"]["id"],
                            title="测试商品",
                            description="一个测试虚拟商品",
                            payload="order_123",
                            amount=10,
                            currency="CNY"
                        )
                elif "pre_checkout_query" in upd:
                    pcq = upd["pre_checkout_query"]
                    # 这里可以验证订单信息,如无问题则确认
                    answer_pre_checkout(pcq["id"], ok=True)
                elif "successful_payment" in upd.get("message", {}):
                    # 支付成功通知
                    print("支付成功:", upd["message"]["successful_payment"])
        except Exception as e:
            print("Error:", e)
            time.sleep(3)

if __name__ == "__main__":
    main()

上述代码演示了核心流程。注意:成功支付的消息类型为successful_payment,你需要在这个字段里确认订单并发放权益。另外,sendInvoice还支持添加photosshipping_address等可选参数,使票据更美观或满足物流场景。

五、支付回调处理:确保订单状态同步

支付成功后的回调处理是业务的关键。Telegram会向你的Webhook或长轮询发送一条包含successful_payment的消息,其中含有payload(你自定义的订单号)、total_amountcurrency等。你需要做到:

  • 验签与幂等性:虽然Telegram的请求来自官方服务器,但为了安全,建议在你自己的数据库记录payload,并在处理前检查该订单是否已处理,避免重复发货。
  • 异步发放:如果发放权益涉及其他系统调用(如开通会员),建议异步处理并做好日志。
  • 异常处理:如果处理失败,可给管理员发送告警,并在一段时间后重试。

对于Webhook模式,务必使用setWebhook并设置安全的秘密令牌(Secret Token),以便在请求头中验证来源。

六、常见问题与调试技巧

在实际对接中,你可能会遇到以下问题,这里提供快速解决方案:

  • User not found for bot:通常是Provider Token与Bot不匹配,或者支付未开通。请回到BotFather检查。
  • 货币不支持:部分支付提供商不支持某些货币,请确认你所用的货币代码是否在支持列表(如CNY可能出现不支持的情况,建议用USD或RUB)。
  • 发票无法接收:检查Bot是否设置了隐私模式?支付消息与隐私无关,但若用户屏蔽了Bot则收不到。
  • 预结算超时:需要在请求后及时响应answerPreCheckoutQuery,最长等待时间为10秒,否则用户看到支付失败。

调试利器:使用BotFather提供的测试令牌(Test Provider Token)在沙箱环境中反复测试,并利用getUpdates的日志输出。另外,Telegram官方还提供sendInvoice的测试模式,无需真实扣款。

总结

Telegram机器人支付接口的对接并不复杂,核心在于理解Provider Token的绑定、三个关键API的调用顺序以及成功支付后的订单处理。按照本文的步骤,你可以在半小时内跑通一个简单的付费机器人。生产环境中,一定要重视安全性和幂等性,同时合理设计商品目录和库存体系。希望这篇指南能助你顺利实现商业变现,探索更多机器人应用场景。

FAQ

下载与安装

常见问题

如何获取用于Telegram支付的Provider Token?

首先在支持的支付提供商(如Stripe、Tron)注册并创建API密钥,然后在BotFather中给你的机器人发送/payment命令,选择相应的提供商并粘贴密钥,BotFather会返回对应的Provider Token。测试阶段使用TEST令牌,生产环境切换为LIVE令牌。

Telegram支付支持人民币(CNY)吗?

Telegram支付本身允许指定货币代码,但具体是否支持取决于所选支付提供商。许多提供商不支持CNY,建议使用USD、EUR或加密货币。如果你的用户主要在国内,可以考虑使用Tron等支持TRX的支付方案。

支付成功后如何处理订单?

Telegram会向你的Webhook或getUpdates推送一条包含successful_payment字段的消息,其中包含你自定义的payload、金额和货币。你需要根据该payload识别订单,校验金额后发放权益,并确保订单状态唯一(幂等),避免重复发货。