在 Telegram 生态中,机器人(Bot)早已不只是聊天工具,更是商业变现的重要入口。通过 Telegram 官方的支付 API,开发者可以为机器人接入 Stripe 等支付服务商,让用户直接在聊天窗口内完成付款,适用于付费内容、会员订阅、虚拟商品销售等场景。本文将详细介绍 Telegram 机器人支付功能的接入步骤,从零开始搭建一个完整的收款流程,帮助你快速实现订单闭环。
一、支付功能接入前的准备
在开始接入支付之前,你需要确认以下条件已经满足:
- 一个已经创建好的 Telegram 机器人(通过 @BotFather 获取 Token)。
- 一个支持 Telegram 支付服务的支付服务商账号,目前官方支持的全球服务商包括 Stripe、Payment Form、YooMoney 等,中国区开发者通常使用 Stripe。
- 具备基本的 Bot API 调用能力,例如能使用 sendInvoice 方法发送 HTTP 请求。
如果你的机器人还没有创建,先通过 BotFather 完成创建并记录 Token,后续步骤将依赖这个身份凭证。
二、BotFather 开启支付功能
支付功能不是默认开放的,需要让 BotFather 将你的机器人设置为支持支付。具体操作如下:
- 在 Telegram 中找到 @BotFather,发送命令
/mybots,选择需要开启支付的机器人。 - 点击 Bot Settings,选择 Payments。
- 根据提示选择支付服务商(例如 Stripe),并输入你在服务商后台获得的付款令牌(Provider Token)。
- 完成后,BotFather 会返回成功信息,表示机器人已启用支付能力。
注意:不同支付服务商对商户资质有不同要求,例如 Stripe 需要绑定银行账户并验证企业或个人身份,请提前准备好相关资料。
三、获取支付提供商令牌
在 BotFather 中开通支付时,你需要一个“提供商令牌”(Provider Token)。这个令牌由支付服务商颁发,用于关联订单和资金流转。以 Stripe 为例:
- 登录 Stripe 管理后台,创建或选择一个现有商户账号。
- 进入“开发人员”菜单,在“API 密钥”页面找到密钥。
- Telegram 要求使用以
pk_live或pk_test开头的可发布密钥,但 BotFather 需要的是服务端密钥(即sk_live或sk_test),请注意区分。 - 将对应的密钥粘贴到 BotFather 的支付设置中,完成绑定。
强烈建议开发阶段使用测试密钥(sk_test),避免产生真实资金交易,测试完成后再切换为正式密钥。
四、使用 sendInvoice 发送收款请求
支付功能开启后,机器人就可以向用户发送“发票”(Invoice)了。在 Bot API 中,通过 sendInvoice 方法即可完成。一个典型的请求参数如下:
POST /bot<token>/sendInvoice
Content-Type: application/json
{
"chat_id": 123456789,
"title": "VIP会员月卡",
"description": "解锁全部高级功能,有效期30天",
"payload": "order_10001",
"provider_token": "YOUR_PROVIDER_TOKEN",
"currency": "CNY",
"prices": [
{ "label": "VIP会员", "amount": 9900 }
]
}
其中几个关键字段的含义:
- title 和 description:显示给用户的商品名称和详情。
- payload:你自己的订单号或业务标识,支付成功后原样返回,用于关联订单。
- provider_token:在 BotFather 中绑定的支付服务商令牌。
- currency:使用 ISO 4217 货币代码,例如 CNY、USD。
- amount:以最小货币单位计费,例如人民币分为单位,9900 即 99 元。
请求成功后会返回一个 Invoice 消息,用户点击“支付”按钮即可拉起付款界面。
五、处理支付回调:pre_checkout_query 与 successful_payment
用户完成支付前,Telegram 会向机器人发送一个 pre_checkout_query 更新(类似确认订单),机器人必须在 10 秒内调用 answerPreCheckoutQuery 方法确认或拒绝。如果确认无误,用户支付成功后,机器人会收到一个包含 successful_payment 字段的消息。处理流程如下:
- 在你的 Webhook 或轮询逻辑中,检测到
pre_checkout_query更新。 - 查询本地数据库,验证该订单(payload)是否有效、价格是否匹配。
- 调用
answerPreCheckoutQuery,并传入参数pre_checkout_query_id和ok=true;如果订单异常,设ok=false并附上错误说明。 - 当收到包含
successful_payment的消息时,即可为用户开通相应服务、发货或更新会员状态。
示例代码(Python 伪代码):
def handle_update(update):
if 'pre_checkout_query' in update:
query = update['pre_checkout_query']
# 校验订单
ok = validate_order(query['payload'], query['total_amount'])
bot.answer_pre_checkout_query(query['id'], ok=ok, error_message="订单信息有误" if not ok else None)
elif 'message' in update and 'successful_payment' in update['message']:
payment = update['message']['successful_payment']
activate_service(payment['payload'])
六、测试与上线注意事项
在正式发布前,务必进行完整的测试。这里整理了一些关键注意点:
- 使用
sk_test测试密钥时,只能使用 Stripe 提供的测试卡号,例如4242 4242 4242 4242,任何金额都可支付成功。 - 正式上线前,务必在 BotFather 中将支付令牌切换为
sk_live,否则真实用户无法付款。 - 设置好 Webhook,并确保 callback 地址为 HTTPS,且证书有效。
- 及时处理重复支付或掉单问题:利用 payload 中的唯一订单号做幂等操作。
- 关注 Telegram Bot API 文档中的 Payment 章节,因为接口字段可能会随版本更新而变化。
总结
Telegram 机器人支付功能的接入并不复杂,核心就是三件事:通过 BotFather 开通、调用 sendInvoice 发送发票、处理支付回调。按照本文的步骤,你就能在自己的机器人中加入支付能力,实现自动收款。结合 Telegram 庞大的用户群,这无疑是变现的一条捷径。如果你在接入过程中遇到问题,欢迎查阅官方文档,或在评论区留言交流。