Push-уведомления

Материал из PayControl Wiki
Версия от 15:32, 31 мая 2021; D.bizyukov (обсуждение | вклад) (Настройка отправки через PayControl Interaction Server (Internal))
Перейти к: навигация, поиск

Push-сообщения могут отправляться через PCIS Internal, либо через PayControl Inform.

Содержание

Аутентификация

Для отправки push-уведомлений требуется аутентификация.

Перечисление аутентификационных данных

Android

  • Google API Key

iOS

Для аутентификации используется либо ключ (p8), либо сертификат (p12).

p8

Аутентификация посредством ключевого файла. Ключ имеет неограниченный срок действия. Требуются следующие данные:

  • ключевой файл в формате p8;
  • APNS App ID,
  • APNS Key ID,
  • APNS Team ID.

p12

Аутентификация посредством сертификата, имеющего ограниченный срок действия. Требуются следующие данные:

  • APNS App ID,
  • сертификат в формате контейнера p12,
  • пароль для доступа к закрытой части ключа в контейнере.

Установка аутентификационных данных

Перед внесением необходимо заменить %SYSTEMID% на идентификатор системы.

Сервер PayControl 3.6

Аутентификационные данные для приложения PayControl:

INSERT INTO pc_push_credentials (
systemid,
google_api_key,
use_ios_fcm,
apns_app_id,
apns_key_file,
apns_key_id,
apns_team_id)
VALUES  (
'%SYSTEMID%',
'AAAAZJTm6y0:APA91bF1OQYv9T2opZtIMJPZknA7tGLifzvTVB3PFSlQejBzPzyeYg4JFn-nud5mE_pZe920I2zR-8Lv-yabeaJ8PdduS96G3ESj_pfxAJAhaT1JistaXMchspMkPLL0e8tLxCmBzhda',
'0',
'ru.safe-tech.PayControl.v3',
'/opt/wildfly/safetech-apns-JVBQX52N5Z.p8',
'JVBQX52N5Z',
'48HZH4RWJD');

Сервер PayControl 3.7 и выше

Структура записи

INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
is_default,
os,
systemid,
templates,
use_ios_fcm)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.payconfirm.app',
'{"google_api_key":"AAAAPvs4KBA:APA91bEEv_nwmSQZPDBGh0gn2PwqRQusHJNdlekZ-eKcj8IYrm18EcXwJ1wt6nUEOavGcVjPuXJmfhV_9oS6VNbtKjyQSqBb3HHMnJZp6FauWz6hWpVcqsbenqkgamFgCAl1Exrd3JV_"}',
0,
'Android',
'%SYSTEMID%',
'{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}',
0);
Поле credentials для iOS
{
"apns_key_file": "/opt/wildfly/safetech-apns-JVBQX52N5Z.p8",
"apns_key_id": "JVBQX52N5Z",
"apns_team_id": "48HZH4RWJD",
"apnsP12File" : "/opt/wildfly/certificate.p12",
"apnsP12Pass" : "************",
"use_dev_gate": false
}
Поле templates iOS
{
  "messages": [
    {
      "aps": {
        "alert": "%PUSH_TEXT%",
        "sound": "%PUSH_SOUND%",
        "badge": "%PUSH_IOS_BADGE%"
      },
      "type": "%PUSH_TYPE%",
      "userid": "%USER_ID%",

      "pc_notification_type" : "alert/background",
      "pc_notification_priority" : 10,
      "pc_notification_timeout": 600,
      "pc_collapse_id": "%USER_ID%"
    }
  ]
}

Параметры с версии 3.7.398

  • pc_notification_type
  • pc_notification_priority
  • pc_notification_timeout
  • pc_collapse_id (с 5.0.110?)

задают соответственно

  • apns-push-type. Возможные значения alert/background/voip/complication/fileprovider/mdm. По-умолчанию alert.
  • apns-priority. Возможные значения 5 или 10. По-умолчанию 10.
  • apns-expiration. Задаётся в секундах. Максимально возможное значение в секундах 2147483647. По-умолчанию не передаётся.
  • apns-collapse-id. Значение, по которому будут группироваться и очищаться пуши (с 5.0.110?).

