В этом руководстве описаны распространенные ошибки, связанные с банковскими картами , с которыми вы можете столкнуться, и способы их устранения.
Используйте конструктор карточек для разработки и предварительного просмотра сообщений и пользовательских интерфейсов для чат-приложений:
Откройте конструктор карточек.Как появляются ошибки на карте
Ошибки в работе банковских карт проявляются несколькими способами:
- Часть карточки, например, виджет или компонент, либо не отображается, либо отображается неожиданным образом.
- Вся карточка не отображается.
- Диалоговое окно закрывается, не открывается или не загружается.
Если вы сталкиваетесь с подобным поведением, это означает, что в карточке вашего приложения произошла ошибка.
Для справки: работающее, безошибочное сообщение и диалоговое окно для открытки.
Прежде чем рассматривать примеры карточек с ошибками, сначала взгляните на это рабочее сообщение и диалоговое окно карточки. Чтобы проиллюстрировать каждую ошибку в примере и способ её исправления, JSON-код этой карточки изменён путём добавления ошибок.
Сообщение на открытке без ошибок
Вот рабочий, безошибочный шаблон сообщения для открытки с контактной информацией, включающий заголовок, разделы и виджеты, такие как декоративный текст и кнопки:
Диалог без ошибок
Вот рабочий, безошибочный диалог, который создает контакт, собирая информацию от пользователей, с нижним колонтитулом и редактируемыми виджетами, такими как текстовое поле, переключатели и кнопки:
Ошибка: Часть карточки не отображается
Иногда карточки отображаются, но часть карточки, которую вы ожидали увидеть, не появляется; вероятные причины:
- Отсутствует обязательное поле JSON.
- В поле JSON допущена орфографическая ошибка или неправильно написаны заглавные буквы.
Причина: Отсутствует обязательное поле JSON.
В этом примере ошибки отсутствует обязательное поле JSON, title . В результате карточка отображается, но те части карточки, которые должны отображаться, не отображаются. Предсказать, как будут отображаться карточки, если отсутствуют обязательные поля, может быть сложно.
Чтобы исправить эту ошибку, добавьте необходимое поле JSON; в этом примере это title .
Чтобы узнать, является ли поле JSON обязательным, см. справочную документацию Cards v2 . В этом примере обратитесь к описанию поля title в CardHeader .
Вот два примера:
Пример 1: Если указать subtitle , но не указать обязательный title , весь заголовок будет отображаться пустым:

title ». Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В header отсутствует обязательное поле title .
. . . "header": { "subtitle": "Software Engineer" } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: обязательное поле title теперь является частью спецификации header .
. . . "header": { "title": "Sasha", "subtitle": "Software Engineer" } . . .
Пример 2: Указание subtitle , imageUrl , imageType и imageAltText без обязательного title приводит к тому, что изображение отображается как ожидалось, но подзаголовок — нет:

title , но изображение отображается как положено. Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В header отсутствует обязательное поле title .
. . . "header": { "subtitle": "Software Engineer", "imageUrl": "https://developers.google.com/chat/images/quickstart-app-avatar.png", "imageType": "CIRCLE", "imageAltText": "Avatar for Sasha", } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: обязательное поле title теперь является частью спецификации header .
. . . "header": { "title": "Sasha", "subtitle": "Software Engineer", "imageUrl": "https://developers.google.com/chat/images/quickstart-app-avatar.png", "imageType": "CIRCLE", "imageAltText": "Avatar for Sasha", } . . .
Причина: Неправильное написание или написание JSON-файла с заглавной буквы.
В этом примере ошибки JSON-файл карточки содержит все необходимые поля, за исключением одного поля, imageUrl , которое написано с неправильной заглавной буквы как imageURL (заглавная R заглавная L ), что приводит к ошибке: изображение, на которое оно указывает, не отображается.
Чтобы исправить эту и другие подобные ошибки, используйте правильный формат JSON. В данном случае imageUrl указан корректно. В случае сомнений, сравните JSON-код карты с документом-справочником карты .

