Предисловие
В процессе реализации своего VPN-бота, мне очень захотелось добавить оплату звездочками, потому что это сильно удобно. Подписку можно оплатить буквально в два клика.
TG Stars в целом сейчас обретают все большую популярность, учитывая, что Telegram уже не то что просто рекомендует, а заставляет всех продавцов цифровых переходить на оплату звездами.
If your bot or mini app sells digital goods and services, be sure to carry out the payment in Telegram Stars by specifying
XTR
as currency. In compliance with third-party store policies, Telegram does not support the sale of digital goods and services using other currencies.
Подробнее в документации.
Добавление оплаты в бота
Либо я плохо гуглил, либо на просторах сети действительно нет +/- адекватного примера, как добавить оплату звездочками в бота, написанном на Go.
На самом, все довольно легко и просто.
Создание и отправка инвойса
import tele "gopkg.in/telebot.v3"
var bot, _ = tele.NewBot(tele.Settings{
Token: "token",
Poller: &tele.LongPoller{Timeout: 10},
})
var invoice = &tele.Invoice{
Title: "Оплата подписки",
Description: "Подписка",
Payload: "сюда можно что-то положить",
Token: "", // Токен оставляем пустым
Currency: "XTR", // Валюта для звездочек
Prices: []tele.Price{
{
Label: "Оплата подписки за 100 звездочек",
Amount: 100, // Кол-во звездочек к оплате
},
},
}
func initBot() {
bot.Handle("/test_pay", func(c tele.Context) error {
return c.Send(invoice)
})
}
Если отправить в бота /test_pay
, то увидим что-то подобное:

По сути, на этом все :) Дальше остается просто отправить инвойс пользователю и обработать его.
Обработка платежа
// Говорим телеграмму, что готовы принять платеж
bot.Handle(tele.OnCheckout, func(c tele.Context) error {
return c.Accept()
})
// Обрабатываем платеж
bot.Handle(tele.OnPayment, func (c tele.Context) error {
// логика по оформлению подписки и тд
return c.Send("<b>Ура!</b> Оплата прошла успешно.", tele.ModeHTML)
})
Полный пример
import tele "gopkg.in/telebot.v3"
var bot, _ = tele.NewBot(
tele.Settings{
Token: "token",
Poller: &tele.LongPoller{Timeout: 10},
},
)
var invoice = &tele.Invoice{
Title: "Оплата подписки",
Description: "Подписка",
Payload: "сюда можно что-то положить",
Token: "", // Токен оставляем пустым
Currency: "XTR", // Валюта для звездочек
Prices: []tele.Price{
{
Label: "Оплата подписки за 100 звездочек",
Amount: 100, // Кол-во звездочек к оплате
},
},
}
func initBot() {
// Команда для теста, чтобы отправить инвойс
bot.Handle("/test_pay", func(c tele.Context) error {
return c.Send(invoice)
})
// Говорим телеграмму, что готовы принять платеж
bot.Handle(tele.OnCheckout, func(c tele.Context) error {
return c.Accept()
})
// Обрабатываем платеж
bot.Handle(tele.OnPayment, func (c tele.Context) error {
// логика по оформлению подписки и тд
return c.Send("<b>Ура!</b> Оплата прошла успешно.")
})
}
Заключение
Все, оплата звездочками внедрена в нашего бота, поздравляю!
Буду очень благодарен за подписку на мой ТГ-канал 🥹