Не отправляется 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 шт):

Автор решения: TCHProgrammer

Я решил данный вопрос. Сейчас пуши отправляются на 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;

}

→ Ссылка
Автор решения: TCHProgrammer

Вопрос с вибрацией, звуков и чтобы push-уведомление выходило поверх всех окон решился: Нужно произвести настройки на самом телефоне HUAWEI. Нужно посмотреть вот эту инструкцию: Чтобы добиться вибрации, звука и всплывающего окна при отправке push-уведомлений на Huawei, перейдите в Настройки > Уведомления, выберите нужное приложение, включите "Разрешить уведомления", затем в настройках самого приложения выберите режим уведомлений, включив опции "Экран блокировки" и "Баннеры", а также настройте нужные параметры "Звук уведомления" и "Вибрация". Пошаговая инструкция Откройте Настройки: на вашем телефоне Huawei. Перейдите в раздел "Уведомления". Найдите и выберите нужное приложение из списка. Убедитесь, что функция "Разрешить уведомления" включена. В настройках этого приложения найдите опции для режимов уведомлений. Включите: следующие параметры: "Экран блокировки": чтобы уведомления появлялись и на заблокированном экране. "Баннеры": чтобы уведомления всплывали вверху экрана поверх других приложений, когда телефон разблокирован. Выберите "Звук уведомления" и настройте желаемый звуковой сигнал. Настройте "Вибрация", выбрав нужный тип вибрации или отключив ее при необходимости. Дополнительные советы Проверьте общий режим звука и вибрации: Убедитесь, что ваш телефон не находится в режиме "Без звука" или "Без вибрации", переключившись через панель быстрых настроек. Умные уведомления: Если вы не получаете уведомления, возможно, включена функция "Умные уведомления", которая скрывает их, когда телефон используется. Отключите ее в настройках приложения Huawei Health или в настройках уведомлений. Приоритетные события: Если вы используете режим "Не беспокоить", проверьте, не включены ли у вашего приложения "Приоритетные события", которые позволяют получать уведомления даже в этом режиме.

А ещё нужно посмотреть вот это:

Чтобы при нажатии на push-уведомление на Huawei открывался детальный просмотр, необходимо в настройках приложения, отправившего уведомление, включить опцию, которая позволяет отображать его содержимое, и в центре уведомлений указать показывать миниатюры всегда. Также убедитесь, что для приложения разрешен показ уведомлений в настройках телефона. Шаги по настройке:

  1. Включите уведомления для приложения на телефоне. Откройте «Настройки» на вашем телефоне Huawei. Найдите и выберите пункт «Уведомления». Выберите из списка необходимое приложение. Убедитесь, что переключатель «Разрешить уведомления» включен.
  2. Настройте Центр уведомлений для отображения миниатюр. На той же странице настроек приложения нажмите на «Центр уведомлений». Выберите значение «Всегда» для параметра «Показ миниатюр» или аналогичную опцию.
  3. Проверьте настройки в приложении (если есть). Некоторые приложения могут иметь собственные настройки уведомлений. Откройте приложение и найдите раздел с настройками уведомлений, чтобы убедиться, что включена функция показа подробной информации при нажатии. После выполнения этих действий, при нажатии на push-уведомление должно происходить открытие детального просмотра содержимого уведомления.
→ Ссылка