Перейти к основному содержанию

Зачем нужны BSUID

В 2026 году WhatsApp внедряет опциональные имена пользователей. Если пользователь выбирает имя пользователя, WhatsApp может отображать его вместо номера телефона и исключать номер телефона из полезной нагрузки Webhook. Каждый пользователь сам решает, использовать ли имя пользователя, поэтому компании больше не могут полагаться исключительно на номера телефонов для идентификации клиентов. В связи с этим Meta требует от компаний и партнеров WhatsApp Business Platform, а также от рекламодателей click-to-WhatsApp поддерживать BSUID, чтобы продолжать обрабатывать сообщения от пользователей, использующих имена пользователей. В рамках поддержки этих изменений Meta начала добавлять business-scoped user ID (BSUID) в полезную нагрузку Webhook в начале апреля 2026 года. BSUID — это бэкенд-идентификатор одного пользователя WhatsApp в рамках одного бизнес-портфолио Meta. Meta включает его в Webhook сообщений независимо от того, выбрал ли пользователь имя пользователя, и его можно использовать для отправки сообщений, когда номер телефона пользователя недоступен. Имена пользователей и BSUID имеют разные жизненные циклы. Пользователь может изменить имя пользователя, не меняя номер телефона или BSUID. Если пользователь меняет номер телефона, Meta генерирует новый BSUID. Храните эти идентификаторы отдельно и обновляйте их связь при получении системного события смены номера телефона. Номер телефона по-прежнему может отображаться, если бизнес-номер телефона обменивался сообщениями или звонками с пользователем в течение последних 30 дней, или если пользователь есть в адресной книге Meta. Считайте поля номера телефона и имени пользователя условными и настройте парсеры и хранилище идентификаторов для приема BSUID наряду с другими присутствующими идентификаторами. В этом руководстве рассматриваются правила идентификации BSUID, запросы сообщений и звонков, адресная книга Meta и поля Webhook, которые необходимо сохранять вашей интеграции. Пример имени пользователя WhatsApp

Обзор идентификаторов

Meta автоматически генерирует обычные BSUID. Каждый BSUID начинается с двухбуквенного кода страны пользователя по стандарту ISO 3166 alpha-2, за которым следуют точка и до 128 буквенно-цифровых символов. Сохраняйте значение целиком. Не удаляйте и не изменяйте префикс страны, точку или символы идентификатора. Для BSUID действуют следующие правила жизненного цикла:
  • BSUID уникален для пары «бизнес-портфолио — пользователь».
  • BSUID пользователя изменяется при смене пользователем своего номера телефона.
  • Parent BSUID работает в рамках связанных портфолио, для которых Meta включила эту функцию.
  • Бизнес-номер телефона не может использовать обычный BSUID, привязанный к другому портфолио.
Шаблоны аутентификации one-tap, zero-tap и copy-code требуют номер телефона. Не отправляйте шаблоны этих типов, указывая только BSUID.
Чтобы связать портфолио и использовать parent BSUID, обратитесь к контактному лицу в Meta для проверки соответствия требованиям. После включения parent BSUID со стороны Meta вы можете продолжать использовать обычные BSUID в их исходных портфолио. Пример business-scoped user ID

Перед началом работы

  • Сохраните свой ключ API YCloud в YCLOUD_API_KEY.
  • Используйте бизнес-номер телефона WhatsApp, принадлежащий тому же портфолио, что и обычный BSUID.
  • Подпишите конечную точку Webhook на события WhatsApp, которые используются вашей интеграцией.
  • При десериализации событий Webhook обрабатывайте каждое новое поле BSUID, parent BSUID, номера телефона и имени пользователя как необязательное.
  • Сохраняйте обычный BSUID и parent BSUID независимо друг от друга, если присутствуют оба.

Отправка сообщения с помощью BSUID

Обе конечные точки сообщений WhatsApp принимают recipient: Укажите в recipient обычный BSUID или parent BSUID. Опустите to, если хотите, чтобы YCloud адресовал сообщение пользователю по BSUID.
Используйте то же тело запроса с POST /whatsapp/messages для постановки сообщения в очередь.

Запрос номера телефона пользователя

Используйте сообщение с запросом контактных данных, когда вашему рабочему процессу требуется номер телефона, который не был передан в Webhook. Пользователь сам решает, делиться ли им.

Использование кнопки шаблона

Добавьте кнопку REQUEST_CONTACT_INFO в сервисный или маркетинговый шаблон. Текст кнопки фиксирован как Share Contact Info, и кнопка не принимает параметры во время отправки.
Создайте и согласуйте шаблон перед его отправкой. См. Шаблон запроса номера телефона для ознакомления с полным запросом на создание шаблона.

Использование интерактивного сообщения

Отправьте интерактивное сообщение request_contact_info, если вам не требуется шаблон:

Обработка ответа с контактом

