始终从 GCM 中的 php(服务器端)获取无效注册

Always get the invalid registration from the php (server side) in GCM

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

我的 GCM 编程总是 return 这件事。 我已在 android 清单中正确输入项目 ID。 我已经为连接 API 提供了正确的 google API。 这是我的 php 代码。 我已将 api_key 存储在另一个文件中,并将其包含在其中。 谁能告诉我为什么会出现此错误。

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

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

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

    $cn = curl_init();


    curl_setopt($cn, CURLOPT_URL, $url);

    curl_setopt($cn, CURLOPT_POST, true);
    curl_setopt($cn, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($cn, CURLOPT_RETURNTRANSFER, true);


    curl_setopt($cn, CURLOPT_SSL_VERIFYPEER, false);

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


    $result = curl_exec($cn);
    if ($result === FALSE) {
        die('connection failed: ' . curl_error($cn));
    }


    curl_close($cn);
    echo $result;

"InvalidRegistration"表示您发送的Registration id没有被注册。正确检查 API 密钥和注册 ID。

您是否在文件中为 API_KEY 定义了值? 请参阅下面的 php 文件。这对我有用。

<?php
    //Generic php function to send GCM push notification
   function sendMessageThroughGCM($registatoin_ids, $message) {
        //Google cloud messaging GCM-API url
        $url = 'https://android.googleapis.com/gcm/send';
        $fields = array(
            'registration_ids' => $registatoin_ids,
            'data' => $message,
        );
        // Update your Google Cloud Messaging API Key
        define("GOOGLE_API_KEY", "API_SERVER_KEY");         
        $headers = array(
            'Authorization: key=' . GOOGLE_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_VERIFYHOST, 0);   
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
        $result = curl_exec($ch);               
        if ($result === FALSE) {
            die('Curl failed: ' . curl_error($ch));
        }
        curl_close($ch);
        echo $result;
    }
?>

在此行中定义您的 API_SERVER_KEY。

define("GOOGLE_API_KEY", "API_SERVER_KEY");

参考这个网站:http://programmerguru.com/android-tutorial/how-to-send-push-notifications-using-gcm-service/

注册ID(通过$registatoinids传入)无效时返回InvalidRegistration-error,这个错误基本上与你的PHP-code或API-Key无关.

只需检查您尝试向其发送通知的设备的注册 ID,并在调用时传递(新)ID

'registration_ids' => $registatoinids

如果您的设备没有任何reg-id,只需重新注册。 请参考this section of the documentation.

  • 首先,您应该使用 Firebase 控制台检查已删除尾随空格的注册令牌是否有效。如果向特定设备发送消息没有问题。

  • 然后您应该检查用于在您的 database.In 中存储注册令牌的字段的大小 我的情况发生了什么 我使用 phpMyAdmin,它使用 MySQL/MariaDb database.And 我已经为 varchar 指定了 80 的长度,这导致将注册令牌截断为 80 的长度。因此,它变成了无效的。这就是我收到 'InvalidRegistration' 错误的原因。所以我将长度更改为 200,我认为这已经足够了。希望对你有帮助。