Проблема
Когда пользователь стартует бота по диплинку (/start <arg> или https://max.ru/<bot>?start=<arg>), в событии bot_started приходит поле payload — аргумент диплинка. SDK его теряет: после десериализации этот аргумент недоступен, и реферальные/онбординговые сценарии ломаются.
Корневая причина
Класс BotStartedUpdate содержит только UpdateId, Timestamp, ChatId, User, UserLocale. Поле Payload отсутствует. Корневой Update тоже не имеет этого свойства, поэтому фабрика Update.BotStartedUpdate физически не может его пробросить:
return new BotStartedUpdate
{
UpdateId = UpdateId,
Timestamp = Timestamp,
ChatId = ChatId,
User = User,
UserLocale = UserLocale
// payload теряется
};
Реальный формат API
Захваченный через runtime debugger ответ /updates:
{
"update_type": "bot_started",
"timestamp": 1730000000000,
"chat_id": 12345,
"user": { "user_id": 67890, "name": "...", "is_bot": false },
"payload": "ref-abc123",
"user_locale": "ru"
}
Официальный Go SDK от команды Max — max-messenger/max-bot-api-client-go — описывает событие так:
type BotStarted struct {
Update
ChatID int64 `json:"chat_id"`
User User `json:"user"`
Payload string `json:"payload,omitempty"`
UserLocale string `json:"user_locale,omitempty"`
}
Шаги воспроизведения
- Получить ссылку на бота c диплинк-параметром:
https://max.ru/<bot_username>?start=ref-abc123.
- Открыть её в Max-клиенте, нажать «Запустить».
- В обработчике
BotStartedUpdate попытаться прочитать аргумент диплинка — поля для него нет, значение недоступно.
Предлагаемое исправление
- Добавить свойство
Payload (string?, [JsonPropertyName("payload")]) в BotStartedUpdate.
- Добавить теневое поле
Payload в Update (по аналогии с тем, как там сейчас живут ChatId, Timestamp, User, UserLocale) и пробросить его в фабрике Update.BotStartedUpdate.
Workaround
Сейчас приходится перехватывать сырой JSON /updates через DelegatingHandler и вытягивать payload по (timestamp, chat_id), чтобы передать его в обработчик после парсинга SDK.
Проблема
Когда пользователь стартует бота по диплинку (
/start <arg>илиhttps://max.ru/<bot>?start=<arg>), в событииbot_startedприходит полеpayload— аргумент диплинка. SDK его теряет: после десериализации этот аргумент недоступен, и реферальные/онбординговые сценарии ломаются.Корневая причина
Класс
BotStartedUpdateсодержит толькоUpdateId,Timestamp,ChatId,User,UserLocale. ПолеPayloadотсутствует. КорневойUpdateтоже не имеет этого свойства, поэтому фабрикаUpdate.BotStartedUpdateфизически не может его пробросить:Реальный формат API
Захваченный через runtime debugger ответ
/updates:{ "update_type": "bot_started", "timestamp": 1730000000000, "chat_id": 12345, "user": { "user_id": 67890, "name": "...", "is_bot": false }, "payload": "ref-abc123", "user_locale": "ru" }Официальный Go SDK от команды Max —
max-messenger/max-bot-api-client-go— описывает событие так:Шаги воспроизведения
https://max.ru/<bot_username>?start=ref-abc123.BotStartedUpdateпопытаться прочитать аргумент диплинка — поля для него нет, значение недоступно.Предлагаемое исправление
Payload(string?,[JsonPropertyName("payload")]) вBotStartedUpdate.PayloadвUpdate(по аналогии с тем, как там сейчас живутChatId,Timestamp,User,UserLocale) и пробросить его в фабрикеUpdate.BotStartedUpdate.Workaround
Сейчас приходится перехватывать сырой JSON
/updatesчерезDelegatingHandlerи вытягиватьpayloadпо(timestamp, chat_id), чтобы передать его в обработчик после парсинга SDK.