1c8 push уведомление на Apple устройства (APN) по сертификату .p8, протокол http2

02.09.22

Разработка - Мобильная разработка

Отправка из 1С8 push уведомлений на APN (apple устройства) используя .p8 сертификат от Apple по протоколу http2

Исходные данные:
1. имеется мобильное приложение на swift и приложение опубликовано в appStore
2. имеется сертификат .p8 для push уведомлений

Задача: отправить в мобильное приложение Push уведомление средствами 1С8 по протоколу http2
Примечание: используется средства Windows. Для работы под Linux потребуется правка

Подзадача 1: Проверить работоспособность сертификата, мобильного приложения, настроек личного кабинета НЕ средствами 1С8.

Для тестирования можно воспользоваться имеющимися онлайн услугами, но мне в этом не повезло. Уведомления по сертификату .p8 не проходили. В конечном итоге проверку выполнил средствами командной строки MacOS

    TEAM_ID=922L57LJJB
    TOKEN_KEY_FILE_NAME=/Users/dima/Desktop/p8/AuthKey_7W9KQGUTC7.p8
    AUTH_KEY_ID=7W9KQGUTC7
    TOPIC=ru.iReport24
    DEVICE_TOKEN=eac391331d4d2638cfeca264c3a47c4a5d01849fbf449639f8982f001a4d57bb
    APNS_HOST_NAME=api.push.apple.com

 
Здесь в переменных задаются параметры мобильной программы из личного кабинета Apple Developer. Указывается путь где храниться сертификат. Также указывается токен мобильного устройства.
Примечание 1: токен мобильного устройства меняется при переустановке программы. При обновлении developer версии программы на Production, токен так же обновляется

