Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Данный модуль позволяет отправлять Push уведомления клиентам и администраторам через Web Push платформу.

Table of Contents

Возможности модуля

Модуль предназначен для отправки Push уведомлений в мобильное приложение и браузерах. Отправка производится с помощью firebase cloud messaging. Клиент реализован на ServiceWorker, поэтому будет работать только на домене с валидным SSL (HTTPS) сертификатом
Для отправки в Chrome нужен ключ Google API Platform Key.( Брать в Google Cloud Console ).
Ключ нужно записать в libexec/config.pl $conf{GOOGLE_API_KEY}.
Пуши в Firefox работают без ключа.

После записи ключа создать файл манифеста cgi-bin/manifest.json.

Code Blocklanguage

. Пуши в Firefox работают без ключа.

Установка модуля

Чтобы Push работали нужно прописать в config.pl


Code Block
languageperl
$conf{PUSH_ENABLED}=1;


Чтобы модуль работал корректно, нужно включить REST API

Code Block
languageperl
$conf{API_ENABLE} = 1;


Также нужнно установить Perl модуль Crypt::JWT

Code Block
languageperl
cpan
install Crypt::JWT

Создание проекта firebase

Переходим по ссылке https://console.firebase.google.com/


Image Added
После создания переходим в настройки проекта

Image Added

Image Added

Image Added

Image Added

Image Added

Image Added

После этого скачивается файл, название которого необходимо будет скопировать и внести в config.pl

Code Block
languageperl
$conf{FIREBASE_KEY}="Название файла"; # пример abillslite-fed23-fad8f0401a98

Также нужно вынести из названия файла первое значение перед дефисами, например abillslite-fed23-fad8f0401a98 тогда значения будет abillslite-fed23

Code Block
languageperl
$conf{GOOGLE_PROJECT_ID}="ID проекта"; # пример abillslite-fed23

