Сервер 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;
Пожалуйста, помогите мне в этом вопросе. Заранее спасибо.
14 answers
Вы внесли IP-адрес вашего сервера в белый список? По умолчанию это необязательно для ключа браузера, но это необходимо для ключа сервера.
Вы можете проверить это здесь:
Https://code.google.com/apis/console/#project :[НОМЕР ВАШЕГО ПРОЕКТА]: доступ
В другом ответе уже предлагалось внести IP-адрес в белый список, что кажется довольно очевидным. Что исправило это для меня, так это занесение в белый список моего IPv6-адреса. Это был ключ! Я надеюсь, что это поможет кому-то еще.
Я перепробовал все в этой теме, и все равно безуспешно.
Поэтому я проверил включенные API (API и Auth ->API, Включенные API ) и понял, что я включил Google Cloud Messaging for Chrome
, а не Google Cloud Messaging for Android
. Как только я включил последнее, оно сразу же сработало.
Дважды проверьте, что у вас включен правильный API!
Как писали многие люди, вы должны внести свой сервер в белый список IPV4 и IPV6. Если вам нужен только IPV4, добавьте это в свой php-инициализацию curl:
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
Используйте ключ браузера с помощью опции создайте новый ключ браузера и используйте этот ключ в своем коде. https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access
Раньше я ставил на
$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;-)
Может быть, только я, кто этого не знает, но я верю, что этот ответ также может помочь кому-то
Для меня проблема заключалась в том, что вам нужно было включить api. Недостаточно настроить API. Убедитесь, что Google Cloud Messaging для Android отображается в включенных API-интерфейсах в разделе API-> включенные API.
Если это не так, перейдите на вкладку Библиотека API в API и включите ее. \
Если я не ошибаюсь, ваш 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 промежуточный, а другой - производственный сервер. Для моего промежуточного сервера, который был размещен с использованием digital ocean, я ввел адрес inet в ключ для серверных приложений разрешенные IP-адреса, и он работал просто отлично.
Однако это не удалось, когда я изменил свой адрес inet с моего рабочего сервера. Вместо этого мне пришлось использовать inet6 addr:/64 Область действия: Глобальная, чтобы это работало. Чтобы получить значение, если вы столкнетесь с той же проблемой, просто введите ifconfig и найдите указанную выше запись. Введите это значение в разрешенные IP-адреса, и оно будет работать нормально.
У вас должен быть проект, отличный от проекта по умолчанию. Создайте проект, а затем создайте ключ. Не используйте проект по умолчанию.
У меня была такая проблема, я использовал GCM (облачный обмен сообщениями Google). Но после сентября 2016 года серверный ключ на GCM не будет работать, вам придется использовать FCM (firebase cloud messaging). Создавайте новые ключи сервера только в консоли Firebase, используя вкладку Облачные сообщения на панели настроек. Я подошел к консоли firebase console.firebase.google.com (Я еще не использовал его), и он попросил меня импортировать мой проект. Внезапно на консоли GCM появился этот новый ключ сервера. При использовании GCM используйте "унаследованный ключ", который вы видите в списке там.
Убедитесь, что вы включили свой ключ проверки API!
Мы ищем решения в течение нескольких дней. Более конкретно, добавьте этот параметр завитка: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );