WordPress中Firebase FCM推送:发送者无法收到自身推送通知
问题排查思路及解决方案
首先明确:FCM本身没有默认禁止用户接收自身推送的规则,这个问题大概率是WordPress生产环境的差异导致的,以下是具体排查方向:
1. 检查WordPress插件或主题的拦截/修改
- 排查安全类、缓存类或推送相关插件,部分插件可能为了避免冗余,在请求发送前过滤了
registration_ids数组,移除了当前登录用户的token。本地环境可能未安装该插件或未开启对应功能,所以无异常。 - 临时禁用所有非必要插件,切换到WordPress默认主题(如Twenty Twenty-Four),测试是否能收到推送,逐步定位问题插件。
2. 对比本地与生产环境的cURL请求参数
- 在生产环境的PHP代码中,打印发送给FCM的完整请求数据,和本地环境的请求做对比,确认发送者的token确实被包含在
registration_ids数组里,没有被篡改。 - 示例打印代码(添加在cURL执行前):
查看服务器日志,确认发送者token存在且格式正确。// 打印请求数据到服务器日志 error_log('FCM Request Data: ' . json_encode([ 'registration_ids' => $registration_ids, 'notification' => $notification_payload ]));
3. 验证生产环境中发送者token的有效性
- 单独用发送者的token做一次单设备推送测试,看是否能收到。如果单推也失败,说明该token在生产环境下可能已失效(比如设备卸载重装、APP更新导致token变更,但WordPress数据库里的token未同步更新)。
- 查看FCM返回的响应
results字段,是否有针对该token的错误信息(如InvalidRegistration),以此判断token状态。
4. 检查PHP环境配置差异
- 本地和生产环境的PHP版本、cURL扩展版本可能存在差异,部分旧版本cURL在处理数组时可能存在隐性问题,导致发送者token被忽略。
- 确认生产环境的cURL配置,比如是否开启
CURLOPT_SSL_VERIFYPEER(建议开启,但需确保SSL证书配置正确),是否有代理、防火墙拦截了请求内容。
5. 排查应用端的特殊逻辑
- 检查APP端是否有针对生产环境的特殊判断:比如如果通知的发送者ID等于当前用户ID,就不展示通知。本地环境可能用的是测试ID,未触发该逻辑,而生产环境用真实ID触发了规则。
内容的提问来源于stack exchange,提问作者Jorge Junior
相关产品推荐
相关产品推荐

