Подтвердить что ты не робот

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

Я использую службы GCM для передачи информации с сервера. Если я использую ключ браузера, он показывает suase 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;

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Итак, я проверил активированные API (API и Auth → API, Enabled API) и понял, что я включил Google Cloud Messaging for Chrome not Google Cloud Messaging for Android. Как только я включил последний, он сразу сработал.

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

Ответ 4

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

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

Ответ 6

Я использовал для

$apiKey = "xxxxx"

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

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);
}

Ответ 10

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

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

Ответ 11

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

Ответ 13

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