Когда пользователь делится контактной информацией, YCloud отправляет событие whatsapp.inbound_message.received, где type сообщения имеет значение contacts. В качестве ответа на ваш запрос поле contacts[].origin содержит contact_request.
Проверьте подпись события, подтвердите его получение ответом 2xx и обработайте номер телефона асинхронно. Контакт, отправленный напрямую из WhatsApp, также может содержать vCard. Кнопка запроса контактной информации

Принцип работы адресной книги Meta

Адресная книга Meta сохраняет связь между номером телефона пользователя и BSUID. Если эта функция включена, отправка или получение сообщения либо звонка с использованием номера телефона пользователя сохраняет оба идентификатора. После этого Meta может включать эту связь в Webhook-уведомления, даже если пользователь начнет использовать имя пользователя (username). Адресные книги привязаны к отдельным бизнес-портфолио. Связанные портфолио не разделяют и не синхронизируют свои записи: связь сохраняется независимо в каждом портфолио. Meta хранит записи до тех пор, пока вы не отключите эту функцию или не деактивируете аккаунт. Вы можете отключить ее в разделе Meta Business Suite > Настройки компании > Информация о компании. Отключение функции приводит к удалению сохраненных записей и прекращению фиксации новых. Повторное включение начинает сбор новых записей, но не восстанавливает удаленные данные. Настройки адресной книги Meta

Запросы контактов и локальное хранилище

Когда пользователь передает свой номер телефона с помощью кнопки запроса контактных данных, Meta добавляет этот номер в адресную книгу, если функция включена. Для компаний, использующих Local Storage, Meta извлекает номер телефона из переданной vCard и сохраняет его в адресной книге в центрах обработки данных Meta. Остальные данные vCard не сохраняются дольше стандартного срока хранения. Meta отменила действовавшее ранее требование отправлять отдельное сообщение для фиксации этой связи. Ознакомьтесь с официальной документацией по BSUID относительно актуального поведения Local Storage.

Удаление записи из адресной книги Meta

Удалите запись из адресной книги Meta для стандартного BSUID через один рабочий номер телефона WhatsApp с помощью: DELETE /whatsapp/phoneNumbers/{wabaId}/{phoneNumber}/contactBook/{bsuid}
Используйте стандартный BSUID для этой операции. Родительские BSUID, содержащие .ENT., не поддерживаются. При формировании пути вручную выполните URL-кодирование начального символа + в номере телефона как %2B. HTTP-ответ 200 всегда содержит success: true. Значение deleted, равное true, означает, что Meta удалила соответствующую запись. Значение false указывает, что Meta обработала запрос, но подходящей записи не нашлось. Удаление записи не приводит к удалению контактов, сообщений или бизнес-записей BSUID в YCloud. После удаления события Webhook для рабочих номеров телефонов в том же бизнес-портфолио Meta больше не будут содержать номер телефона пользователя вместе с BSUID. 30-дневный кэш Meta по-прежнему может возвращать оба идентификатора, а последующее взаимодействие может создать запись в адресной книге повторно.

Инициация звонка с помощью BSUID

POST /whatsapp/calls/connect также принимает recipient. Действуют те же правила указания получателя: укажите to или recipient, при этом to имеет приоритет, если указаны оба параметра.
Полный жизненный цикл звонков описан в руководстве Управление звонками WhatsApp.

Обработка полей Webhook для BSUID

Приведенные ниже полезные нагрузки Webhook от YCloud демонстрируют поля, добавленные или измененные для поддержки BSUID. Обновите свой парсер для поддержки новых идентификаторов и обработки отсутствующих номеров телефонов клиентов. Примеры содержат оболочку события YCloud и показывают расположение каждого поля. Необязательные поля следуют описанным ниже правилам исключения. Удалите комментарии // <ADDED> и // <CHANGED> перед использованием данных полезной нагрузки в качестве тестового JSON. Применяйте следующие правила отсутствия полей:
  • Поле родительского BSUID отсутствует, если родительские BSUID не включены.
  • Поле целевого получателя отправленного сообщения или звонка может отсутствовать, если вы обращались к пользователю по номеру телефона.
  • customerProfile появляется в обновлениях сообщений sent, delivered и read, но не в обновлениях failed.
  • customerProfile.username отсутствует, если пользователь не включил имена пользователей. Оно также отсутствует в обновлениях статуса sent.
  • Номер телефона может отсутствовать, даже если присутствует соответствующий BSUID.
