当前位置: 首页 > 知识库问答 >
问题:

为firebase云消息传递PHP生成OAUTH令牌

彭烨熠
2023-03-14

我有一个PHP页面,我用它向我开发的移动应用程序的用户发送通知,这个页面在上个月之前工作正常,然后它给了我这个错误

{“多播id”:5174063503598899354,“成功”:0,“失败”:1,“规范id”:0,“结果”:[{“错误”:“无效注册”}]}

我试图使用此链接中的留档生成OAUTH令牌https://firebase.google.com/docs/cloud-messaging/auth-server#node.js但它需要NODE. JS服务器,而我的服务器不支持Node。Js,我试图使用Firebase管理员SDK,但找不到任何东西。这里是页面的PHP代码

<?php

//Includes the file that contains your project's unique server key from the Firebase Console.
require_once("serverKeyInfo.php");

//Sets the serverKey variable to the googleServerKey variable in the serverKeyInfo.php script.
$serverKey = $googleServerKey;

//URL that we will send our message to for it to be processed by Firebase.
    $url = "https://fcm.googleapis.com/fcm/send";

//Recipient of the message. This can be a device token (to send to an individual device) 
//or a topic (to be sent to all devices subscribed to the specified topic).
$recipient = $_POST['rec'];

//Structure of our notification that will be displayed on the user's screen if the app is in the background.
$notification =array(
    'title'   => $_POST['title'],
    'body'   => $_POST['body'],
    'sound' => 'default'
);

//Structure of the data that will be sent with the message but not visible to the user.
//We can however use Unity to access this data.
$dataPayload =array( 

    "powerLevel" => "9001",
    "dataString" => "This is some string data"
);

//Full structure of message inculding target device(s), notification, and data.
$fields =array(

    'to'  => $recipient,
    'notification' => $notification,
    'data' => $dataPayload
);

//Set the appropriate headers
$headers = array(

'Authorization: key=' . $serverKey,
'Content-Type: application/json'
);
//Send the message using cURL.
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, $url);
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );

//Result is printed to screen.
echo $result;
?>

有人能给我一个例子吗?我怎么能做到这一点(我是PHP初学者)提前谢谢

*更新:我还尝试将代码中的$url更改为

$url = "https://fcm.googleapis.com/v1/projects/notifications-9ccdd/messages:send";

但它给了我这个错误

"错误":{"代码": 401,"消息":"请求的身份验证凭据无效。期望OAuth 2访问令牌、登录cookie或其他有效的身份验证凭据。见https://developers.google.com/identity/sign-in/web/devconsole-project.","状态":"未经验证"}Blockquest

共有1个答案

卢知
2023-03-14

对于仍在寻找答案(2021年)的任何人来说,为了通过自己的PHP系统向Firebase消息系统发送推送消息,您需要来自Google凭据的访问令牌。下面是如何做到这一点-请注意,我只在PHP Laravel中这样做,而不是原始的PHP。但是你应该能够通过修改步骤来找到香草PHP解决方案(同样适用于代码点火器和其他PHP库)

>

安装谷歌API客户端。对于Laravel,这是:

  composer require google/apiclient --with-all-dependencies

打开composer.json,并添加到自动加载数组中。对于Laravel,这是:

 "classmap": [
     "vendor/google/apiclient/src/Google"
 ],

创建一个新的服务类(如果是PHP,则创建一个新类),并添加以下检索访问令牌的方法:

private function getGoogleAccessToken(){

     $credentialsFilePath = 'the-folder-and-filename-of-your-downloaded-service-account-file.json'; //replace this with your actual path and file name
     $client = new \Google_Client();
     $client->setAuthConfig($credentialsFilePath);
     $client->addScope('https://www.googleapis.com/auth/firebase.messaging');
     $client->refreshTokenWithAssertion();
     $token = $client->getAccessToken();
     return $token['access_token'];
}

现在创建一个方法,通过CURL将所有消息信息发送到Firebase:

public function sendMessage(){

 $apiurl = 'https://fcm.googleapis.com/v1/projects/your-project-id/messages:send';   //replace "your-project-id" with...your project ID

 $headers = [
         'Authorization: Bearer ' . $this->getGoogleAccessToken(),
         'Content-Type: application/json'
 ];

 $notification_tray = [
         'title'             => "Some title",
         'body'              => "Some content",
     ];

 $in_app_module = [
         "title"          => "Some data title (optional)",
         "body"           => "Some data body (optional)",
     ];
 //The $in_app_module array above can be empty - I use this to send variables in to my app when it is opened, so the user sees a popup module with the message additional to the generic task tray notification.

  $message = [
        'message' => [
             'notification'     => $notification_tray,
             'data'             => $in_app_module,
         ],
  ];

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $apiurl);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($message));

  $result = curl_exec($ch);

  if ($result === FALSE) {
      //Failed
      die('Curl failed: ' . curl_error($ch));
  }

  curl_close($ch);

}

谷歌建议,只有在无法将JSON文件作为环境变量直接添加到服务器上时,才使用此方法。我不知道谷歌为什么没有更好的PHP文档,它似乎更喜欢node.js、Go、Java和C。

 类似资料:
  • 是否有任何API(Python、JS、...)可用于生成和检索Firebase云消息传递服务器令牌? 最终目标应与单击“项目设置”中的“添加服务器密钥”按钮相同。

  • 我必须在SpringJava中为多层架构制作一个RESTAPI,其中需要为Firebase云消息传递(FCM)构建DAO、控制器和服务管理器,以向android应用程序发送推送通知消息,但我无法在Java中配置服务器以向设备发送通知。我怎么能?

  • 在我们的应用程序中,我们使用Firebase云消息向用户发送推送通知。我们将用户的注册令牌保存在SQL数据库中,当用户登录或注销时,我们使用Firebase API管理其主题订阅。 这在大多数情况下都很有效,但现在主题订阅会为我们的一些注册令牌返回以下错误: 未注册提供的注册令牌。由于各种原因,可以注销以前有效的注册令牌。有关更多详细信息,请参阅错误文档。删除此注册令牌并停止使用它发送消息 在哪些

  • FCM服务未向我的iOS应用程序发送消息。 > App CAN成功接收APNs令牌和实例ID令牌 App CAN使用推送通知实用程序利用. p8令牌在后台成功接收来自APN的推送 #2中使用的相同APNs密钥上传到Firebase控制台 应用程序无法接收Firebase控制台中Notification Composer发送的消息,也无法使用CURL请求接收消息。 应用程序在通过FCM发送时不显示任

  • 我正试图将FCM与SNS整合。我在这个答案中读到设置应该与GCM相同。我设法创建了一个FCM应用程序,可以向android设备发送消息。当应用程序在后台时,设备在托盘中接收通知,或当应用程序在前台时打印接收的消息。我正试图整合它现在到SNS,但我似乎不能使它工作,没有任何错误信息。

  • 我试图从C#中的服务器发送推送通知,我使用了正确的注册令牌和API密钥,但仍然得到以下响应。 我按照这个网址来实现这个解决方案通过C#使用FCM(Firebase云消息传递)发送推送到Android 目前,我正在尝试向单个设备发送通知,但也希望同时向多个设备发送通知,我使用了url中给出的,但它不起作用。如果我必须同时向多个设备发送通知,我该怎么办? 这是我的密码