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

Я использую службы GCM для отправки информации с сервера. Если я использую ключ браузера, он показывает сообщение об успешном завершении как: "0:1348742583011905%2adac3a0f9fd7ecd"}]} но я не получил никаких уведомлений на устройстве. И если я использую ключ сервера, он показывает Unauthorized Error 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;

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


person Sushil Kandola    schedule 27.09.2012    source источник
comment
обратитесь к этому stackoverflow.com/a/21628030/1765530   -  person appukrb    schedule 07.02.2014
comment
Можете ли вы сделать небольшой список шагов конфигурации Google?   -  person valeriocomo    schedule 15.04.2015
comment
Для тех, кто просматривает только что, если вы внезапно начали сталкиваться с этой ошибкой, не внося никаких конкретных изменений (ключ сервера), вам, вероятно, нужно импортировать свой проект в Firebase. См. мой ответ здесь.   -  person AL.    schedule 25.10.2016


Ответы (14)


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

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

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

person Jos    schedule 03.01.2013
comment
Спасибо всем, ребята. Я столкнулся с проблемой из-за ключа браузера и ключа API. Теперь он отлично работает с ключом API сервера. - person Sushil Kandola; 16.01.2014
comment
Привет, Джос. Как я внес в белый список IP-адрес моего сервера. ? Я получаю несанкционированный 401. - person Olkunmustafa; 17.03.2014
comment
Google немного обновил консоль, вы будете перенаправлены по ссылке в моем ответе. Там вы можете увидеть кнопку Изменить разрешенные IP-адреса. Я ввел любой разрешенный IP-адрес, в зависимости от секретности моего ключа для безопасности. - person Jos; 18.03.2014

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

person DanO    schedule 11.03.2013
comment
Если вы используете curl для отладки и добавили в белый список свой IPv4-адрес, но не свой IPv6-адрес, вы можете передать -4 в curl, чтобы он подключался с использованием IPv4. - person John Mellor; 28.10.2014
comment
В частности, добавьте этот параметр завитка: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); - person zeusstl; 05.02.2015
comment
Эквивалентом 0.0.0.0/0 (все адреса IPv4) является ::/0 для IPv6, FYI - person four43; 13.03.2015

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

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

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

person Dan Bartlett    schedule 26.11.2014
comment
Это хорошее решение!!! Прекрасно работает. Создание Google Cloud Messaging для Chrome помогло. Спасибо :) - person Adae Rodríguez; 16.06.2016

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

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
person Thomas Decaux    schedule 27.01.2015

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

person mayur bhagat    schedule 09.05.2013
comment
Вот в чем заключалась моя проблема: я пытался использовать ключ сервера вместо ключа браузера, я думаю, это имеет больше смысла, поскольку Curl больше похож на веб-браузер, чем на прямое подключение к сокету. Не могу поверить, сколько времени я потерял, просто пробую все, кроме этого /facepalm - person CTS_AE; 20.12.2013

я ставил на

$apiKey = "xxxxx"

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

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

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

может только я, кто этого не знает, но я считаю, что этот ответ также может помочь кому-то

person m1uan    schedule 05.12.2013
comment
Привет, m1uan, произошла ошибка из-за неправильного ключа API, теперь все работает нормально :) - person Sushil Kandola; 18.12.2013
comment
Рад тебя слышать, рад помочь ;-) - person m1uan; 19.12.2013

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

Если это не так, щелкните вкладку библиотеки API в APIS и включите ее. \

person Nir    schedule 21.06.2015

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

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

person Case    schedule 27.09.2012
comment
Эй, Искариот, после кодирования base64 это не аутентифицируется. И var_dump($results) показывает NULL в обоих случаях. - person Sushil Kandola; 27.09.2012
comment
ПУБЛИКИ должны быть подсчитаны ($ поля) - person Case; 27.09.2012
comment
Я не все знаю о GCM, но достраиваю целый интерфейс googlecheckout и по большей части гугл есть гугл есть гугл. - person Case; 27.09.2012
comment
Вы пытались изменить ключ API с ключа API браузера на ключ API сервера? - person jonaypelluz; 20.11.2012

Глядя на код, я узнаю, что это образец 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);
}
person Lettings Mall    schedule 13.05.2013

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

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

person Qin Zhengquan    schedule 31.10.2014

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

person Pavan Pyati    schedule 07.04.2015

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

person Nate Hammond    schedule 17.02.2018


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

person Kamilklkn    schedule 23.02.2016