GoogleCloudMessaging PHP скрипт всегда возвращает неверную регистрацию

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

Я написал клиенту GCM для регистрации моего устройства для приема сообщений с моего сервера. Он работает, и я могу сохранить идентификатор регистрации в моей базе данных.

Моя проблема на стороне сервера. Я использую script, где-то найти googling, но всегда получаю результат ошибки:

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

PHP-код (я использую API BROWSER вместо API SERVER, как сказано в учебнике, но попытка обоих ключей возвращает одно и то же сообщение):

<?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;
?>

Я положил настоящие идентификаторы и ключ, чтобы увидеть, правильно ли я поступаю. Любые идеи?

Ответ 1

У меня была такая же проблема пару минут назад.

Измените это

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

:

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

Ответ 2

Я нашел свою проблему. Моя библиотека PHP удаляла некоторые символы из сообщения или получала переменные. И один из этих символов - "_", потому что он может использоваться как SQL-инъекция. Это была моя проблема. Фиксированный!

Ответ 3

У меня такая же проблема. Моя проблема была в моем gcm_regid. Длина gcm_regid составляет 183 байта. Однако моя база данных использует 150 байтов для хранения этого значения. Конечно, сохраненный gcm_regid является неполным. Я исправил проблему, увеличив размер хранилища для ключа. Тогда проблема решена.

Ответ 4

Просто замените код на это, и он будет работать. убедитесь, что вы заменили YOUR_REGISTRATION_ID, YOUR_MESSAGE, YOUR_API_KEY, REGISTRATION_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);
}
?>

Ответ 5

Вы уверены, что значение идентификатора регистрации, отправляемого в Google, является правильным?

Недействительный идентификатор регистрации

Проверьте форматирование идентификатора регистрации, который вы передаете серверу. Убедитесь, что он соответствует идентификатору регистрации, который получает телефон, в намерении com.google.android.c2dm.intent.REGISTRATION и что вы не усекаете его или не добавляете дополнительные символы.     Случается, когда код ошибки является InvalidRegistration.

Пока я не знаю, какой формат действительного регистрационного идентификатора, я никогда не видел идентификатор регистрации с разделом из двух символов между двумя тире, как у вашего регистрационного идентификатора: ...2-Yl-p....

Ответ 6

Поместите данные массива в него.

ex:

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

Ответ 7

Аналогичная проблема, и в конце это был плохой идентификатор регистрации (токен).

Я добавил следующую строку

echo "id=[$id]";

к PHP-коду, чтобы убедиться, что идентификатор точно совпадает с маркером, напечатанным в logcat, и обнаружил, используя указанную выше эхо-строку, что в начале и в конце идентификатора было добавлено пространство. Как только я удалил пробелы, сообщение было отправлено без ошибок.

Ответ 8

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

<?php

// API access key from Google API 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];

Вы можете изменить notification на data, как вы пожелаете.

Ответ 9

Эта ошибка возникает только , когда токен вашего устройства неверен. Я изучаю это, и это окончательное решение. Ваш код выглядит отлично. Измените токен вашего устройства, на который отправляется уведомление. Убедитесь, что ваш токен устройства прав.