После внесения переменных, скачанный json файл нужно загрузить на сервер в каталог /usr/abills/Certs/google/*Название файла*.json

 Настройка WebPush

Для настройки Web Push необходимо перейти в настройки Cloud Messaging и создать пару ключей для WebPush

Image Added

После создание копируем публичный ключ и прописываем в config.pl

Code Block
languageperl
$conf{FIREBASE_VAPID_KEY}="Ваш public key";

Image Added

Создаем Web приложение

Image Added

Копируем firebaseConfig и вносим в конфигурации на биллинге

Image Added

В config.pl

Также обязательно настройте apiKey со стороны гугла - https://console.cloud.google.com/ только под ip вашего сервера, где находится веб-интерфейс.

Code Block
languageperl
$conf{FIREBASE_CONFIG} = {
  apiKey            => "Sample",
  authDomain        => "Sample",
  projectId         => "Sample",
  storageBucket     => "Sample",
  messagingSenderId => "Sample",
  appId             => "Sample",
  measurementId     => "Sample"
};

Копируем файл

Code Block
languagebash
cd /usr/abills/cgi-bin/
cp ../misc/gcmfirebase/manifest.json.default manifest.json
Заменить %GCM_APPLICATION_NUMBER% на номер своего проекта в Google Cloud Console.
firebase-config.js firebase-config.js
Вставляем значения по настройкам из config.pl в созданный firebase-config.js
Code Block
languagebash
vim manifest.json

Создать таблицы, в которых хранятся клиенты и сообщения.

Code Block
languagebash
mysql -D abills < db/Push.sql

После этого можно включить скрипты Push переменной конфигурации $conf{PUSH_ENABLED}.

Администраторы подписываются на Push уведомления на странице «Профиль».

Image Removed

Пользователям предложит подписаться сразу при входе в кабинет.

Image Removed

js
var firebaseConfig = {
  apiKey: "Sample",
  authDomain: "Sample",
  projectId: "Sample",
  storageBucket: "Sample",
  messagingSenderId: "Sample",
  appId: "Sample",
  measurementId: "Sample"
};

Также для отображения кнопки Push в кабинете пользователя нужно включить опцию

Code Block
languageperl
$conf{PUSH_USER_PORTAL}=1;

Настройка Web Push готова!


Пример работы

Пример получения Push в браузере

Image Added

Пример сообщения между админами с помощью Push

Чтобы отправить сообщение админам, нужно кликнуть по ссылке "Online"

Image Added

Image Added


Автоматическое очищение невалидных токенов

В системе существует плагин push_clean он автоматически очищает FCM токены

Запуска плагина

Code Block
/usr/abills/libexec/billd push_clean DEBUG=3 DELETE_TOKENS=1

Есть два уровня отладки

Вывод при DEBUG=2

Code Block
Debug mode 3

REPORT OF FCM TOKENS STATUS

VALID TOKENS COUNT: 1
INVALID TOKENS COUNT: 4
GT: 0.84588

Вывод при DEBUG=3

Запуск без DELETE_TOKENS=1

Code Block
Debug mode 3

REPORT OF FCM TOKENS STATUS
INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz        is invalid with FCM status InvalidRegistration
INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz        is invalid with FCM status InvalidRegistration
INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz1 is invalid with FCM status InvalidRegistration
VALID TOKEN cGmQtsBg7UOshhpxpHlXS3:APA91bGZC3lgUnFVAMpV2HlpM2oekD6pQA9-Kw3J80upUhFE-7CrPcP4DxLgK7BgX10SnvXZIbQVXOw5M7vyJP6-0_U7EtPySsa8Z8--xLclW55WcM-O-yFcD8F0dv7Bi0Vcd6SYPLqk
INVALID TOKEN d2kI0mhPaEWoirhOSO1u3h:APA91bGRm27JCaKLk6KKbS6iFkAujpgIYQauwR7guuD4FXNdpZRXUJrxeLvGRELl9jhHOnXP0LNxxS5irbzizz-dcsWeUcNbSCwxvaBhIA7R_-YYla0gU-gdrqlojpQxZh8aU75HteW1        is invalid with FCM status InvalidRegistration
INVALID TOKEN ehue-zm9T4unGl_6GkeU6_:APA91bFhuAyK7GKTSLGfu5nU0qd50VzqiEUHw8NVZUiimRu5or5nPUMxrt9Xg4xPZbA3Va4OavkZo2jYJq8Zq86v-0bFP-MudMF5O2-d6HlWKx71m1aSwadgg6B4svED5-Z8QsxuKRhh is invalid with FCM status NotRegistered

VALID TOKENS COUNT: 1
INVALID TOKENS COUNT: 5
GT: 0.76055

Запуск с DELETE_TOKENS=1

Code Block
Debug mode 3

REPORT OF FCM TOKENS STATUS
TOKEN DELETED. INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz         is invalid with FCM status InvalidRegistration
TOKEN DELETED. INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz         is invalid with FCM status InvalidRegistration
TOKEN DELETED. INVALID TOKEN f39mvSvWRfaEGpqk29_H5Y:APA91bGpaVvnT_Pkx0WWSevywj9tAFIR2IKfJDbJCj_6YQvGCDKMeXtyzMPBIeB02sEhKbXscGpkLIm0Op4uZu7FYi7TPASjXqxvDYHg5Nxu0LaU2FsqlNvCfyOJdIS9liJP59_0qZyz1 is invalid with FCM status InvalidRegistration
VALID TOKEN cGmQtsBg7UOshhpxpHlXS3:APA91bGZC3lgUnFVAMpV2HlpM2oekD6pQA9-Kw3J80upUhFE-7CrPcP4DxLgK7BgX10SnvXZIbQVXOw5M7vyJP6-0_U7EtPySsa8Z8--xLclW55WcM-O-yFcD8F0dv7Bi0Vcd6SYPLqk
TOKEN DELETED. INVALID TOKEN d2kI0mhPaEWoirhOSO1u3h:APA91bGRm27JCaKLk6KKbS6iFkAujpgIYQauwR7guuD4FXNdpZRXUJrxeLvGRELl9jhHOnXP0LNxxS5irbzizz-dcsWeUcNbSCwxvaBhIA7R_-YYla0gU-gdrqlojpQxZh8aU75HteW1         is invalid with FCM status InvalidRegistration
TOKEN DELETED. INVALID TOKEN ehue-zm9T4unGl_6GkeU6_:APA91bFhuAyK7GKTSLGfu5nU0qd50VzqiEUHw8NVZUiimRu5or5nPUMxrt9Xg4xPZbA3Va4OavkZo2jYJq8Zq86v-0bFP-MudMF5O2-d6HlWKx71m1aSwadgg6B4svED5-Z8QsxuKRhh is invalid with FCM status NotRegistered

VALID TOKENS COUNT: 1
INVALID TOKENS COUNT: 5
GT: 0.71221


Для разработчиков

Пример использования:

Code Block
languagebash
 # Подключаем модуль
  use Abills::Sender::Core;
  my $Sender = Abills::Sender::Core->new($db, $admin, \%conf, {
    SENDER_TYPE => 'Push'
  });

  # Отправляем сообщение
  my $request_sent = $Sender->send_message({
      UID     => 2,
      TITLE   => 'ABillS Push',
      MESSAGE => 'Hello, world sended via Push message'
    });
    
 # $request_sent == 1, если запрос к сервису Push завершился успешно. (но это не гарантирует доставку)


Детали реализации

Сама схема работы WebPush хорошо расписана в документации для разработчиков Google.

В данном случае есть ServiceWorker в браузере, который отвечает за подписку и уведомление сервера о своей подписке.

Сервер, получив данные о подписке записывает контакты в таблицу push_contacts (модуль Contacts) и отдаёт клиенту contact_id, который сохраняется внутри indexedDB в браузере.

Когда нужно отправить уведомление, модуль Push получает контакт из таблицы и отправляет запрос на Push-уведомление сервису Push. Если запрос завершился удачно, сообщение сохраняется в таблицу push_messages с некоторым TTL (24 часа).

Когда клиент получает Push-уведомление от Push-сервиса, он используя сохранённый contact_id, получает с сервера ABillS сообщение для этого contact_id. После отправки сообщения клиенту, оно удаляется из таблицы.

Дневной периодик функцией msgs_clear_push_messages, удаляет сообщения, которые так и не были доставлены.
Для модуля Notepad есть billd плагин, для рассылки напоминаний через Push.

Отчет по push логам

Image Added


Возможные ошибки

В случае возникновения ошибки - Can't locate Crypt/JWT.pm in @INC (you may need to install the Crypt::JWT module) - во время отправки сообщения после настройки Push уведомлений добавте модульJWT с помощью следующей команды

Code Block
languageperl
cpan add Crypt::JWT