pc_notification_timeout влияет на установку значение apns-expiration, вычисляющегося как (текущее значение UnixTime)+APNS_EXPIRATION.

Подробнее https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns

Также с версии 3.7.398 в таблице pc_sys_property добавлен параметр APNS_EXPIRATION значение из которого будет браться, если в шаблоне не установлено значение pc_notification_timeout.

Поле credentials для Android
{"google_api_key":"AAAAZJTm6y0:APA91bF1OQYv9T2opZtIMJPZknA7tGLifzvTVB3PFSlQejBzPzyeYg4JFn-nud5mE_pZe920I2zR-8Lv-yabeaJ8PdduS96G3ESj_pfxAJAhaT1JistaXMchspMkPLL0e8tLxCmBzhda"}

PayControl 3

Android
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
is_default,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'ru.safe-tech.PayControl.v3',
'{"google_api_key":"AAAAZJTm6y0:APA91bF1OQYv9T2opZtIMJPZknA7tGLifzvTVB3PFSlQejBzPzyeYg4JFn-nud5mE_pZe920I2zR-8Lv-yabeaJ8PdduS96G3ESj_pfxAJAhaT1JistaXMchspMkPLL0e8tLxCmBzhda"}',
1,
'Android',
'%SYSTEMID%');
iOS
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
is_default,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'ru.safe-tech.PayControl.v3',
'{"apns_key_file":"/opt/wildfly/safetech-apns-JVBQX52N5Z.p8","apns_key_id":"JVBQX52N5Z","apns_team_id":"48HZH4RWJD"}',
1,
'iOS',
'%SYSTEMID%');
iOS sandbox
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'ru.safe-tech.PayControl.v3.dev',
'{"apns_key_file":"/opt/wildfly/safetech-apns-JVBQX52N5Z.p8","apns_key_id":"JVBQX52N5Z","apns_team_id":"48HZH4RWJD","use_dev_gate": true}',
'iOS',
'%SYSTEMID%');

PayControl 5

Android
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.paycontrol.app',
'{"google_api_key":"AAAAoZ7vyz4:APA91bFqLfNegQCs_GfHGFeOmS68PHWWSzWpeZaYKfnLul9iHufIQJiNIAjgAykeWrTxiDDs9qQzullXww3o5XR0VS9tlBEpuhTMlz4CyHdmN2EhntJBBUlSQa-8--Rw_UzDbKBCGCXk"}',
'Android',
'%SYSTEMID%');
iOS
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.paycontrol.app',
'{"apns_key_file":"/opt/wildfly/safetech-apns-JVBQX52N5Z.p8","apns_key_id":"JVBQX52N5Z","apns_team_id":"48HZH4RWJD"}',
'iOS',
'%SYSTEMID%');
iOS sandbox
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.paycontrol.app.dev',
'{"apns_key_file":"/opt/wildfly/safetech-apns-JVBQX52N5Z.p8","apns_key_id":"JVBQX52N5Z","apns_team_id":"48HZH4RWJD","use_dev_gate": true}',
'iOS',
'%SYSTEMID%');

PayConfirm 5

Android
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.payconfirm.app',
'{"google_api_key":"AAAA4H70m7M:APA91bFsaPiXXiIuRyj4h-xGZpyd0-I3B9F1udIIergxaK8uL9vPPvUQXOvPfau2w8E-xur_6TlTzmhb2JsO13hBCxVDrNybD6Rj8k4hZKXfs7tC5fnJuWmCIB3-O_4dLo0QHlhfSbGn"}',
'Android',
'%SYSTEMID%');
iOS
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.payconfirm.app',
'{"apns_key_file":"/opt/pc/AuthKey_QCC684AGC4.p8","apns_key_id":"QCC684AGC4","apns_team_id":"B98K5P3YHV"}',
'iOS',
'%SYSTEMID%');
iOS Sandbox
INSERT INTO pc_split_pusher_credentials (
id,
appid,
credentials,
os,
systemid)
VALUES (
nextval('pc_split_pusher_creds_seq'),
'org.payconfirm.app.dev',
'{"apns_key_file":"/opt/pc/AuthKey_QCC684AGC4.p8","apns_key_id":"QCC684AGC4","apns_team_id":"B98K5P3YHV","use_dev_gate": true}',
'iOS',
'%SYSTEMID%');

