使用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
相关产品推荐
相关产品推荐

