PHP:将数组传递给函数时GCM无效注册

Posted

技术标签:

【中文标题】PHP:将数组传递给函数时GCM无效注册【英文标题】:PHP: GCM Invalid Registration when passing array to function 【发布时间】:2016-02-17 03:01:05 【问题描述】:

我为谷歌云消息设置设置的 php 代码遇到了一个非常奇怪的问题。

目前我有以下功能来发送推送通知:

function sendPushNotification($user_token_list, $message)

    global $gcm_api_key, $errors;
    $data = array('message' => $message);
    $url = 'https://android.googleapis.com/gcm/send';
    $post_data = array (
        "registration_ids" => $user_token_list,
        "data"             => array("message" => $message)
        );
    $header = array (
        'Authorization: key='.$gcm_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, $header);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));

    $result = curl_exec($ch);
    if (curl_errno($ch)) $errors[] = array('PUSH_NOTIFICATION_FAILURE' => curl_error($ch));
    curl_close($ch);
    echo $result;

$message是要包含在下游的消息,$user_token_list是数组类型,其元素包含有效的注册ID。

我用来构造$user_token_list数组的函数如下:

function getDeviceTokensFromUserList($recipients, $website)

    $token_list = array();
    for ($i = 0; $i < count($recipients); ++$i)
    
        $token_list[] = getDeviceTokenFromUserid($recipients[$i], $website);
    
    return $token_list;

但是,在发送下游请求时,我收到错误:

无效注册

但是,当我在 $user_token_list 上执行 var_dump 时,它会给我一个注册 ID

duICFkjL5I4:APA91bF_asp9iDmNvMWUX58nPU8bj8kWua8ISiAoUw0KvYai5n37yp-qRlQrl2jPhTPY-a8KMq-XXXXXXXXX

如果我将注册 ID 硬编码到 sendPushNotification 函数中,它不会给我一个错误 即

$post_data = array (
        "registration_ids" => array("duICFkjL5I4:APA91bF_asp9iDmNvMWUX58nPU8bj8kWua8ISiAoUw0KvYai5n37yp-qRlQrl2jPhTPY-a8KMq-XXXXXXXXX"),
        "data"             => array("message" => $message)
        );

表示注册id有效,并在gcm上注册。

有什么想法吗?

【问题讨论】:

你能确定key的长度和你需要的一样吗?确保没有空格等... 只是为了确定,如果$user_token_list 真的是一个数组,var_dump 将输出它的数组结构,而不仅仅是你显示的字符串值。 是的,var_dump 输出数组结构...字符串长度完全相同.. 【参考方案1】:

根据 Android GCM 的架构概述,您在以下情况下会遇到 invalidRegistration 错误:

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

已检查接收下游消息的部分:https://developers.google.com/cloud-messaging/

这是一个相关的堆栈溢出票:How to parse GCM respond to remove invalid registration id from server with php

【讨论】:

以上是关于PHP:将数组传递给函数时GCM无效注册的主要内容,如果未能解决你的问题,请参考以下文章

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

将数组传递给 Web 服务 php nusoap

使用无效注册 ID 时 GCM 返回 BAD 请求

什么是 GCM 注册 ID?

Firebase 云消息传递 php 脚本返回无效注册

使所有 gcm 令牌无效