Firebase FCM报InvalidRegistration错误,求排查(附PHP代码)
FCM推送出现InvalidRegistration错误的排查与修复
错误返回信息
{"multicast_id":2590279481594016535,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
代码中的核心问题
无效的设备令牌生成
你用Str::random(60)生成的是随机字符串,这完全不符合FCM设备令牌的要求。FCM的设备令牌是由客户端(iOS/Android/Web)向Firebase服务器注册后返回的唯一标识,后端不能随机生成。变量引用错误
代码中存储的是$deviceToken,但推送时使用的是未定义的$token变量,这会导致推送请求传递的是无效值(可能为null或未初始化的变量),直接触发InvalidRegistration错误。
修复步骤
获取真实的FCM设备令牌:从客户端获取Firebase返回的有效令牌,比如:
- Android端:调用
FirebaseMessaging.getToken() - iOS端:调用
Messaging.messaging().token(completion:) - Web端:调用
messaging.getToken({ vapidKey: 'YOUR_VAPID_KEY' })
将获取到的令牌传给后端,存储到用户的device_token字段。
- Android端:调用
修正变量引用:推送时直接使用用户记录中存储的有效令牌,比如
$token = $user->device_token;,确保data中的"to"字段是真实有效的FCM令牌。开启SSL验证:代码中
CURLOPT_SSL_VERIFYPEER设为false存在安全风险,建议改为true,确保请求的安全性。验证SERVER_KEY:确认你的SERVER_KEY是从Firebase控制台的「云消息传递」设置中获取的有效密钥,避免因密钥错误导致的间接问题。
修正后的代码示例
// 从客户端请求中获取真实的FCM设备令牌 $deviceToken = request()->input('fcm_token'); // 存储到用户记录 $user->forceFill([ 'device_token' => $deviceToken, ])->save(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: key=YOUR_VALID_SERVER_KEY', 'Content-Type: application/json' )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 使用用户存储的有效设备令牌 $token = $user->device_token; $data = array( "to" => $token, "notification" => array( "title" => '登录成功', "body" => '您已成功登录。', "sound" => 'default' ) ); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $result = curl_exec($ch); if ($result === FALSE) { die('Curl失败: ' . curl_error($ch)); } curl_close($ch);
内容的提问来源于stack exchange,提问作者Ronak Jain
相关产品推荐
相关产品推荐

