PHP不依赖外部库实现Web推送遇400 UnauthorizedRegistration错误求助
无需外部库的PHP推送通知实现方案
当然可以!不用依赖任何第三方库,咱们直接用PHP自带的cURL就能实现逐个发送推送通知。先帮你解决眼前的400 UnauthorizedRegistration错误,再给你贴极简的实现代码。
先搞定400 UnauthorizedRegistration错误
这个错误本质是推送服务(比如FCM、APNs)不认你的设备令牌(registration token),常见原因有这些:
- 令牌已经过期、被用户设备撤销,或者格式完全不对
- 你用的服务器密钥和生成令牌的环境不匹配(比如用生产环境的密钥发开发环境生成的令牌)
- 用户已经卸载了对应的APP,或者关闭了推送权限
最直接的排查方式:用推送服务官方的测试工具(比如FCM的控制台测试功能),输入你的令牌和服务器密钥,看看能不能成功发送。如果工具里也报错,那肯定是令牌或密钥的问题。
无外部库的PHP代码示例(以FCM为例)
假设你用的是Firebase Cloud Messaging(目前最常用的推送服务之一),下面是完全原生的实现,不需要装任何包:
<?php // 替换成你从Firebase控制台拿到的服务器密钥 $fcmServerKey = '你的FCM服务器密钥'; // 单个用户的设备推送令牌 $deviceToken = '用户设备返回的推送令牌'; // 构建推送内容 $notificationContent = [ 'title' => '你有新消息', 'body' => '这是一条原生PHP发送的推送通知', 'sound' => 'default' // 可选,触发默认提示音 ]; // 组装请求Payload $requestPayload = json_encode([ 'to' => $deviceToken, 'notification' => $notificationContent, 'data' => [ // 可选:自定义业务数据,客户端可以解析 'order_id' => '12345', 'type' => 'order_update' ] ]); // 初始化cURL请求 $curl = curl_init('https://fcm.googleapis.com/fcm/send'); // 设置cURL参数 curl_setopt_array($curl, [ CURLOPT_HTTPHEADER => [ 'Authorization: key=' . $fcmServerKey, 'Content-Type: application/json' ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $requestPayload ]); // 执行请求并获取结果 $response = curl_exec($curl); $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); // 关闭cURL资源 curl_close($curl); // 处理响应 if ($httpStatus === 200) { echo "推送成功!详细响应:{$response}"; } else { echo "推送失败!状态码:{$httpStatus},响应内容:{$response}"; } ?>
关键注意点
- 服务器密钥要选对:去Firebase控制台的「项目设置」→「云消息传递」里拿服务器密钥,别拿成Web API密钥,后者权限不够
- 如果是APNs(苹果推送),逻辑类似但配置不同:需要用苹果的P12证书做身份验证,请求URL是
https://api.push.apple.com/3/device/你的设备令牌,请求头要包含apns-topic(APP的Bundle ID),这些也可以用cURL原生实现,不需要外部库 - 调试时一定要看完整响应:推送服务返回的错误信息会告诉你具体哪里错了,比如
"error": "NotRegistered"就说明令牌已经失效,需要客户端重新获取
内容的提问来源于stack exchange,提问作者Thor Lancaster
相关产品推荐
相关产品推荐

