Codeigniter 4集成Firebase HTTP V1推送通知报SENDER_ID_MISMATCH错误的排查与解决
Codeigniter 4集成Firebase HTTP V1推送通知报SENDER_ID_MISMATCH错误的排查与解决
我之前也碰到过一模一样的问题,一开始也纳闷:明明代码里没用到Sender ID,JSON密钥里也找不到,怎么就报不匹配了呢?咱们一步步拆解问题,找到解决办法。
先搞懂SENDER_ID_MISMATCH的本质
这个错误的核心逻辑其实很简单:你的设备令牌(Device Token)是客户端用某一个Firebase项目的Sender ID生成的,但你现在服务端用的是另一个Firebase项目的凭证来发通知,两者不绑定,所以被拒绝了。虽然你代码里没直接写Sender ID,但Firebase的客户端和服务端是通过Sender ID隐式绑定的。
具体排查与解决步骤
1. 先确认设备令牌对应的Sender ID
Android客户端生成FCM令牌时,是和google-services.json里的project_number(这个就是Sender ID)绑定的。你要做:
- 打开客户端的
google-services.json,找到project_number字段,记下这个数值。 - 去Firebase控制台,看看这个
project_number属于哪个项目(每个项目的Sender ID是唯一的,在项目的「设置」->「云消息传递」里能看到)。
2. 核对服务端的Firebase项目信息
- 打开你服务端用的JSON密钥文件,找到
project_id字段,去Firebase控制台找到这个项目,查看它的「云消息发送者ID」(也就是Sender ID)。 - 对比这个Sender ID和客户端
project_number是不是完全一致?如果不一样,这就是问题根源! - 同时,你代码里的
PROJECT_ID_HERE必须和JSON密钥里的project_id完全一致,确保你请求的是正确项目的V1 API。
3. 修正配置不匹配的问题
如果发现客户端和服务端的项目Sender ID不匹配,有两种修正方式:
- 方案一:把客户端的
google-services.json换成服务端项目对应的文件,然后重新运行客户端,生成新的设备令牌,再用这个新令牌测试。 - 方案二:把服务端的JSON密钥换成客户端项目对应的密钥,同时修改代码里的
PROJECT_ID_HERE为该项目的ID,然后测试。
4. 额外的细节检查
- 有没有可能你在客户端用了多个Firebase实例?或者旧的
google-services.json没替换干净?建议彻底清理客户端的构建缓存,重新生成令牌。 - 你代码里的
trim($this->request->getPost('token'))这个处理很到位,避免了令牌带空格的问题,可以保留。 - 可以用Firebase控制台的「云消息传递」->「发送测试消息」功能,直接输入这个设备令牌测试:如果控制台也报错,那肯定是令牌和项目不匹配;如果控制台能发成功,再检查服务端代码的请求头和请求体有没有格式错误(你的请求体格式看起来是符合V1 API要求的)。
总结
最常见的原因就是客户端和服务端用了不同Firebase项目的配置,导致生成的令牌和发送凭证不绑定。只要把所有环节的配置统一到同一个Firebase项目,重新生成令牌再测试,就能解决这个SENDER_ID_MISMATCH的问题啦!
备注:内容来源于stack exchange,提问作者Ganesh Gadge
相关产品推荐
相关产品推荐

