You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌更新后,如何用Kreait FCM工具包生成浏览器设备令牌?

解决Kreait FCM浏览器设备令牌生成问题

你当前的代码存在核心误解:Kreait Firebase PHP SDK是服务端工具,它无法直接生成浏览器的设备令牌——浏览器令牌必须在前端通过Firebase Web SDK获取,再传递到后端存储和使用。Bard生成的代码里$messaging->getToken()方法并不存在,这是导致代码无法运行的直接原因。

正确的实现流程

  1. 前端(浏览器)获取设备令牌
    使用Firebase Web SDK在用户浏览器中生成FCM令牌,代码示例:

    // 初始化Firebase(替换为你的项目配置)
    const firebaseConfig = {
      apiKey: "YOUR_API_KEY",
      authDomain: "YOUR_AUTH_DOMAIN",
      projectId: "YOUR_PROJECT_ID",
      storageBucket: "YOUR_STORAGE_BUCKET",
      messagingSenderId: "YOUR_SENDER_ID",
      appId: "YOUR_APP_ID"
    };
    
    firebase.initializeApp(firebaseConfig);
    const messaging = firebase.messaging();
    
    // 请求通知权限并获取令牌
    async function getFCMToken() {
      try {
        const permission = await Notification.requestPermission();
        if (permission === "granted") {
          const token = await messaging.getToken({ vapidKey: "YOUR_VAPID_KEY" });
          // 将令牌发送到后端存储(比如通过AJAX/API)
          console.log("FCM令牌:", token);
          // 示例:发送到后端
          await fetch('/save-token.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ token: token })
          });
        }
      } catch (error) {
        console.error("获取令牌失败:", error);
      }
    }
    
    // 调用函数
    getFCMToken();
    

    注意:VAPID密钥需要在Firebase控制台的「云消息传递」>「Web配置」中生成。

  2. 后端(PHP)存储令牌并发送通知
    后端接收前端传来的令牌并存储(比如数据库),之后使用Kreait SDK发送推送通知,代码示例:

    require __DIR__ . '/vendor/autoload.php';
    use Kreait\Firebase\Factory;
    use Kreait\Firebase\Messaging\CloudMessage;
    
    // 初始化Firebase工厂
    $factory = (new Factory)->withServiceAccount('service-account-file.json');
    $messaging = $factory->createMessaging();
    
    // 从数据库或请求中获取存储的设备令牌
    $deviceToken = "USER_BROWSER_TOKEN_FROM_DATABASE";
    
    // 创建并发送消息
    try {
      $message = CloudMessage::withTarget('token', $deviceToken)
        ->withNotification([
          'title' => '测试通知',
          'body' => '这是一条来自Kreait FCM的推送通知'
        ]);
    
      $messaging->send($message);
      echo "通知发送成功";
    } catch (\Exception $e) {
      echo "发送失败: " . $e->getMessage();
    }
    

关键说明

  • 浏览器令牌是与用户浏览器实例绑定的,每个用户的每个浏览器都会生成唯一令牌,必须由前端主动获取。
  • 后端的Kreait SDK仅负责发送通知,不具备生成客户端令牌的能力。

内容的提问来源于stack exchange,提问作者gaurav sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:57:19