В примере показано доставленное сообщение. <CHANGED> помечает to как условное, если номер телефона недоступен. Новый объект customerProfile опускается для failed; его username также опускается для sent или если у пользователя нет имени пользователя.
Сохраняйте новые идентификаторы отправителя вместе с существующим именем профиля. Идентификатор бизнес-получателя to не меняется; номер телефона клиента from может быть опущен. Пример смены номера телефона приведен ниже для сообщения system.
Настройка остается в whatsappUserPreference. Используйте предоставленные идентификаторы пользователя, даже если contactPhoneNumber отсутствует.
Для звонков, инициированных бизнесом, идентификаторами клиента являются toUserId и toParentUserId. Для звонков, инициированных пользователем, это fromUserId и fromParentUserId. Только поле номера телефона клиента может быть опущено в этих примерах.
Для звонков, инициированных бизнесом, идентификаторами клиента являются toUserId и toParentUserId. Для звонков, инициированных пользователем, это fromUserId и fromParentUserId. Только поле номера телефона клиента может быть опущено в этих примерах.
Идентификаторы получателя находятся на одном уровне с recipientPhone внутри callingStatusUpdated.
Обновление одного участника может передавать идентификаторы непосредственно в whatsappGroup. Пакетные результаты передают их в каждом элементе в addedParticipants, removedParticipants или failedParticipants. Обрабатывайте массив для соответствующей операции в событии.
Сохраняйте оболочку конкретного события: входящая история использует whatsappInboundMessage, а исходящая — whatsappMessage. Исходящие toUserId и toParentUserId являются псевдонимами совместимости для recipientUserId и parentRecipientUserId. В этих примерах показаны события, содержащие сообщения; фрагмент истории, содержащий только метаданные, может опускать оба объекта сообщений.
Эта полезная нагрузка сохранена из устаревшей документации по миграции на BSUID. Это событие не указано в текущем общедоступном каталоге событий, доступных для подписки; не добавляйте его в enabledEvents на основе этого примера. Используйте приведенную структуру при поддержке интеграции, которая уже получает эту устаревшую полезную нагрузку.
Это сообщения, отправленные из приложения WhatsApp Business или поддерживаемого сопряженного устройства. Устаревшие имена полей toUserId и toParentUserId являются псевдонимами совместимости для recipientUserId и parentRecipientUserId. Сохраняйте профиль в whatsappMessage.

Обработка смены номера телефона пользователем

Когда whatsappInboundMessage.type имеет значение system, а system.type — user_changed_number, внешние поля отправителя определяют старую идентичность пользователя. Вложенные поля system содержат новые BSUID и, если доступно, новый номер телефона. Используйте имена полей user_id и parent_user_id внутри system.
Считайте parent_user_id необязательным. Новый номер телефона в wa_id также может отсутствовать, поэтому используйте user_id и любой предоставленный parent_user_id для обновления сопоставления идентификаторов. Сохраняйте старые и новые значения достаточно долго, чтобы сопоставить существующие переписки и идемпотентно обновить хранилище идентификаторов.

Бизнес-имена пользователей

Бизнес-имя пользователя помогает клиентам находить вашу компанию в WhatsApp. Оно не скрывает номер телефона вашей компании. К каждому номеру телефона может быть привязано одно имя пользователя, и одно имя пользователя не может использоваться двумя телефонными номерами WhatsApp одновременно. Имя пользователя клиента может измениться без изменения BSUID пользователя. Сохраняйте имя пользователя как информацию профиля, а не используйте его в качестве ключа идентификации. См. раздел Запрос бизнес-имени пользователя, где описаны правила формата (от 3 до 35 символов), а также процесс запроса и проверки. Пример бизнес-имени пользователя

Зарезервированные имена пользователей

Вы можете запросить подходящее имя пользователя, зарезервированное Meta, или выбрать другое имя пользователя для своего бренда. Используйте WhatsApp Manager, Meta Business Suite или API имен пользователей. Само по себе одобрение не означает, что имя пользователя уже активно для клиентов. Если зарезервированное имя пользователя принадлежит вашей Странице Facebook или аккаунту Instagram, свяжите рабочий номер телефона с этой Страницей или аккаунтом перед тем, как запросить его. Вы можете связать его во время запроса имени пользователя в Meta Business Suite или WhatsApp Manager, либо добавить номер телефона на Страницу или в аккаунт. Для этого требуется полный контроль или базовый частичный доступ с разрешением manage_phone.

Приоритет отображения в окне чата

WhatsApp отображает информацию о компании в следующем порядке приоритета:
  1. Имя, сохраненное в контактах клиента.
  2. Подтвержденное название компании или имя официального бизнес-аккаунта (Official Business Account).
  3. Имя пользователя компании.
  4. Номер телефона.
Номер телефона вашей компании остается видимым в профиле компании.

Контрольный список для миграции

  1. Добавьте каждое поле вебхука, связанное с BSUID, в свою модель десериализации как необязательное поле.
  2. Храните обычные и родительские BSUID отдельно от номеров телефонов и имен пользователей.
  3. Индексируйте идентификаторы клиентов по портфолио и BSUID. Не рассматривайте BSUID как глобально переносимый идентификатор.
  4. Маршрутизируйте запросы на сообщения и звонки через to или recipient, а также протестируйте правило приоритета to.
  5. Протестируйте сценарии с пользователями только с именем пользователя, отсутствующими номерами телефонов, сменой номера телефона, отсутствующими родительскими BSUID, дублирующимися вебхуками и повторным созданием контактной книги.

Примеры статусов сообщений

Проверьте полезную нагрузку для отправленных, доставленных, прочитанных и завершившихся ошибкой сообщений.

Примеры входящих сообщений

Проверьте полезную нагрузку для контактов, системных обновлений и других входящих событий.