При работе с мобильными приложениями и клиентами на платформе 1С, функциональность PUSH-уведомлений является одним из ключевых механизмов для оперативного информирования пользователей, поддержания их вовлеченности и обеспечения быстрой реакции на важные события. Однако на пути реализации этого функционала часто возникают технические сложности, связанные как с собственным сервисом 1С для PUSH-уведомлений, так и с интеграцией с внешними системами, такими как Firebase Cloud Messaging (FCM) от Google. В этой статье мы подробно разберем наиболее частые проблемы, с которыми сталкиваются разработчики, и предложим пошаговые решения, опираясь на опыт специалистов и рекомендации платформы 1С.
Мы рассмотрим две основные категории проблем, которые были подняты в нашем обсуждении и требуют внимательного подхода:
pushnotifications.1c.com, проявляющиеся сообщением "Аутентификация пользователя не выполнена".SENDER_ID_MISMATCH, а также важные вопросы, связанные с актуализацией и обновлением токенов.Вместе мы проанализируем эти ситуации, выясним причины их возникновения и найдем эффективные способы устранения, чтобы ваш функционал PUSH-уведомлений работал стабильно и без сбоев.
Эта ошибка является одной из наиболее распространенных и обескураживающих при попытке отправить PUSH-уведомление через официальный сервис 1С. Сообщение об ошибке, как правило, выглядит так: "Аутентификация пользователя не выполнена. URL сервиса: https:xxxxxxx@pushnotifications.1c.com/api/push/v1?wsdl". Давайте подробно разберем, почему она возникает и как с ней справиться.
Как следует из самого сообщения, основная причина этой ошибки кроется в некорректных учетных данных или неверном ключе API, которые вы используете для доступа к сервису pushnotifications.1c.com. Сервис 1С требует строгой идентификации отправителя для обеспечения безопасности и предотвращения несанкционированной рассылки уведомлений. Если предоставляемые вами логин, пароль или специальный ключ доступа отправителя не соответствуют тем, что зарегистрированы в системе 1С, запрос на отправку уведомления будет отклонен.
Кроме того, проблема может быть связана с ограничениями по IP-адресу. Если ваш сервер пытается отправить уведомление с IP-адреса, который не был предварительно внесен в список разрешенных в настройках сервиса 1С, аутентификация также не будет выполнена.
Иногда источником проблем может быть и некорректная работа или настройка "1С:Сервера Взаимодействия", если он используется в вашей инфраструктуре для маршрутизации PUSH-уведомлений мобильным клиентам.
Для успешного решения этой проблемы нам необходимо тщательно проверить и настроить все компоненты, отвечающие за идентификацию и безопасность.
Для успешной отправки уведомлений через сервис pushnotifications.1c.com требуется пройти обязательную процедуру регистрации и получения всех необходимых идентификаторов. Прежде всего, убедитесь, что вы зарегистрированы на официальном сайте сервиса 1С. После регистрации вам потребуется зарегистрировать ваше мобильное приложение в личном кабинете сервиса. В результате этой регистрации вы получите уникальный ключ доступа отправителя, который является критически важной частью для аутентификации вашего сервера при отправке уведомлений.
Этот ключ, а также логин и пароль, используемые при регистрации, должны быть корректно указаны при программном вызове метода ОтправкаДоставляемыхУведомлений.Отправить() в вашей системе 1С. Малейшая ошибка в символе или регистре может привести к отказу в аутентификации.
Настоятельно рекомендуем относиться к этому ключу доступа как к конфиденциальной информации. Его компрометация может привести к несанкционированной рассылке уведомлений от вашего имени.
Давайте посмотрим на пример общего подхода к инициализации и отправке PUSH-уведомлений, где мы явно указываем необходимые параметры:
// Прежде всего, нам понадобятся данные, полученные при регистрации в сервисе 1С.
// Замените эти значения на ваши реальные!
Перем ЛогинОтправителя;
Перем ПарольОтправителя;
Перем КлючДоступаОтправителя; // Это уникальный ключ, полученный при регистрации приложения в сервисе 1С
// Пример инициализации, если данные хранятся в константах или параметрах
// ЛогинОтправителя = Константы.ЛогинСервисаПУШ.Получить();
// ПарольОтправителя = Константы.ПарольСервисаПУШ.Получить();
// КлючДоступаОтправителя = Константы.КлючДоступаОтправителяПУШ.Получить();
// Для демонстрации используем прямые значения
ЛогинОтправителя = "ВашЛогинНаСервисе1С";
ПарольОтправителя = "ВашПарольНаСервисе1С";
КлючДоступаОтправителя = "ВашУникальныйКлючДоступаПриложения";
Попытка
// Устанавливаем параметры аутентификации для сервиса PUSH-уведомлений
ОтправкаДоставляемыхУведомлений.УстановитьПараметрыАутентификации(ЛогинОтправителя, ПарольОтправителя);
// Создаем описание PUSH-уведомления
ОписаниеДоставляемогоУведомления = ОтправкаДоставляемыхУведомлений.СоздатьОписаниеДоставляемогоУведомления();
ОписаниеДоставляемогоУведомления.Заголовок = "Важное сообщение из 1С";
ОписаниеДоставляемогоУведомления.Текст = "Это тестовое PUSH-уведомление для проверки настроек.";
ОписаниеДоставляемогоУведомления.КлючДоступаОтправителя = КлючДоступаОтправителя; // Обязательно указываем ключ отправителя!
// Добавляем список получателей (идентификаторов устройств).
// Эти идентификаторы должны быть предварительно получены от мобильных клиентов.
СписокИдентификаторовПолучателей = Новый Массив();
СписокИдентификаторовПолучателей.Добавить("ИдентификаторУстройстваМобильногоКлиента1");
СписокИдентификаторовПолучателей.Добавить("ИдентификаторУстройстваМобильногоПриложения2");
// Если требуется отправить на все известные идентификаторы, можно использовать запрос к своей базе данных.
ОписаниеДоставляемогоУведомления.ИдентификаторыПолучателей = СписокИдентификаторовПолучателей;
// Можно добавить дополнительные данные, которые будут доступны в мобильном приложении
// ОписаниеДоставляемогоУведомления.ДополнительныеДанные.Вставить("ТипСобытия", "НовыйЗаказ");
// Отправляем уведомление
ОтправкаДоставляемыхУведомлений.Отправить(ОписаниеДоставляемогоУведомления);
Сообщить("PUSH-уведомление успешно отправлено через сервис 1С.");
Исключение
// Обрабатываем возможные ошибки, включая ошибки аутентификации
Сообщить("Ошибка при отправке PUSH-уведомления: " + ОписаниеОшибки());
КонецПопытки;
Ключевым моментом здесь является строка ОписаниеДоставляемогоУведомления.КлючДоступаОтправителя = КлючДоступаОтправителя;. Это критически важный параметр, который часто становится источником ошибок, если указан неверно или отсутствует.
При регистрации отправителя в "1С:Центр уведомлений" или аналогичном личном кабинете на сервисе 1С, у вас есть возможность указать фактические IP-адреса серверов, с которых будут осуществляться запросы на отправку уведомлений. Это мера безопасности для предотвращения несанкционированной отправки PUSH-уведомлений с неизвестных источников. Если IP-адрес вашего сервера (или серверов, если их несколько, например, рабочий и тестовый) не внесен в этот разрешенный список, сервис безопасности 1С отклонит запрос, что приведет к ошибке аутентификации.
Поэтому убедитесь, что все внешние IP-адреса, с которых ваша система 1С будет отправлять уведомления, корректно зарегистрированы в личном кабинете сервиса 1С. Не забудьте учесть возможные NAT, прокси-серверы или облачные инфраструктуры, которые могут изменять исходящий IP-адрес вашего сервера.
Если в вашей архитектуре для работы с мобильными клиентами используется "1С:Сервер Взаимодействия", то проблемы с отправкой PUSH-уведомлений могут быть связаны с его некорректной настройкой или работой. "1С:Сервер Взаимодействия" может выступать в роли посредника для доставки уведомлений. В этом случае:
Firebase Cloud Messaging (FCM) является популярным выбором для многих разработчиков благодаря своей надежности, масштабируемости и интеграции с экосистемой Google. Однако и здесь не обходится без специфических проблем, наиболее частой из которых является ошибка SENDER_ID_MISMATCH, а также вопросы, связанные с управлением токенами. Для реализации этой задачи можно использовать готовое решение для отправки PUSH-уведомлений на Android через FCM.
Ошибка SENDER_ID_MISMATCH (часто сопровождается HTTP-кодом 403 Forbidden) является одним из наиболее распространенных индикаторов неправильной конфигурации FCM. Она однозначно указывает на то, что идентификатор отправителя (Sender ID), используемый для отправки PUSH-уведомления, не соответствует идентификатору отправителя, к которому изначально привязан регистрационный токен устройства. Давайте разберем этот механизм подробнее:
SENDER_ID_MISMATCH.Sender ID — это уникальный числовой идентификатор вашего Firebase-проекта. Вы можете найти его в настройках Firebase Console, перейдя в раздел Project settings > Cloud Messaging. Он совпадает с "номером проекта".
Для решения этой проблемы мы должны обеспечить строгое соответствие между проектом, от которого был получен токен устройства, и проектом, через который происходит отправка уведомлений.
Самый важный и первый шаг — это убедиться, что ProjectNumber, который вы передаете в метод 1С ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(ProjectNumber) при получении токена в мобильном приложении, точно соответствует Sender ID вашего Firebase-проекта, через который вы планируете отправлять уведомления с вашего сервера 1С.
Предположим, вы инициализируете получение токена в мобильном приложении на платформе 1С:
// Получение идентификатора подписчика уведомлений (токена устройства)
// МойProjectNumberFCM должен быть численным идентификатором вашего Firebase-проекта (Sender ID).
// Его нужно взять из Firebase Console: Project settings -> Cloud Messaging -> Project number.
Перем МойProjectNumberFCM;
МойProjectNumberFCM = "123456789012"; // ЗАМЕНИТЕ на ваш реальный числовой Sender ID!
ИдентификаторУстройства = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(МойProjectNumberFCM);
Если ЗначениеЗаполнено(ИдентификаторУстройства) Тогда
Сообщить("Успешно получен идентификатор устройства FCM: " + ИдентификаторУстройства);
// Этот ИдентификаторУстройства является токеном FCM.
// Его необходимо сохранить в вашей информационной базе 1С,
// чтобы в дальнейшем иметь возможность отправлять на него PUSH-уведомления.
// Например: ЗаписатьИдентификаторУстройстваВРегистрСведений(ИдентификаторУстройства, Пользователь);
Иначе
Сообщить("Не удалось получить идентификатор устройства FCM. Проверьте ProjectNumber.");
КонецЕсли;
Далее, при отправке уведомления с сервера (например, из вашей конфигурации 1С), вы должны использовать ключ сервера (Server Key) или JSON-ключ сервисного аккаунта, который относится к тому же Firebase-проекту, что и ProjectNumber, использованный для получения токена. Несоответствие этих идентификаторов — основная причина ошибки SENDER_ID_MISMATCH.
Критически важно учитывать, что Google постепенно прекращает поддержку устаревшего FCM API. Изначально это было запланировано на 20 июня 2024 года, но окончательная дата прекращения поддержки устаревшего API перенесена на 22 июля 2024 года. Это означает, что для успешной и надежной отправки уведомлений после этой даты необходимо мигрировать на FCM HTTP v1 API. Это изменение влечет за собой существенные изменения в механизмах аутентификации:
Если вы продолжите использовать устаревшие методы после указанной даты, вы неизбежно столкнетесь с ошибками аутентификации, которые могут проявляться аналогично SENDER_ID_MISMATCH или другими ошибками доступа, связанными с отсутствием авторизации.
Давайте рассмотрим концептуальный пример использования FCM HTTP v1 API с сервисным аккаунтом в контексте 1С. Для полноценной реализации потребуется более глубокая работа с HTTP-запросами и, возможно, специализированными библиотеками или сложными алгоритмами для работы с JWT (JSON Web Token) в 1С.
// Этот код демонстрирует концепцию взаимодействия с FCM HTTP v1 API.
// Реализация получения Bearer Token требует формирования и подписания JWT,
// что является нетривиальной задачей для чистой 1С.
// Обычно для этого используются внешние компоненты или сервисы-посредники.
// 1. Получение JWT-токена (Bearer Token) из JSON-ключа сервисного аккаунта Firebase.
// Этот шаг включает:
// - Загрузку JSON-ключа сервисного аккаунта (файл .json из Firebase Console).
// - Извлечение приватного ключа и других данных из JSON.
// - Программное создание JWT (JSON Web Token), подписанного с помощью приватного ключа.
// - Отправку HTTP-запроса на OAuth2-сервер Google (https://oauth2.googleapis.com/token)
// для обмена сформированного JWT на временный Bearer Token.
// - Полученный Bearer Token имеет ограниченный срок действия (обычно 1 час).
// Пример (псевдокод) получения Bearer Token в 1С:
// Перем СформированныйJWT; // Здесь должен быть сгенерированный и подписанный JWT
//
// Попытка
// HTTPСоединениеOAuth = Новый HTTPСоединение("oauth2.googleapis.com", , , , , , , Новый ЗащищенноеСоединениеOpenSSL());
// HTTPЗапросOAuth = Новый HTTPЗапрос("/token");
// HTTPЗапросOAuth.УстановитьТелоИзСтроки("grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + СформированныйJWT);
// HTTPЗапросOAuth.УстановитьЗаголовок("Content-Type", "application/x-www-form-urlencoded");
//
// ОтветOAuth = HTTPСоединениеOAuth.Отправить(HTTPЗапросOAuth);
//
// Если ОтветOAuth.КодСостояния = 200 Тогда
// ЧтениеJSON = Новый ЧтениеJSON();
// ЧтениеJSON.УстановитьСтроку(ОтветOAuth.ПолучитьТелоКакСтроку());
// Результат = ПрочитатьJSON(ЧтениеJSON);
// ТокенДоступа = Результат.access_token; // Вот наш Bearer Token
// Сообщить("Bearer Token успешно получен.");
// Иначе
// Сообщить("Ошибка получения Bearer Token: " + ОтветOAuth.ПолучитьТелоКакСтроку());
// КонецЕсли;
// Исключение
// Сообщить("Исключение при получении Bearer Token: " + ОписаниеОшибки());
// КонецПопытки;
// 2. Формирование запроса на отправку PUSH-уведомления с использованием FCM HTTP v1 API
// Для этого нам понадобится строковый Project ID из Firebase Console.
// (Firebase Console -> Project settings -> General -> Project ID).
Перем ВашProjectID;
ВашProjectID = "my-firebase-project-id-12345"; // ЗАМЕНИТЕ на ваш строковый Project ID!
Перем ТокенДоступа; // Предполагаем, что здесь у нас уже есть полученный Bearer Token
Перем ЗаголовокУведомления;
Перем ТекстСообщенияУведомления;
Перем ТокенУстройстваПолучателя; // Это ИдентификаторУстройства, полученный от мобильного клиента 1С
ЗаголовокУведомления = "Новое событие в системе";
ТекстСообщенияУведомления = "Для вас поступил новый документ.";
ТокенУстройстваПолучателя = "fcm_token_of_the_device_12345"; // Пример токена устройства
// Создаем структуру для тела запроса в формате JSON
ТелоЗапросаFCM = Новый Структура();
ТелоЗапросаFCM.Вставить("message", Новый Структура());
ТелоЗапросаFCM.message.Вставить("token", ТокенУстройстваПолучателя);
ТелоЗапросаFCM.message.Вставить("notification", Новый Структура());
ТелоЗапросаFCM.message.notification.Вставить("title", ЗаголовокУведомления);
ТелоЗапросаFCM.message.notification.Вставить("body", ТекстСообщенияУведомления);
// Для проверки токена без фактической отправки уведомления можно добавить "validateOnly": true
// ТелоЗапросаFCM.Вставить("validateOnly", Истина);
Перем СтрокаJSONЗапроса;
СтрокаJSONЗапроса = ЗаписатьJSON(ТелоЗапросаFCM);
// 3. Отправка запроса на FCM HTTP v1 API
Попытка
HTTPСоединениеFCM = Новый HTTPСоединение("fcm.googleapis.com", , , , , , , Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапросFCM = Новый HTTPЗапрос("/v1/projects/" + ВашProjectID + "/messages:send");
// Устанавливаем заголовки
HTTPЗапросFCM.УстановитьЗаголовок("Authorization", "Bearer " + ТокенДоступа); // Используем полученный Bearer Token
HTTPЗапросFCM.УстановитьЗаголовок("Content-Type", "application/json");
// Устанавливаем тело запроса
HTTPЗапросFCM.УстановитьТелоИзСтроки(СтрокаJSONЗапроса);
ОтветFCM = HTTPСоединениеFCM.Отправить(HTTPЗапросFCM);
Если ОтветFCM.КодСостояния = 200 Тогда
Сообщить("PUSH-уведомление через FCM HTTP v1 API успешно отправлено.");
// Можно проанализировать ответ для получения Message ID и другой информации
// Сообщить("Ответ сервера: " + ОтветFCM.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Ошибка отправки PUSH-уведомления через FCM: " + ОтветFCM.КодСостояния);
Сообщить("Подробности ошибки: " + ОтветFCM.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Исключение при отправке PUSH-уведомления через FCM: " + ОписаниеОшибки());
КонецПопытки;
Здесь ВашProjectID — это строковый идентификатор вашего Firebase-проекта, а не числовой Sender ID. Для этого вам потребуется создать сервисный аккаунт в Firebase Console, сгенерировать JSON-ключ (содержит приватный ключ), и использовать его для программной аутентификации по протоколу OAuth2 для получения временного Bearer Token. Этот Bearer Token затем используется в заголовке Authorization при каждом запросе на отправку уведомления.
Вопрос обновления токенов доступа для FCM часто вызывает недопонимание, поскольку существует два основных типа токенов, с которыми мы работаем:
Токены устройства генерируются FCM SDK автоматически при установке мобильного приложения. Они могут изменяться со временем по нескольким причинам:
Мобильное приложение получает новый токен через специальный колбэк onNewToken(), предусмотренный в FCM SDK. Платформа 1С, при работе с мобильными клиентами и приложениями, как правило, абстрагирует этот процесс, но внутренне он опирается на стандартные механизмы FCM SDK. Метод 1С ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(ProjectNumber) предназначен для получения актуального на данный момент токена устройства.
Ваша задача как разработчика — регулярно сохранять этот токен в вашей информационной базе 1С и обновлять его, если он изменился. Рекомендуется при каждой успешной регистрации приложения или при получении нового токена отправлять его на сервер 1С для актуализации данных. Это гарантирует, что вы всегда отправляете уведомления на самый свежий и действительный токен.
Важные замечания по актуальности токенов устройства:
Токены доступа для серверной отправки FCM уведомлений (Bearer Tokens, получаемые через OAuth2) имеют ограниченный срок действия, обычно около 1 часа. Для их обновления не требуется никакого взаимодействия с пользователем или доступом к браузеру. Этот процесс полностью автоматизирован и выполняется на стороне вашего сервера (системы 1С) с использованием JSON-ключа сервисного аккаунта и протокола OAuth2.
Механизм обновления заключается в следующем:
https://oauth2.googleapis.com/token).Bearer Token, который может быть использован для аутентификации при отправке уведомлений через FCM API.Bearer Token подходит к концу (или истек).Именно этот серверный, программный процесс подразумевается под "обновлением токена без разрешения на доступ в браузере", поскольку он не требует пользовательского взаимодействия и полностью автоматизирован.
Для реализации этого в 1С вам потребуется написать код, который способен:
Bearer Token.Bearer Token и отслеживать его срок действия, чтобы своевременно запрашивать новый токен.Это более сложная часть интеграции с FCM HTTP v1 API, которая обеспечивает высокий уровень безопасности, но требует тщательной проработки программного кода.
Помимо решения основных проблем, есть несколько общих рекомендаций, которые помогут вам улучшить стабильность и эффективность работы с PUSH-уведомлениями:
Работа с PUSH-уведомлениями в 1С, будь то через собственный сервис 1С или Firebase Cloud Messaging, требует глубокого понимания как платформенных механизмов, так и особенностей внешних сервисов. Следуя этим рекомендациям и тщательно проверяя все параметры на каждом этапе, вы сможете эффективно решить возникающие проблемы, обеспечить надежную доставку уведомлений и значительно улучшить взаимодействие с пользователями ваших мобильных решений на платформе 1С.