【问题标题】:C2DM Server with PHP 401 Error带有 PHP 401 错误的 C2DM 服务器
【发布时间】:2011-02-06 20:46:34
【问题描述】:

我现在正在构建自己的 C2DM 应用程序。我首先从一个小型 Android 应用程序开始测试推送功能。如果我只是在我的 shell 中使用正确的设置调用 curl 命令,它就可以工作。

现在对于服务器部分,我想使用 PHP,但似乎我做错了什么,因为当我尝试向客户端发送消息时总是收到 401 错误消息。首先,代码由两部分组成。第一个 curl 请求请求服务器令牌。这行得通,我得到了来自谷歌的真实响应,带有工作令牌!

第二个 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;

【问题讨论】:

  • 好的。我不知道为什么,但没有任何效果了。即使使用我的 curl 示例,我总是会收到 401 错误。现在,如果我尝试对自己进行身份验证,我会得到一个 SID、LSID 和身份验证令牌。不知道昨天是不是也这样?我想昨天我只得到了 1 个令牌。但我必须稍后再检查一次。改变的可能是我换了电脑。当一切正常时,我不再使用昨天尝试的同一台计算机。这可能与此有关吗?
  • 嗨尼诺!我只是复制你在楼上发布的代码,我也遇到了同样的 401 问题。所以......你能告诉我你如何解决这个问题,或者你能把你的工作代码发给我吗?谢谢你的帮助!你的跨度>

标签: php android android-c2dm


【解决方案1】:

key'd 数组与 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 是 ClientLogin 返回的 SID。 $device_registration_id 是我们做 C2DM_REGISTER 时手机客户端应用给我们的注册 ID。

希望对您有所帮助。

【讨论】:

  • 好的,这也不起作用。我很确定我的帐户现在有问题...请问您多久刷新一次身份验证令牌?也许我因为经常尝试而被禁止?我得到一个 SID、LSID 和 Auth Token 回来。你只使用 SID 令牌吗?
  • 好的,我的代码现在可以工作了(实际上是你的和我的),但仅限于我第一次使用 shell curl 工具生成的代码。关于它有一件有趣的事情。我得到的第一个代码中只有一个 SID。当我尝试重新创建一个令牌时,我得到了一个 SID、LSID 和 Auth 令牌,它们不适用于身份验证。现在,你能不能回答我这个问题。需要多久重新创建一次身份验证令牌?你是怎么处理这个的(也许我只能在旧的过期时更改它?)
  • -嗨尼诺!我只是复制你在楼上发布的代码,我也遇到了同样的 401 问题。所以......你能告诉我你如何解决这个问题,或者你能把你的工作代码发布给我吗?谢谢你的帮助!
  • 我认为这是一个比我们最初意识到的更大的问题。我现在刚刚将我的服务与另一个谷歌帐户一起使用,我也收到了 401 错误。但是,如果我使用我的普通 Google 帐户,它就可以工作。我知道的唯一区别是有效的帐户是我在 sender_id 字段中使用的帐户。如果我使用其他帐户,它就不起作用。
【解决方案2】:

尝试注册您的应用here。我遇到了同样的问题。

【讨论】:

    【解决方案3】:

    我不完全确定这里发生了什么,但我注意到我的应用程序服务器运行良好的一些不同之处。

    在您对 CURLOPT_HTTPHEADER 的 curl_setopt 调用中,内容长度和大小之间没有空格。这“应该不会造成问题,但我之前曾看到网络服务器因此类愚蠢的事情而变得暴躁。

    此外,CURLOPT_POSTFIELDS 是一个字符串,而我将我的作为键数组发送。

    除此之外,我看起来和我的工作代码一样。

    【讨论】:

    • 我在内容长度和大小之间添加了一个空格,但仍然没有。你能告诉我一个关于如何在 CURL 中使用 key'd 数组的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多