Я придумал гениальную схему
. Она безумна, но... это работает!
Можно передать PUSH-уведомление с сервера mysite.com на сервер example.com, который находится в интрасети предприятия и доступ из мира к нему закрыт.
Для этого на компьютере администратора сервера запускаем браузер, который подписываем на PUSH-уведомления с сервера mysite,com
Браузер служит посредником. Таким образом, как только сервер mysite,com отправит пуш, так на сервере example.com сработает необходимый PHP-скрипт.
<?php
// receivepush.php
header('Access-Control-Allow-Origin: *'); // указывает браузеру разрешить запросы из любых источников
// здесь выполняется полезная работа (сохранение в базе и т.п.)
echo '{"answer":"processed"}'; // ответ в браузер на пуш
?>
// инициализация Firebase Cloud Messaging client как описано здесь:
// [url]https://firebase.google.com/docs/cloud-messaging/js/client?authuser=0[/url]
// ...
// ...
var messaging = firebase.messaging();
messaging.onMessage(
function(payload)
{
console.log('onMessage:', payload);
// отправка POST-запроса на сервер:
// пример взят отсюда: [url]https://developer.mozilla.org/ru/docs/Web/API/Fetch_API/Using_Fetch#Тело[/url]
const url = 'https://example.com/receivepush.php';
async function postData(url = '', data = {})
{
const response = await fetch(url,
{
method: 'POST',
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
headers:
{
'Content-Type': 'application/x-www-form-urlencoded' // для обычного POST-запроса
},
redirect: 'follow',
referrerPolicy: 'no-referrer',
body:data
});
return await response.json();
}
postData(url, 'cmd=1&mydata=12345') // какие-то мои данные (они будут получены из пуша)
.then((data) =>
{
console.log('принят ответ');
console.log(data);
});
}
);
// если вкладка браузера закрыта, то обработчик пуша должен быть определен в service worker:
messaging.setBackgroundMessageHandler
(
// аналогично messaging.onMessage()
);