Сервер Google GCM возвращает несанкционированную ошибку 401


Я использую сервисы GCM для отправки информации с сервера. Если я использую браузер ключа он показывает успех mesaage как : {"multicast_id":4849013215736515938,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1348742583011905%2adac3a0f9fd7ecd"}]} но я не получаю никаких уведомлений на устройстве. И если я использую ключ сервера, он показывает Несанкционированную ошибку 401. Мой код показан ниже:

$apiKey = "xxxxx";
$registrationIDs = array("xxxxxxxx");
$message = "testing Process";
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
        'registration_ids'  => $registrationIDs,
        'data'              => array("message"=>$message),
        );
$headers = array( 
        'Authorization: key=' . $apiKey,
        'Content-Type: application/json'
        );
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );

$result = curl_exec($ch);
if(curl_errno($ch)){ echo 'Curl error: ' . curl_error($ch); }
curl_close($ch);
echo $result;

Пожалуйста, помогите мне в этом вопросе. Заранее спасибо.

Author: Sushil Kandola, 2012-09-27

14 answers

Вы внесли IP-адрес вашего сервера в белый список? По умолчанию это необязательно для ключа браузера, но это необходимо для ключа сервера.

Вы можете проверить это здесь:

Https://code.google.com/apis/console/#project :[НОМЕР ВАШЕГО ПРОЕКТА]: доступ

 31
Author: Jos, 2013-01-03 09:00:58

В другом ответе уже предлагалось внести IP-адрес в белый список, что кажется довольно очевидным. Что исправило это для меня, так это занесение в белый список моего IPv6-адреса. Это был ключ! Я надеюсь, что это поможет кому-то еще.

 19
Author: DanO, 2013-03-11 18:17:57

Я перепробовал все в этой теме, и все равно безуспешно.

Поэтому я проверил включенные API (API и Auth ->API, Включенные API ) и понял, что я включил Google Cloud Messaging for Chrome, а не Google Cloud Messaging for Android. Как только я включил последнее, оно сразу же сработало.

Дважды проверьте, что у вас включен правильный API!

 14
Author: Dan Bartlett, 2014-11-26 13:29:12

Как писали многие люди, вы должны внести свой сервер в белый список IPV4 и IPV6. Если вам нужен только IPV4, добавьте это в свой php-инициализацию curl:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
 3
Author: Thomas Decaux, 2015-01-27 16:09:05

Используйте ключ браузера с помощью опции создайте новый ключ браузера и используйте этот ключ в своем коде. https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access

 2
Author: mayur bhagat, 2013-05-09 18:50:49

Раньше я ставил на

$apiKey = "xxxxx"

Как номер проекта (идентификатор проекта), который я ввел в клиентское приложение Android, но я ошибся в сервере, должен быть ключ приложения из облачной консоли Google (где вы активируете Облачные сообщения Google для Android)

    ProjectXXX -> APIs & auth -> Registered Apps -> Web App -> Server Key
 -> Api key

в моем случае у меня был проект по умолчанию "Учетная запись службы-проект" на платформе: "Веб", но там было только Hosted Application section и никаких доказательств о каком-либо ключе api. но когда я создаю новое Web Apps под названием "Мое приложение", которое содержало 4 разделы OAuth 2.0 Client ID, Certificate, Ключ Сервера, Browser Key я наконец-то нашел ключ api;-)

Может быть, только я, кто этого не знает, но я верю, что этот ответ также может помочь кому-то

 2
Author: m1uan, 2013-12-05 02:31:48

Для меня проблема заключалась в том, что вам нужно было включить api. Недостаточно настроить API. Убедитесь, что Google Cloud Messaging для Android отображается в включенных API-интерфейсах в разделе API-> включенные API.

Если это не так, перейдите на вкладку Библиотека API в API и включите ее. \

 1
Author: Nir, 2015-06-21 15:20:18

Если я не ошибаюсь, ваш APIKEY должен быть закодирован в кодировке base64.

Также попробуйте var_dump($results), чтобы узнать, получите ли вы тогда информацию.

 0
Author: Case, 2012-09-27 10:58:23

Глядя на код, я понимаю, что это из образца php-gcm, размещенного где-то в Интернете. Это довольно приятно, и я могу заверить вас, что работают как ключи браузера, так и IP-адреса из белого списка (не IPV6 или bas64 apikey).

Причина, по которой сообщение не отображается, заключается в том, что используемая вами функция отправки уведомлений 'data' => array("message"=>$message) нацелена на ключ "сообщение", это то, что вы должны передать своему ожидающему намерению, т.е.

notification.setLatestEventInfo(context, title, message, intent);

Это позволит намерению прочитать сообщение, содержащееся под этим ключом. само сообщение получено из метода GCMIntentService, вставленного ниже:

 @Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String message = intent.getExtras().getString("message");
    Log.d(TAG, "The intent contains: " + intent.getExtras());
    displayMessage(context, message);
    // notifies user
    generateNotification(context, message);
}
 0
Author: Lettings Mall, 2013-05-13 10:52:15

Вот в чем проблема: я использовал 2 сервера, 1 промежуточный, а другой - производственный сервер. Для моего промежуточного сервера, который был размещен с использованием digital ocean, я ввел адрес inet в ключ для серверных приложений разрешенные IP-адреса, и он работал просто отлично.

Однако это не удалось, когда я изменил свой адрес inet с моего рабочего сервера. Вместо этого мне пришлось использовать inet6 addr:/64 Область действия: Глобальная, чтобы это работало. Чтобы получить значение, если вы столкнетесь с той же проблемой, просто введите ifconfig и найдите указанную выше запись. Введите это значение в разрешенные IP-адреса, и оно будет работать нормально.

 0
Author: Qin Zhengquan, 2014-10-31 10:19:08

У вас должен быть проект, отличный от проекта по умолчанию. Создайте проект, а затем создайте ключ. Не используйте проект по умолчанию.

 0
Author: Pavan Pyati, 2016-02-03 19:44:15

У меня была такая проблема, я использовал GCM (облачный обмен сообщениями Google). Но после сентября 2016 года серверный ключ на GCM не будет работать, вам придется использовать FCM (firebase cloud messaging). Создавайте новые ключи сервера только в консоли Firebase, используя вкладку Облачные сообщения на панели настроек. Я подошел к консоли firebase console.firebase.google.com (Я еще не использовал его), и он попросил меня импортировать мой проект. Внезапно на консоли GCM появился этот новый ключ сервера. При использовании GCM используйте "унаследованный ключ", который вы видите в списке там.

 0
Author: Nate Hammond, 2018-02-17 00:45:17

Убедитесь, что вы включили свой ключ проверки API!

 -1
Author: user3559800, 2016-02-23 23:00:27

Мы ищем решения в течение нескольких дней. Более конкретно, добавьте этот параметр завитка: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

 -1
Author: Kamilklkn, 2016-02-24 02:23:59