Настройка шаблонов PayControl Interaction Server (Internal)(при необходимости)

Настройки производятся в БД PCIS. Шаблон push-сообщений определяется в формате JSON. Существует два варианта настройки push-сообщений:

Переменные

Доступны следующие переменные для использования в шаблоне:

Переменная Значение
%PUSH_TEXT% PUSH_TEXT
%PUSH_TITLE% PUSH_TITLE
%PUSH_SOUND% PUSH_IOS_SOUND либо PUSH_ANDROID_SOUND, в зависимости от устройства, на которое отправляется пуш
%PUSH_ICON% PUSH_ICON
%PUSH_IOS_BADGE% PUSH_IOS_BADGE
%PUSH_TYPE% "PayControl"
%USER_ID% userId
%SYSTEM_ID% systemId
%TRANSACTION_ID% transactionId
%DEVICE_TOKEN% deviceId

Шаблоны для разных версий PCIS

До версии PCIS 3.5 включительно

При создании транзакции отправляется одно push сообщение.

Версия PCIS 3.5.5

При отправке оповещения о созданной транзакции на android отправляются два push-сообщения - Notification и Silent. Такая модификация потребовалась в связи с тем, что некоторые устройства не будят приложение для отрисовки уведомления. Для этого в БД PCIS Internal добавлено поле android_second_push_template.

Таким образом, значения полей выглядят следующим образом:

Поле Значение
android_push_template
{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}}
android_second_push_template
{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}

С версии PCIS 3.6

Шаблон push-сообщений определяется как массив шаблонов сообщений в формате JSON, которые отправляются последовательно (количество элементов в массиве - от 1):

{"messages":[массив объектов шаблонов push-сообщений, который будет отправлен PayControl]}

