Не отправляется push на HUAWEI через Push Kit
Я пытаюсь отправить push-уведомление на телефон HUAWEI через код php через сервис push Kit на сервисе huawei.com. На том сервисе Приложение создано правильно - я проверял. Но при отправке пуша выходит следующая ошибка:
{"code":"80100003","msg":"Illegal payload, No valid android notification
payload when sending notification message to android
users","requestId":"175748793029630358051001"}
Вот код php:
function sendHuaweiPush_1($deviceToken, $title, $message) {
$clientId = "***";//'ваш_client_id'; // Из App Gallery Connect
$clientSecret = "***";//'ваш_client_secret'; // Из App Gallery Connect
$appId = "***"; //'ваш_app_id'; // Пример: 123456789
// 1. Получаем access_token
$httpClient = new HttpClient();
$httpClient - > setHeader('Content-Type', 'application/x-www-form-urlencoded');
$response = $httpClient - > post('https://oauth-login.cloud.huawei.com/oauth2/v3/token', [
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
]);
$responseData = json_decode($response, true);
if (empty($responseData['access_token'])) {
echo "<pre>".print_r("Не получилось получить access_token", true).
"</pre>";
echo "<pre>".print_r($response, true).
"</pre>";
AddMessage2Log("Ошибка Huawei API: Не удалось получить access_token. Ответ: ".$response);
return false;
}
$accessToken = $responseData['access_token'];
var_dump($accessToken);
// Заголовки запроса
$headers = [
'Authorization: Bearer '.$accessToken,
'Content-Type: application/json'
];
// 2. Отправляем уведомление
$pushData = [
'validate_only' => false,
'message' => [
'notification' => [
'title' => $title,
'body' => $message,
],
'token' => [$deviceToken],
"data" => "{ \"key\": \"value\", \"action\": \"open_screen\" }"
],
];
echo "<pre>".print_r(json_encode($pushData), true).
"</pre>";
$ch = curl_init("https://push-api.cloud.huawei.com/v1/{$appId}/messages:send");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($pushData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$push_response = curl_exec($ch);
curl_close($ch);
echo "<pre>".print_r("Пришёл ответ от сервера:", true).
"</pre>";
echo "<pre>".print_r($push_response, true).
"</pre>";
$result = json_decode($push_response, true);
if (isset($result['code'])) {
echo "<pre>".print_r("Не получилось отправить push", true).
"</pre>";
echo "<pre>".print_r($push_response, true).
"</pre>";
AddMessage2Log("Ошибка отправки push: ".$push_response);
return false;
}
return true;
}
Что я делаю не так?
Ответы (2 шт):
Я решил данный вопрос. Сейчас пуши отправляются на HUAWEI. Просто нужно было в pushData добавить после "notification" ключ "android" со всем содержимым. Вот как выглядит сейчас эта функция:
function sendHuaweiPush_1($deviceToken, $title, $message) {
$clientId = "***";//'ваш_client_id'; // Из App Gallery Connect
$clientSecret = "***";//'ваш_client_secret'; // Из App Gallery Connect
$appId = "***";//'ваш_app_id'; // Пример: 123456789
// 1. Получаем access_token
$httpClient = new HttpClient();
$httpClient->setHeader('Content-Type', 'application/x-www-form-urlencoded');
$response = $httpClient->post('https://oauth-login.cloud.huawei.com/oauth2/v3/token', [
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
]);
$responseData = json_decode($response, true);
if (empty($responseData['access_token'])) {
//echo "<pre>" . print_r("Не получилось получчить access_token", true) . "</pre>";
//echo "<pre>" . print_r($response, true) . "</pre>";
AddMessage2Log("Ошибка Huawei API: Не удалось получить access_token. Ответ: " . $response);
return false;
}
$accessToken = $responseData['access_token'];
//var_dump($accessToken);
// Заголовки запроса
$headers = [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json'
];
// 2. Отправляем уведомление
//$httpClient->setHeader('Content-Type', 'application/json');
//$httpClient->setHeader('Authorization', 'Bearer ' . $accessToken);
$pushData = [
'validate_only' => false,
'message' => [
'notification' => [
'title' => $title,
'body' => $message,
],
"android" => [
"collapse_key" => -1,
"urgency" => "NORMAL",
"category" => "PLAY_VOICE",
"ttl" => "1448s",
"bi_tag" => "Trump",
"fast_app_target" => 1,
"notification" => [
"image" => "https://res.vmallres.com/pimages//common/config/logo/SXppnESYv4K11DBxDFc2.png",
"icon" => "/raw/ic_launcher2",
"color" => "#AACCDD",
"sound" => "/raw/shake",
"default_sound" => true,
"importance" => "NORMAL",
"click_action" => [
"type" => 1,
"intent" => "intent://com.huawei.codelabpush/deeplink?#Intent;scheme=pushscheme;launchFlags=0x04000000;i.age=180;S.name=abc;end",
"url" => "https://www.vmall.com"
],
"body_loc_key" => "demo_title_new2",
"body_loc_args" => [
"Boy",
"Dog",
"ff"
],
"title_loc_key" => "demo_title_new2",
"title_loc_args" => [
"Girl",
"Cat",
"tiger"
],
"channel_id" => "HMSTestDemo",
"notify_summary" => "Some Summary",
"style" => 0,
"big_title" => $title,
"big_body" => $message,
"notify_id" => 486,
"group" => "Espace",
"badge" => [
"add_num" => 1,
"class" => "com.huawei.demo.push.HuaweiPushApiExample"
],
"foreground_show" => false,
"ticker" => "I am a ticker",
"when" => "2014-10-02T15:01:23.045123456Z",
"use_default_vibrate" => true,
"use_default_light" => true,
"visibility" => "PUBLIC",
"vibrate_config" => [
"1",
"3"
],
"light_settings" => [
"color" => [
"alpha" => 0,
"red" => 0,
"green" => 1,
"blue" => 0.1
],
"light_on_duration" => "3.5",
"light_off_duration" => "5S"
]
]
],
'token' => [$deviceToken],
"data" => "{ \"key\": \"value\", \"action\": \"open_screen\" }"
],
];
//echo "<pre>" . print_r(json_encode($pushData), true) . "</pre>";
$ch = curl_init("https://push-api.cloud.huawei.com/v1/{$appId}/messages:send");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($pushData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$push_response = curl_exec($ch);
curl_close($ch);
//echo "<pre>" . print_r("Пришёл ответ от сервера:", true) . "</pre>";
//echo "<pre>" . print_r($push_response, true) . "</pre>";
//$response = $httpClient->post(
// "https://push-api.cloud.huawei.com/v1/{$appId}/messages:send",
// json_encode($pushData)
//);
$result = json_decode($push_response, true);
if (isset($result['code'])) {
//echo "<pre>" . print_r("Не получилось отправить push", true) . "</pre>";
//echo "<pre>" . print_r($push_response, true) . "</pre>";
AddMessage2Log("Ошибка отправки push: " . $push_response);
return false;
}
return true;
}
Вопрос с вибрацией, звуков и чтобы push-уведомление выходило поверх всех окон решился: Нужно произвести настройки на самом телефоне HUAWEI. Нужно посмотреть вот эту инструкцию: Чтобы добиться вибрации, звука и всплывающего окна при отправке push-уведомлений на Huawei, перейдите в Настройки > Уведомления, выберите нужное приложение, включите "Разрешить уведомления", затем в настройках самого приложения выберите режим уведомлений, включив опции "Экран блокировки" и "Баннеры", а также настройте нужные параметры "Звук уведомления" и "Вибрация". Пошаговая инструкция Откройте Настройки: на вашем телефоне Huawei. Перейдите в раздел "Уведомления". Найдите и выберите нужное приложение из списка. Убедитесь, что функция "Разрешить уведомления" включена. В настройках этого приложения найдите опции для режимов уведомлений. Включите: следующие параметры: "Экран блокировки": чтобы уведомления появлялись и на заблокированном экране. "Баннеры": чтобы уведомления всплывали вверху экрана поверх других приложений, когда телефон разблокирован. Выберите "Звук уведомления" и настройте желаемый звуковой сигнал. Настройте "Вибрация", выбрав нужный тип вибрации или отключив ее при необходимости. Дополнительные советы Проверьте общий режим звука и вибрации: Убедитесь, что ваш телефон не находится в режиме "Без звука" или "Без вибрации", переключившись через панель быстрых настроек. Умные уведомления: Если вы не получаете уведомления, возможно, включена функция "Умные уведомления", которая скрывает их, когда телефон используется. Отключите ее в настройках приложения Huawei Health или в настройках уведомлений. Приоритетные события: Если вы используете режим "Не беспокоить", проверьте, не включены ли у вашего приложения "Приоритетные события", которые позволяют получать уведомления даже в этом режиме.
А ещё нужно посмотреть вот это:
Чтобы при нажатии на push-уведомление на Huawei открывался детальный просмотр, необходимо в настройках приложения, отправившего уведомление, включить опцию, которая позволяет отображать его содержимое, и в центре уведомлений указать показывать миниатюры всегда. Также убедитесь, что для приложения разрешен показ уведомлений в настройках телефона. Шаги по настройке:
- Включите уведомления для приложения на телефоне. Откройте «Настройки» на вашем телефоне Huawei. Найдите и выберите пункт «Уведомления». Выберите из списка необходимое приложение. Убедитесь, что переключатель «Разрешить уведомления» включен.
- Настройте Центр уведомлений для отображения миниатюр. На той же странице настроек приложения нажмите на «Центр уведомлений». Выберите значение «Всегда» для параметра «Показ миниатюр» или аналогичную опцию.
- Проверьте настройки в приложении (если есть). Некоторые приложения могут иметь собственные настройки уведомлений. Откройте приложение и найдите раздел с настройками уведомлений, чтобы убедиться, что включена функция показа подробной информации при нажатии. После выполнения этих действий, при нажатии на push-уведомление должно происходить открытие детального просмотра содержимого уведомления.