You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用telego开发Telegram Bot生成发票遇REPLY_MARKUP_BUY_EMPTY错误

问题:Telego库发送发票时提示REPLY_MARKUP_BUY_EMPTY错误

问题描述

使用telego开发Telegram Bot,创建支付发票消息时,已传入包含回调按钮的InlineKeyboard,但仍收到以下400错误:

2023/03/28 13:30:15 Unable to send sendInvoice. received status code 400
Error code : 400, Description : Bad Request: REPLY_MARKUP_BUY_EMPTY

官方go-telegram-bot-api包执行类似操作可正常运行,检查telego源码发送流程未发现明显问题。

原因分析

Telegram的发票消息对回复标记有特殊要求:必须包含专门的支付按钮,而非普通的回调按钮。你当前使用的AddCallbackButtonHandler添加的是普通回调按钮,不符合Telegram发票接口的要求,因此被判定为回复标记为空。

解决方案

将普通回调按钮替换为telego库提供的支付按钮,使用AddPayButton方法(而非AddCallbackButtonHandler)来构建发票对应的InlineKeyboard。

修改后的代码示例:

providerToken := "123:XXXX:123" 
err = bot.AddHandler("/pay", func(u *objs.Update) {
    kb := bot.CreateInlineKeyboard()
    // 替换为支付按钮,而非普通回调按钮
    kb.AddPayButton("Buy")
    
    inv := bot.AdvancedMode().ACreateInvoice(
        u.Message.Chat.Id,
        "Test invoice",
        "description here",
        "custom_payload",
        providerToken,
        "USD",
        []objs.LabeledPrice{{Label: "USD", Amount: 200}},
        40,
        []int{10, 20},
        "start_param",
        "",
        "",
        0,
        0,
        0,
        true,
        true,
        true,
        false,
        false,
        false,
        false,
        false,
        false,
        kb,
    )
    _, err = inv.Send(u.Message.MessageId, false)
    if err != nil {
        log.Println(err)
    }
}, "private")

补充说明

支付按钮是Telegram为发票消息专门设计的按钮类型,点击后会触发Telegram内置的支付流程,而普通回调按钮无法触发该流程,因此会被接口判定为无效的回复标记。如果需要在支付完成后执行自定义逻辑,可以通过监听Telegram的successful_payment更新事件来实现。

内容的提问来源于stack exchange,提问作者Escalopa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:15:01