Сервер C2DM с ошибкой PHP 401 - PullRequest
       8

Сервер C2DM с ошибкой PHP 401

2 голосов
/ 06 февраля 2011

Я сейчас создаю свое собственное приложение C2DM.Сначала я начал с небольшого приложения для Android, чтобы проверить функцию push.И это работает, если я просто вызываю команду curl с правильными настройками в моей оболочке.

Теперь для серверной части я хотел использовать PHP, но, как мне кажется, я делаю что-то не так, поскольку всегда получаю 401сообщение об ошибке при попытке отправить сообщение клиенту.Прежде всего код состоит из двух частей.Первый запрос curl запрашивает токен сервера.Это работает, я получаю реальный ответ от Google с рабочим токеном!

Второй запрос curl заканчивается сообщением об ошибке 401.Есть идеи, что я делаю не так?

  $post_params = array ( "Email" => $MY_GOOGLE_ACC, "Passwd" => $MY_GOOGLE_PWD, "accountType"=>"GOOGLE", "source=" . $MY_GOOGLE_SRC, "service=ac2dm" ); 

  $first = true;
  $data_msg = "";

  foreach ($post_params as $key => $value) { 
    if ($first)
      $first = false;
    else
      $data_msg .= "&";

    $data_msg .= urlencode($key) ."=". urlencode($value); 
  }

  $x = curl_init("https://www.google.com/accounts/ClientLogin"); 

  curl_setopt($x, CURLOPT_HEADER, 1); 
  curl_setopt($x, CURLOPT_POST, 1); 
  curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
  curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); 
  $data = curl_exec($x); 
  curl_close($x); 
  $response = $data;

  $authKey = trim(substr($response, 4+strpos($response, "SID=")));

  echo $authKey;
  $collapse_key = 'something';

  $post_params = array ( "registration_id" => $DEVICE_TOKEN, "collapse_key" => $collapse_key, "data.payload"=>"cakephp" ); 

  $first = true;
  $data_msg = "";

  foreach ($post_params as $key => $value) { 
    if ($first)
      $first = false;
    else
      $data_msg .= "&";

    $data_msg .= urlencode($key) ."=". urlencode($value); 
  }

  $size=strlen($data_msg); 


  $x = curl_init("https://android.apis.google.com/c2dm/send"); 
  curl_setopt($x, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'Content-Length:'. $size, 'Authorization: GoogleLogin auth=' . $authKey)); 
  curl_setopt($x, CURLOPT_HEADER, 1); 
  curl_setopt($x, CURLOPT_POST, 1); 
  curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
  curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); 
  $data = curl_exec($x); 
  curl_close($x); 
  $response = $data;

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

Пример использования ключевого массива с curl.Это почти точный код, с которым я работаю (с небольшими изменениями для ясности).

$headers = array('Authorization: GoogleLogin auth=' . $authcode);
$data = array(
    'registration_id' => $device_registration_id,
    'collapse_key' => 'ck_' . $device_id,
    'data.arg' => 'arrrrghhh'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if($headers) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);

$ authcode - это SID, возвращаемый ClientLogin.$ device_registration_id - это регистрационный идентификатор, который клиентское приложение на телефоне дало нам, когда мы делали C2DM_REGISTER.

Надеюсь, это поможет.

1 голос
/ 04 июня 2012

Попробуйте зарегистрировать ваше приложение здесь .У меня была такая же проблема.

0 голосов
/ 07 февраля 2011

Я не совсем уверен, что здесь происходит, но есть несколько отличий, которые я заметил на моем сервере приложений, который работает нормально.

В вашем вызове curl_setopt для CURLOPT_HTTPHEADER нет пробела между длиной содержимого иразмер.Это 'не должно вызывать проблем, но я видел, что веб-серверы получат временные эффекты из-за таких глупостей, как этот.

Кроме того, CURLOPT_POSTFIELDS - это строка, тогда как я отправляю свою в виде массива ключей.

Кроме того, я выгляжу так же, как мой рабочий код.

...