PHP中FCM发送消息时出现InvalidRegistration错误求助
解决FCM发送消息时的[InvalidRegistration]错误
嘿,我来帮你搞定这个FCM的错误!InvalidRegistration这个错误说白了就是你传给FCM的设备注册令牌(也就是代码里的$id)有问题,FCM认不出它。结合你给出的代码片段,我整理了几个最可能的原因和修复步骤:
首先检查是否漏了
to字段
看你的代码里,$fields数组好像没包含'to' => $id这个关键项!FCM必须知道要把消息发给哪个设备,所以这个字段是必不可少的。你得把设备令牌赋值给to字段,比如:$fields = array( 'data' => array("message" => $message), 'notification' => array( "body" => "这里填你的通知内容", "title" => "通知标题" ), 'to' => $id // 必须加上这个! );验证设备令牌的有效性
- 先确认
$id的值是不是正确的FCM令牌格式:通常是一串很长的字符串,类似APA91bFyOiLtJKim7FIKpW...这种。你可以在代码里加个调试输出看看:var_dump($id); // 调试时打印令牌,检查是否为空、格式错误 - 令牌过期、被撤销(比如用户卸载了应用)或者设备重置后都会失效,这种情况下你需要让客户端重新获取新的令牌并更新你的存储。
- 先确认
检查JSON格式是否完整
从你给出的代码片段看,notification的body后面好像没写完,这会导致JSON格式错误,也可能间接引发问题。确保$fields里的所有字段都是完整的,没有语法错误。验证Server Key的正确性
虽然错误是令牌相关,但也得确认你的GOOGLE_SERVER_KEY是从Firebase控制台的云消息服务里获取的服务器密钥,而不是Web API密钥或者其他类型的密钥,用错密钥也可能导致奇怪的错误。捕获响应并处理无效令牌
你可以在发送请求后解析FCM的响应,明确错误原因,还能处理无效令牌的清理工作:$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); curl_close($ch); // 解析响应查看详情 $response = json_decode($result, true); if (isset($response['results'][0]['error'])) { $error = $response['results'][0]['error']; if ($error === 'InvalidRegistration') { error_log("无效的FCM令牌:{$id}"); // 这里可以写逻辑从数据库中移除这个无效令牌 } }
内容的提问来源于stack exchange,提问作者Philip Yoon
相关产品推荐
相关产品推荐

