Проблема
Когда пользователь делится контактом через кнопку request_contact, ContactAttachment десериализуется со всеми полями данных в null (VcfInfo, MaxInfo, PhoneNumber, FullName), хотя Type="contact" заполнен корректно.
Корневая причина
Реальный Max API оборачивает данные контакта в объект payload:
{
"type": "contact",
"payload": {
"vcf_info": "BEGIN:VCARD\nTEL:+...\nEND:VCARD",
"max_info": { "user_id": 123, "first_name": "..." }
}
}
Но начиная с версии 0.5.2-alpha (изменение «flat attachments») ContactAttachment читает vcf_info и max_info напрямую с корня аттача, поэтому они остаются null.
Доказательство, что реальный API использует nested формат
Официальный Go SDK от команды Max — max-messenger/max-bot-api-client-go — описывает схему так:
type ContactAttachment struct {
Attachment
Payload ContactAttachmentPayload \`json:"payload"\`
}
type ContactAttachmentPayload struct {
VcfInfo string \`json:"vcf_info,omitempty"\`
TamInfo *User \`json:"max_info"\`
}
То есть данные находятся внутри payload. Мы также захватили реальный ответ /updates через runtime debugger — формат тот же.
Шаги воспроизведения
- Отправить сообщение с
InlineKeyboard, содержащим кнопку с Type = ButtonType.RequestContact.
- Нажать на кнопку в реальном Max-клиенте и поделиться контактом.
- Проверить
message.Body.Attachments[0] — это ContactAttachment, у которого все поля null, кроме Type.
Заявление 0.5.2-alpha «все attachment-модели переведены на плоский формат» вероятно справедливо для photo/video/audio/document — но для contact это не так; реальный API использует nested.
Проблема
Когда пользователь делится контактом через кнопку
request_contact,ContactAttachmentдесериализуется со всеми полями данных вnull(VcfInfo,MaxInfo,PhoneNumber,FullName), хотяType="contact"заполнен корректно.Корневая причина
Реальный Max API оборачивает данные контакта в объект
payload:{ "type": "contact", "payload": { "vcf_info": "BEGIN:VCARD\nTEL:+...\nEND:VCARD", "max_info": { "user_id": 123, "first_name": "..." } } }Но начиная с версии 0.5.2-alpha (изменение «flat attachments»)
ContactAttachmentчитаетvcf_infoиmax_infoнапрямую с корня аттача, поэтому они остаютсяnull.Доказательство, что реальный API использует nested формат
Официальный Go SDK от команды Max —
max-messenger/max-bot-api-client-go— описывает схему так:То есть данные находятся внутри
payload. Мы также захватили реальный ответ/updatesчерез runtime debugger — формат тот же.Шаги воспроизведения
InlineKeyboard, содержащим кнопку сType = ButtonType.RequestContact.message.Body.Attachments[0]— этоContactAttachment, у которого все поляnull, кромеType.Заявление 0.5.2-alpha «все attachment-модели переведены на плоский формат» вероятно справедливо для photo/video/audio/document — но для contact это не так; реальный API использует nested.