Пример:

  • android_push_template
    {"messages":[{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}
    
  • ios_push_template
    {"messages":[{"aps":{"alert":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"type":"%PUSH_TYPE%","userid":"%USER_ID%"}]}
    

Для мобильных приложений версии 3.7 и выше

На Android стало достаточно отправки одного data-пуша. При этом можно указать следующие типы (type) (регистр не имеет значения):

  • paycontrol и payconfirm - звук и вибрация;
  • PayControl-v2 - использовать не стоит, т.к. в этом случае звука или вибрации не будет. Применяется в случае, если отправляется 2 пуша - notification и data.
{"messages":[{"to":"%DEVICE_TOKEN%","data": {"type": "paycontrol", "userid": "%USER_ID%"}}]}

Тем не менее, шаблон следующий:

{
   "messages":[
      {
         "to":"%DEVICE_TOKEN%",
         "notification":{
            "tag":"%USER_ID%",
            "title":"PayControl",
            "body":"%PUSH_TEXT%",
            "icon":"paycontrol_push",
            "sound":"default"
         },
         "data":{
            "type":"PayControl_v2"
         }
      },
      {
         "to":"%DEVICE_TOKEN%",
         "data":{
            "type":"PayControl_v2",
            "userid":"%USER_ID%"
         }
      }
   ]
}

Установка новых шаблонов в БД

Обновление шаблонов

update pc_push_credentials set android_push_template='{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}' where systemid='bef89e01-f248-4841-bd62-8b08056e6fea';
update pc_push_credentials set ios_push_template='{"messages":[{"aps":{"alert":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"type":"%PUSH_TYPE%","userid":"%USER_ID%"}]}' where systemid='bef89e01-f248-4841-bd62-8b08056e6fea';

Удаление шаблона второго push-сообщения:

update pc_push_credentials set android_second_push_template = NULL;

Одним запросом:

update pc_push_credentials set android_push_template='{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}', ios_push_template='{"messages":[{"aps":{"alert":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"type":"%PUSH_TYPE%","userid":"%USER_ID%"}]}', android_second_push_template = NULL;

Добавление новой записи

Указать верные:

  • google_api_key
  • apns_key_file
  • apns_key_id
  • apns_team_id

Уточнить:

  • apns_app_id
INSERT INTO pc_push_credentials (systemid, android_push_template, google_api_key, ios_push_template, use_ios_fcm, apns_app_id, apns_key_file, apns_key_id, apns_team_id)  VALUES  ('e33affa9-1ff8-4d2a-aa42-856fb59309e0', '{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"to":"%DEVICE_TOKEN%","data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}', 'AAAAZJTm6y0:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', '{"messages":[{"aps":{"alert":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"type":"%PUSH_TYPE%","userid":"%USER_ID%"}]}', '0','ru.safe-tech.PayControl.v3','/opt/wildfly/safetech-apns-JVBQX52N5Z.p8','JVXXXXXXXXX','48XXXXXXX');

Использование FCM для iOS

В таблице pc_push_credentials можно выставить значение use_ios_fcm в значение 1. В этом случае для отправки push-сообщения в iOS будет использоваться Google Firebase.
При использовании use_ios_fcm обязательно указать шаблон push-сообщения для iOS, иначе push-сообщение пойдет в формате APNS, что вызовет ошибку

Пример шаблона push-сообщения для iOS через FCM:

{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"title":"Название Банка","body":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"data":{"type" : "%PUSH_TYPE%","userid":"%USER_ID%"}}]}

Пример запроса к БД PCIS для переключения на использование FCM для iOS:

update pc_push_credentials set use_ios_fcm=1, ios_push_template='{"messages":[{"to":"%DEVICE_TOKEN%","notification":{"title":"Название банка","body":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"data":{"type":"%PUSH_TYPE%","userid":"%USER_ID%"}}]}';

Настройка для работы через PayControl Inform

В БД PCS в таблице pc_system значение pc_is_internal_url должно иметь вид:

  [pc-inform]{PayControl Infrom URL}

Например:

  [pc-inform]http://pcinform.local/api/notification/

Для настройки шаблонов push-сообщений, в БД PCS, в таблице pc_sys_properties должны быть записи (формат шаблона - PC Inform):

  setting_name = ANDROID_PUSH_PAYLOAD_TEMPLATE
  setting_value = {"messages":[{"notification":{"tag":"%USER_ID%","title":"PayControl","body":"%PUSH_TEXT%","icon":"paycontrol_push","sound":"default"},"data":{"type":"PayControl_v2"}},{"data": {"type": "PayControl_v2", "userid": "%USER_ID%"}}]}
  setting_name = IOS_PUSH_PAYLOAD_TEMPLATE
  setting_value = {"messages":[{"aps":{"alert":"%PUSH_TEXT%","sound":"%PUSH_SOUND%","badge":%PUSH_IOS_BADGE%},"type":"%PUSH_TYPE%","userid":"%USER_ID%"}]}

Адреса серверов для отправки Push

Apple Push Notification Service

Development server: api.development.push.apple.com:443 (используется для отправки уведомлений в debug-сборки (залитые из XCode))

Production server: api.push.apple.com:443 (Используется для отправки в приложения из AppStore и TestFlight)

!!!В PayControl в настоящее время не используется!!! Вместо порта 443 можно использовать порт 2197 для связи с APNS. К примеру этот порт можно использовать, если система фильтрации на межсетевом экране не позволяет разрешить трафик по 443 порту исключительно с серверами APNS.

A.bursakov (обсуждение) 16:47, 7 августа 2018 (MSK)

Источник - https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

Google Firebase

Legacy

Для отправки push-сообщений, запросы должны отправляться по адресу https://fcm.googleapis.com:443/fcm/send

A.bursakov (обсуждение) 16:47, 7 августа 2018 (MSK)

Источник - https://firebase.google.com/docs/cloud-messaging/http-server-ref


Проблемы при отправке пушей

Проблемы при отправке пуша могут быть следующие:

  • Создаётся транзакция без указания notification_type "PUSH"
  • У PCS нет связи с PCP (ошибка свидетельствующая об этом должна быть в логе PCS, в момент попытки отправки пуша).
  • У PCP не настроены аутентификационные данные для отправки пушей
  • У PCP нет доступа к серверам Firebase/APNS
  • На телефоне не разрешён приём пушей для приложения