2

現在、独自のC2DMアプリケーションを構築しています。私は最初、プッシュ機能をテストするために小さなAndroidアプリケーションから始めました。また、シェルの正しい設定でcurlコマンドを呼び出すだけで機能します。

サーバー部分ではPHPを使用したかったのですが、クライアントにメッセージを送信しようとすると常に401エラーメッセージが表示されるため、何か問題が発生しているようです。まず、コードは2つの部分で構成されています。最初のcurlリクエストは、サーバートークンを要求します。これはうまくいきます私は動作するトークンでグーグルから実際の応答を受け取ります!

2番目の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;
4

3 に答える 3

2

curlでのkey'd配列の使用例。これは私が作業しているコードとほぼ同じです(わかりやすくするために小さな変更が加えられています)。

$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は、ClientLoginによって返されるSIDです。$ device_registration_idは、C2DM_REGISTERを実行したときに電話のクライアントアプリから提供された登録IDです。

お役に立てば幸いです。

于 2011-02-08T00:14:54.990 に答える
1

ここでアプリを登録してみてください。私も同じ問題を抱えていました。

于 2012-06-03T20:10:41.973 に答える
0

ここで何が起こっているのか完全にはわかりませんが、アプリケーションサーバーから正常に動作していることに気付いたいくつかの違いがあります。

CURLOPT_HTTPHEADERのcurl_setopt呼び出しでは、コンテンツの長さとサイズの間にスペースはありません。これは問題を引き起こさないはずですが、私は以前にWebサーバーがそのような愚かなものに対して一時的になるのを見てきました。

また、CURLOPT_POSTFIELDSは文字列ですが、私はキー付き配列として送信します。

それ以外は、作業コードと同じように見えます。

于 2011-02-07T00:57:49.137 に答える