4

我知道有很多帖子都有同样的问题,但是在阅读完所有帖子后,我找不到问题的原因。

我编写了一个 GCM 客户端来注册我的设备以从我的服务器接收消息。它正在工作,我可以将注册 ID 存储在我的数据库中。

我的问题在服务器端。我正在使用在某处谷歌搜索的脚本,但我总是收到错误结果:

{"multicast_id":7341760174206782539,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

PHP 代码是(我使用的是 BROWSER API 而不是 SERVER API,如教程中所述,但尝试两个键返回相同的消息):

<?php
// Replace with real BROWSER API key from Google APIs
$apiKey = "AIzaSyACln4edhSZW30XcmYpqoMz_gcRCC1iFjY";

// Replace with real client registration IDs 
$registrationIDs = array( "APA91bEdf1w4dQtsUqPT1jHhWEpvrpxzB1yrpL3RVtKrVxfzxfg2-Yl-pwHorsnmSnkqywQ8G90YcGEBoqCjgQU8CnjA0N7mOWF8bHMhHAs4ty46PPTX8yh6eSaSqvU3JTMmb-P0ma90EBG0rsQQbUh3aX895KxitI3LCiGOYqRfE5pZQ");

// Message to be sent
$message = "this is a test";

// Set POST variables
$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'
                );

// Open connection
$ch = curl_init();

// Set the url, number of POST vars, POST data
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_POSTFIELDS, json_encode( $fields ) );

// Execute post
$result = curl_exec($ch);

// Close connection
curl_close($ch);

echo $result;
?>

我放了真实的身份证和钥匙,看看我做得对不对。有任何想法吗?

4

8 回答 8

8

几分钟前我遇到了同样的问题。

改变这个

$fields = array(
            'registration_ids'  => $registrationIDs,
            'data'              => array( "message" => $message ),
            );

对此:

$fields = array(
             'registration_ids'  => array($registrationIDs),
             'data'              => array( "message" => $message ),
             );
于 2014-11-03T03:45:58.360 回答
3

我发现了我的问题。我的 PHP 库从 post 或 get 变量中删除了一些字符。其中一个字符是“_”,因为它可以用作 SQL 注入。那是我的问题。固定的!

于 2013-12-16T23:17:16.520 回答
2

我遇到了同样的问题。我的问题是我的 gcm_regid。gcm_regid 的长度为 183 字节。但是我的数据库使用 150 个字节来存储这个值。当然存储的 gcm_regid 是不完整的。我通过增加密钥的存储大小解决了这个问题。然后问题就解决了。

于 2014-04-25T09:49:17.213 回答
1

您可以使用以下代码:

<?php

// API access key from Google API's Console
define( 'API_ACCESS_KEY', 'AIzaSyDiQ76wcVW2kcwIUQJasuym1JBXXXXX' );


$registrationIds = array( $_POST['id'] );

// prep the bundle
$msg = array
(
    'message'   => 'here is a message. message',
    'title'     => 'This is a title. title',
    'subtitle'  => 'This is a subtitle. subtitle',
    'tickerText'    => 'Ticker text here...Ticker text here...Ticker text here',
    'vibrate'   => 1,
    'sound'     => 1,
    'largeIcon' => 'large_icon',
    'smallIcon' => 'small_icon'
);

$fields = array
(
    'registration_ids'  => $registrationIds,
    'notification'          => $msg
);

$headers = array
(
    'Authorization: key=' . API_ACCESS_KEY,
    'Content-Type: application/json'
);

$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );

echo $result.$registrationIds[0];

您可以根据需要更改notificationdata

于 2018-02-10T01:46:56.257 回答
0

您确定您发送给 Google 的注册 ID 的值是正确的吗?

注册 ID 无效

检查您传递给服务器的注册 ID 的格式。确保它与手机在 com.google.android.c2dm.intent.REGISTRATION 意图中收到的注册 ID 匹配,并且您没有截断它或添加其他字符。当错误代码为 InvalidRegistration 时发生。

虽然我不知道有效注册 ID 的格式是什么,但我从未见过像您在注册 ID 中那样在两个破折号之间有 2 个字符部分的注册 ID ...2-Yl-p...:。

于 2013-07-31T15:30:00.723 回答
0

只需用此替换代码即可。确保将YOUR_REGISTRATION_IDYOUR_MESSAGEYOUR_API_KEYREGISTRATION_IDS其他评论替换为原始评论。

<?php
$regId=YOUR_REGISTRATION_ID;
$msg=YOU_MESSAGE;
$message = array("message" => $msg);
$regArray[]=REGISTRATION_IDS;
$url = 'https://android.googleapis.com/gcm/send';

$fields = array('registration_ids' => $regArray, 'data' => $message,);
$headers = array( 'Authorization: key=YOUR_API_KEY','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_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

$result=curl_exec($ch);
echo $result; 
if($result==FALSE)
{
    die('Curl Failed');
}
curl_close($ch);
}
?>
于 2013-07-31T11:43:29.680 回答
0

向其发布数组数据..

前任 :

$registatoin_ids = array($regId);
$message = array(
            "msg_category"      => "cat001",
            "msg_identifier"    => "msg01",
            "user_id"           => "1234",
            "title"             => $title,
            );

然后调用函数..

$result = $gcm->send_notification($registatoin_ids, $message);

public function send_notification($registatoin_ids, $message) {
    // include config
    include_once './config.php';

    // Set POST variables
    $url = 'https://android.googleapis.com/gcm/send';

    $fields = array(
        'registration_ids' => $registatoin_ids,
        'data' => $message,
    );

    $headers = array(
        'Authorization: key=' . GOOGLE_API_KEY,
        'Content-Type: application/json'
    );
    // Open connection
    $ch = curl_init();

    // Set the url, number of POST vars, POST data
    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);   

    // Disabling SSL Certificate support temporarly
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

    // Execute post
    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }

    // Close connection
    curl_close($ch);
    echo $result;
}
于 2016-02-02T08:34:45.430 回答
0

类似的问题,最后是收到了错误的注册 ID(令牌)。

我添加了以下行

echo "id=[$id]";

到 PHP 代码以验证 ID 是否与 logcat 中打印的令牌完全相同,并使用上面的 echo 行发现在 id 的开头和结尾添加了一个空格。一旦我删除了空格,消息就没有错误地发送出去。

于 2016-05-31T17:22:55.703 回答