title , но изображение отображается как положено. Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: Поле imageURL написано с неправильным регистром. Правильное написание — imageUrl .
. . . "header": { "title": "Sasha", "subtitle": "Software Engineer", "imageURL": "https://developers.google.com/chat/images/quickstart-app-avatar.png", "imageType": "CIRCLE", "imageAltText": "Avatar for Sasha", } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: Поле imageUrl теперь пишется с правильным регистром.
. . . "header": { "title": "Sasha", "subtitle": "Software Engineer", "imageUrl": "https://developers.google.com/chat/images/quickstart-app-avatar.png", "imageType": "CIRCLE", "imageAltText": "Avatar for Sasha", } . . .
Ошибка: не отображается вся карточка целиком.
Иногда сама карта не отображается; вероятные причины следующие:
- Виджет
ButtonListуказан некорректно. - В виджете
CardFixedFooterнекорректно указана кнопка.
Причина: Неправильно указан buttonList или cardFixedFooter
Если в карточке сообщения или диалоговом окне содержится неправильно указанный виджет ButtonList или виджет CardFixedFooter с неправильно указанными кнопками, вся карточка не отображается, и на её месте ничего не появляется. Неправильные спецификации могут включать в себя отсутствующие поля, поля с неправильным написанием или регистром букв, а также неправильно структурированный JSON, например, отсутствующую запятую, кавычку или фигурную скобку.
Для исправления этой ошибки сравните JSON-файл карточки с документом-справочником по карточкам . В частности, сравните все виджеты ButtonList с руководством по виджетам ButtonList .
Пример: В руководстве по виджету ButtonList передача неполного действия onClick в первой кнопке препятствует отображению всей карточки.
Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В объекте onClick не указаны поля, поэтому карточка отображается не полностью.
. . . { "buttonList": { "buttons": [ { "text": "Share", "onClick": { } } }, { "text": "Edit", "onClick": { "action": { "function": "goToView", "parameters": [ { "key": "viewType", "value": "EDIT", } ], } } }, ], }, } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: теперь объект onClick имеет поле openLink , поэтому карточка отображается должным образом.
. . . { "buttonList": { "buttons": [ { "text": "Share", "onClick": { "openLink": { "url": "https://example.com/share", } } }, { "text": "Edit", "onClick": { "action": { "function": "goToView", "parameters": [ { "key": "viewType", "value": "EDIT", } ], } } }, ], }, } . . .
Ошибка: Диалоговое окно закрывается, зависает или не открывается.
Если диалоговое окно неожиданно закрывается, не загружается или не открывается, вероятная причина — проблема с интерфейсом карточки.
Вот наиболее распространенные причины:
- Виджет
CardFixedFooterне имеетprimaryButton. - У кнопки в виджете
CardFixedFooterотсутствует действиеonClick, или же действиеonClickуказано некорректно. - В виджете
TextInputотсутствует полеname.
Причина: CardFixedFooter отсутствует primaryButton
В диалоговых окнах с виджетом CardFixedFooter необходимо указать primaryButton с текстом и цветом. Отсутствие указания primaryButton или ее неправильная настройка приведут к тому, что диалоговое окно не отобразится полностью.
Чтобы исправить эту ошибку, убедитесь, что виджет CardFixedFooter содержит правильно указанную primaryButton ).
Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В объекте fixedFooter не указано поле primaryButton , что приводит к невозможности загрузки или открытия диалогового окна.
. . . "fixedFooter": { "onClick": { . . . }, "secondaryButton": { . . . } } } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: Теперь в fixedFooter указано поле primaryButton , поэтому диалоговое окно работает как ожидалось.
. . . "fixedFooter": { "primaryButton": { "text": "Submit", "color": { "red": 0, "blue": 1, "green": 0 }, "onClick": { . . . }, "secondaryButton": { . . . } } } . . .
Причина: Неправильная настройка onClick в FixedFooter
В диалоговых окнах с виджетом CardFixedFooter неправильное указание параметра onClick для любой кнопки или его отсутствие может привести к закрытию диалогового окна, невозможности его загрузки или невозможности его открытия.
Чтобы исправить эту ошибку, убедитесь, что для каждой кнопки указана корректная настройка onClick .
Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В объекте primaryButton поле onClick содержит неправильно написанный массив `parameters`, что приводит к невозможности загрузки или открытия диалогового окна.
. . . "fixedFooter": { "primaryButton": { "text": "Submit", "color": { "red": 0, "blue": 1, "green": 0 }, "onClick": { "action": { "function": "setLanguageType", "parrammetters": [ { "key": "languageType", "value": "C++" } ] } } }, "secondaryButton": { "text": "Cancel", "onClick": { "action": { "function": "reset" } } } } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: Объект primaryButton имеет поле onClick с правильно написанным массивом `parameters`, поэтому диалоговое окно работает как ожидалось.
. . . "fixedFooter": { "primaryButton": { "text": "Submit", "color": { "red": 0, "blue": 1, "green": 0 }, "onClick": { "action": { "function": "setLanguageType", "parameters": [ { "key": "languageType", "value": "C++" } ] } } }, "secondaryButton": { "text": "Cancel", "onClick": { "action": { "function": "reset" } } } } . . .
Причина: TextInput нет name
Если диалоговое окно содержит виджет TextInput , который исключает поле name , диалоговое окно будет работать не так, как ожидается. Оно может закрыться, открыться, но не загрузиться, или вообще не открыться.
Чтобы исправить эту ошибку, убедитесь, что каждый виджет TextInput содержит соответствующее поле name . Убедитесь, что каждое поле name на карточке уникально.
Просмотреть ошибочный фрагмент JSON-кода карты
Ошибка: В объекте textInput не указано поле name , что приводит к закрытию диалогового окна, невозможности его загрузки или открытия.
. . . { "textInput": { "label": "Name", "type": "SINGLE_LINE", } } . . .
Просмотрите правильный фрагмент JSON-кода карты.
Исправлено: Теперь в поле textInput указано name , поэтому диалоговое окно работает как ожидалось.
. . . { "textInput": { "label": "Name", "type": "SINGLE_LINE", "name": "contactName" } } . . .
Действия по открытию, отправке или отмене диалоговых окон не выполняются в асинхронной архитектуре приложения.
Если ваше приложение для чата выдает сообщение об ошибке Could not load dialog. Invalid response returned by bot. при работе с диалогами , это может быть связано с тем, что ваше приложение использует асинхронную архитектуру , например, Cloud Pub/Sub или метод Create Message API.
Для открытия, отправки или отмены диалога требуется синхронный ответ от приложения чата с типом DialogEventType . Соответственно, диалоги не поддерживаются приложениями, построенными на асинхронной архитектуре .
В качестве обходного пути можно использовать сообщение в виде карточки вместо диалогового окна.
Другие ошибки карточек и диалоговых окон.
Если описанные на этой странице решения не устраняют ошибку, связанную с картой, в вашем приложении, запросите журналы ошибок приложения . Запрос журналов поможет найти ошибки в JSON-файле карты или коде приложения, а также содержит подробные сообщения об ошибках, которые помогут вам их исправить.
Связанные темы
Для получения помощи по устранению ошибок в приложении Google Chat см. разделы «Устранение неполадок и исправление ошибок в приложении Google Chat» и «Отладка приложений чата» .