使用firebase/token-php生成Token后FCM报InvalidRegistration错误求助
排查FCM "InvalidRegistration" 错误的步骤
首先明确:InvalidRegistration错误仅与你传入的设备注册Token(代码中的$firebaseId)相关,和你生成的服务端JWT无关(你已经确认后端能正常发送FCM消息,说明FCM_SERVER_KEY是有效的)。以下是具体排查点:
1. 验证$firebaseId的有效性
- 确认
$firebaseId是客户端通过Firebase SDK正确获取的设备Token:- Android端:需调用
FirebaseMessaging.getInstance().getToken()获取 - iOS端:需调用
Messaging.messaging().token(completion:)获取 - Web端:需调用
messaging.getToken({ vapidKey: 'YOUR_VAPID_KEY' })获取
- Android端:需调用
- 检查Token是否已失效:设备卸载重装、恢复出厂设置、Token超过6个月未使用,都会被FCM标记为无效。可以用新生成的测试Token替换
$firebaseId重试。
2. 检查$firebaseId的格式
- 有效设备Token是长度约150-200的字符串,仅包含字母、数字、
-和_,无空格、换行或其他特殊字符。 - 打印
$firebaseId的值,确认是否存在截断、空格或格式错误(比如从数据库读取时是否被转义)。
3. 确认环境匹配
- 你的服务账号属于
nkikku项目,但aud字段写的是nnchat-qa,虽然这不影响当前错误,但需确保:- FCM_SERVER_KEY对应的项目,和生成
$firebaseId的App项目完全一致(不能用生产环境Key发送到测试环境设备,反之亦然)。
- FCM_SERVER_KEY对应的项目,和生成
4. 检查FCM请求字段的正确性
- 打印
json_encode($fields)的结果,确认registration_ids字段名是否正确(FCM要求复数形式,若你的KeyFirebaseValue::KEY_REGISTRATION_IDS定义为单数registration_id,会导致FCM无法识别目标Token)。 - 确认
$firebaseId不为空或null:若数组中传入空值,FCM会返回InvalidRegistration。
5. 额外验证:单独测试Token有效性
用一个已知有效的测试Token替换$firebaseId,运行你的发送代码。如果成功,说明原$firebaseId确实无效;如果仍然报错,检查请求头或字段是否有其他错误(比如Content-Type是否正确设置为application/json)。
内容的提问来源于stack exchange,提问作者Daniel Mera
相关产品推荐
相关产品推荐