Примечание 2: в моём примере указан путь "api.push.apple.com" для версии production. Если вы работаете с developer поменяйте на api.sandbox.push.apple.com

 

    JWT_ISSUE_TIME=$(date +%s)
    JWT_HEADER=$(printf '{ "alg": "ES256", "kid": "%s" }' "${AUTH_KEY_ID}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
    JWT_CLAIMS=$(printf '{ "iss": "%s", "iat": %d }' "${TEAM_ID}" "${JWT_ISSUE_TIME}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
    JWT_HEADER_CLAIMS="${JWT_HEADER}.${JWT_CLAIMS}"
    JWT_SIGNED_HEADER_CLAIMS=$(printf "${JWT_HEADER_CLAIMS}" | openssl dgst -binary -sha256 -sign "${TOKEN_KEY_FILE_NAME}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
    AUTHENTICATION_TOKEN="${JWT_HEADER}.${JWT_CLAIMS}.${JWT_SIGNED_HEADER_CLAIMS}"


Здесь вычисляется Токен для авторизации подключения к сайту. Просто копируете, вставляете текст в командную строку и выполняете. В переменной AUTHENTICATION_TOKEN будет необходимый токен.
Примечание 1: Для расчета токена используется время компьютера. При выполнении команды часы на компьютере должны быть синхронизированы.

Примечание 2: Срок жизни токена 60 минут. Затем требуется заново выполнить расчет.
 

   curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: alert" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps" : {"alert" : "тестовое сообщение", "badge" : 9, "sound" : "bingbong.aiff" }}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN} 

Отправка Push уведомления '{"aps" : {"alert" : "тестовое сообщение", "badge" : 9, "sound" : "bingbong.aiff" }}'
alert - текст сообщения
badge - цифра для передачи. Обычно используется для вывода кол-ва на иконке
sound - звук при получения уведомления

Подзадача 2: Реализация в 1С8 на Windows

1. Для реализации потребуется поставить OpenSSL и указать в окружении Windows путь к файлу openssl.exe
2. У меня в Windows 10 встроенная команда curl версии 7.83.1 не поддерживает протокол http2. Поэтому скачал с интернета пакет curl версии 7.85.0 и разместил его в папку D:\Curl\bin

 

&НаКлиенте
Процедура Команда1(Команда)
    DEVICE_TOKEN="eac391331d4d2638cfeca264c3a47c4a5d01849fbf449639f8982f001a4d57bb"; 
    Сообщение = "тестовое сообщение";
    Цифра = 9;   

    Сообщение = убратьОпасныеСимволы(Сообщение);               // с этим можно поспорить, но добавил для вредности
    текстСообщения = получитьТекстСообщения(Сообщение, Цифра); // Преобразование текста сообщения в JSON строку
    послатьПушНаСервере(Цифра, текстСообщения, DEVICE_TOKEN);  // отправка уведомления
КонецПроцедуры

&НаСервере
функция убратьОпасныеСимволы(Сообщение)
     // защитим текст
    Сообщение = СтрЗаменить(сообщение, """", "");
    Сообщение = СтрЗаменить(сообщение, "'", " ");
    Сообщение = СтрЗаменить(сообщение, Символы.ПС, " ");
    Сообщение = СтрЗаменить(сообщение, Символы.ПФ, " ");
    Сообщение = СтрЗаменить(сообщение, Символы.НПП, " ");
    Сообщение = СтрЗаменить(сообщение, Символы.ВК, " ");
    Сообщение = СтрЗаменить(сообщение, Символы.ВТаб, " ");
    возврат сообщение;
конецфункции

&НаСервере
функция получитьТекстСообщения(Сообщение, Цифра)
    ЗаписьJSON = Новый ЗаписьJSON;   
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,Истина,,истина,истина,,,Истина); // максимально закрываем
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
    
    ЗаписьJSON.ЗаписатьНачалоОбъекта();
     ЗаписьJSON.ЗаписатьИмяСвойства("aps");
       ЗаписьJSON.ЗаписатьНачалоОбъекта(); 
         ЗаписьJSON.ЗаписатьИмяСвойства("alert");
          ЗаписьJSON.ЗаписатьЗначение(""+сообщение+"");
         
         ЗаписьJSON.ЗаписатьИмяСвойства("badge");
          ЗаписьJSON.ЗаписатьЗначение(цифра);
         
         ЗаписьJSON.ЗаписатьИмяСвойства("sound");
          ЗаписьJSON.ЗаписатьЗначение("bingbong.aiff");
         
     ЗаписьJSON.ЗаписатьКонецОбъекта();
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    СтрокаТелоЗапроса =  ЗаписьJSON.Закрыть();
    возврат СтрокаТелоЗапроса;
конецфункции    

&НаСервере
Процедура послатьПушНаСервере(Цифра, текстСообщения, DEVICE_TOKEN) 
    
    // настроим параметры
    TEAM_ID="922L57LJJB";
    //TOKEN_KEY_FILE_NAME="/Users/dimaermilov/Desktop/p8/AuthKey_7W9KQGUTC7.p8"; // сертификат будем брать из макета
    AUTH_KEY_ID="7W9KQGUTC7";
    TOPIC="ru.iReport24";
    APNS_HOST_NAME="api.push.apple.com";
    
    // вычислим токен
    JWT_ISSUE_TIME=Формат(ТекущаяДата() - дата(1970,1,1,3,0,0), "ЧГ=0");  // приведение текущего формата к Unix. !! Обязательно сверьте со значением из MacOs. Пример из интернета дата(1970,1,1,1,0,0) давал расхождение в два часа. 
    
    JWT_HEADER=получитьBase64("{ ""alg"": ""ES256"", ""kid"": """+AUTH_KEY_ID+""" }"); // приведем средствами 1С
    JWT_CLAIMS=получитьBase64("{ ""iss"": """+TEAM_ID+""", ""iat"": "+JWT_ISSUE_TIME+" }");    
    JWT_HEADER_CLAIMS = JWT_HEADER+"."+JWT_CLAIMS;
    JWT_SIGNED_HEADER_CLAIMS = ПодписатьСтроку(JWT_HEADER_CLAIMS);     // средствами 1С8 эту задачу решить не смог. Заранее установил openssl и прописал путь в окружении windows
    AUTHENTICATION_TOKEN=JWT_HEADER+"." +JWT_CLAIMS+"."+JWT_SIGNED_HEADER_CLAIMS;
    
    // отправим push
    ОтправитьPush(Цифра, текстСообщения, DEVICE_TOKEN, AUTHENTICATION_TOKEN, TOPIC, APNS_HOST_NAME); 
    
конецпроцедуры

&НаСервере
функция получитьBase64(ИсходныеДанные)
    Поток = Новый ПотокВПамяти;
    ЗаписьТекста = Новый ЗаписьТекста(Поток) ;
    ЗаписьТекста.Записать(ИсходныеДанные);
    ЗаписьТекста.Закрыть();
    ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Строка64 = Base64Строка(ДвоичныеДанные);
    возврат(Строка64);
    
конецфункции    

&НаСервере
функция ПодписатьСтроку(JWT_HEADER_CLAIMS)
    
    // сохраним сертификат во временный файл
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ДвоичныеДанные = ОбработкаОбъект.ПолучитьМакет("AuthKey_7W9KQGUTC7_p8");  // в конфигураторе сохраним сертификат как двоичные данные в макет. Лучше хранить сертификат и в регистре сведений. Это позволит отдавать программный код сторонним разработчикам.
    ИмяФайлаКлюча = ПолучитьИмяВременногоФайла("key");
    ДвоичныеДанные.Записать(ИмяФайлаКлюча);
    
    // сохраним строку во временный файл
    ИмяФайлаСтроки = ПолучитьИмяВременногоФайла("txt");
    ФайлTXT= Новый ТекстовыйДокумент;
    ФайлTXT.УстановитьТекст(JWT_HEADER_CLAIMS);
    ФайлTXT.Записать(ИмяФайлаСтроки, КодировкаТекста.Системная); 
    
    // запустим openssl подпишем 256
    ИмяФайлаРезультата256 = ПолучитьИмяВременногоФайла("256");
    команднаяСтрока = "openssl dgst -sha256 -sign "+ИмяФайлаКлюча+" -out "+ИмяФайлаРезультата256+" "+ИмяФайлаСтроки;
    ЗапуститьПриложение(команднаяСтрока,,истина);
    
    // запустим openssl и закодируем base64
    ИмяФайлаРезультата64 = ПолучитьИмяВременногоФайла("64");
    команднаяСтрока = "openssl base64 -in "+ИмяФайлаРезультата256+" -out "+ИмяФайлаРезультата64+" -e -A ";
    ЗапуститьПриложение(команднаяСтрока,,истина);
    
    // получим результат
     ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.Прочитать(ИмяФайлаРезультата64);
    результат = ТекстовыйФайл.ПолучитьТекст();    

    // удалим временные файлы
    УдалитьФайлы(ИмяФайлаКлюча); 
    УдалитьФайлы(ИмяФайлаСтроки);
    УдалитьФайлы(ИмяФайлаРезультата256);
    УдалитьФайлы(ИмяФайлаРезультата64);
    
    // подпишем base64 и вернем результат
    возврат результат;
конецфункции

&НаСервере
процедура ОтправитьPush(Цифра, текстСообщения, DEVICE_TOKEN, AUTHENTICATION_TOKEN, TOPIC, APNS_HOST_NAME)
    // отправить средствами 1с8 не получилось. Сервер apple требует протокол http2. На платформе 8.3.21.1484 подключение не осуществлялось

// Программа тестировалась на Windows 10 и curl 7.83.1 не поддерживает http2.
// с интернета скачал curl curl 7.85.0 и разместил в папке D:\curl\bin 
    СистемнаяИнформация = Новый СистемнаяИнформация;
    
    ЭтоWindowsКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
                 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;
                 
     // команднаяСтрокаДляПроверкиНаМас - её можно просто скопировать и вставить в MacOS для проверки
    команднаяСтрокаДляПроверкиНаМас = "curl -v"           
                   + " --header ""apns-topic: "+TOPIC + """"
                   + " --header ""apns-push-type: alert""" 
                   + " --header ""authorization: bearer "+AUTHENTICATION_TOKEN + """"
                   + " --data '"+текстСообщения+"'" 
                   + " --http2 https://"+APNS_HOST_NAME+"/3/device/"+DEVICE_TOKEN; 

    Если ЭтоWindowsКлиент тогда 
      // для Windows нужно помучиться
        текстСообщения = СтрЗаменить(текстСообщения, """", "\""");   // в windows защитим все кавычки косой чертой \   // в json строке защищаем кавычки
        
        команднаяСтрокаWin = "curl -v"
                   + " --header ""apns-topic: "+TOPIC + """"
                   + " --header ""apns-push-type: alert""" 
                   + " --header ""authorization: bearer "+AUTHENTICATION_TOKEN + """"
                   + " --data """+текстСообщения+"""" 
                   + " --http2 https://"+APNS_HOST_NAME+"/3/device/"+DEVICE_TOKEN; 
                   
        команднаяСтрокаWin = "D:\curl\bin\"+команднаяСтрокаWin; // в лоб прописал путь к скачанной curl
        // ЗапуститьПриложение("D:\curl\bin\"+команднаяСтрокаWin,,истина);     // если в сообщении будет кириллица, то сообщение не дойдет       
        
        // создадим .bat файл в кодировке utf-8
        ИмяФайлаBat = ПолучитьИмяВременногоФайла("bat"); 
        
        // записываем в файл с символами BOM в начале файле    
        ТекстовыйФайлUTF8_Bom = Новый ТекстовыйДокумент();
        ТекстовыйФайлUTF8_Bom.ДобавитьСтроку("chcp 1251");        // поменяем окружение с 866 dos на 1251 
        ТекстовыйФайлUTF8_Bom.ДобавитьСтроку(команднаяСтрокаWin); 
   

        ТекстовыйФайлUTF8_Bom.Записать(ИмяФайлаBat,"UTF-8");  // при сохранении в UTF-8 добавляется BOM символы в начале файла
                
        // открываем файл и считываем символы после символов BOM
        Данные = Новый ДвоичныеДанные(ИмяФайлаBat);
        Строка64=Base64Строка(Данные);
        Строка64=Прав(Строка64,СтрДлина(Строка64)-4);         // убираем BOM символы
        ДанныеНаЗапись=Base64Значение(Строка64);
        ДанныеНаЗапись.Записать(ИмяФайлаBat); // записываем
        
        ЗапуститьПриложение(ИмяФайлаBat,,истина);   // Отправка push уведомления
              
        УдалитьФайлы(ИмяФайлаBat);
    конецесли;
    
    // для отладки в командной строке
    сообщить("Строка сгенерированная на Windows для Mac");
    сообщить(команднаяСтрокаДляПроверкиНаМас);           
    
    сообщить("Строка сгенерированная для Windows");
    сообщить(команднаяСтрокаWin);        
конецпроцедуры

 

1c8 apple мобильные устройства iphone iOS APN .p8 Windows push уведомления production http2

См. также

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 руб.

27.12.2021    38196    108    161    

201

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

3000 руб.

03.12.2018    59291    192    103    

172

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    97225    586    189    

321

Логистика, склад и ТМЦ Сканер штрих-кода Терминал сбора данных Мобильная разработка Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

3450 руб.

28.04.2023    9469    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4643    1    0    

6

Мобильная разработка WEB-интеграция Программист Мобильная платформа Абонемент ($m)

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1215    6    informa1555    1    

13

Мобильная разработка Мобильная платформа Абонемент ($m)

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2607    29    informa1555    0    

33
Оставьте свое сообщение