Сервер Google GCM возвращает Unauthorized Error 401

Я использую службы GCM для передачи информации с сервера. Если я использую ключ браузера, он показывает suase mesaage как: {"multicast_id": 4849013215736515938, "success": 1, "failure": 0, "canonical_ids": 0, "results": [{"message_id": "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; 

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

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

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

https://code.google.com/apis/console/#project:%5BНЕТ НОМЕР ПРОЕКТА]: доступ

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

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

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

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

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

 curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 

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

Раньше я

 $apiKey = "xxxxx" 

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

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

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

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

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

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

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

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

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

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

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

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

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

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