真的很奇怪,从来没有人问过这个问题。
我的服务器密钥作为我的授权密钥(服务器密钥)出现错误MismatchSenderId
。 另一方面,如果我的设备令牌作为我的授权密钥,但我的设备上没有收到通知,那么我的 push_notification() 的返回结果就会成功。
我确定我的令牌是正确的,因为我可以在 Firebase(单设备)控制台中使用令牌发送到单个设备。
这让我想到了另一个问题,但我想在转到通知部分之前确认这个问题
实际上我很迷茫,因为所有MismatchSenderId
错误都已通过替换为正确的服务器密钥来解决。
<?php
require "dbconfig.php";
$sql = "SELECT token FROM tokendb";
$result = mysql_query($sql) or die($sql."<br/><br/>".mysql_error());
$tokens = array();
while($row = mysql_fetch_assoc($result))
{
echo $row['token']; //this shows the same token compared to the token show in logcat(visual studio)
$tokens[] = $row["token"];
echo '<form id="form1" name="form1" method="post" action="">'.
'<p>From<br>'.
'<input type="text" size="100" maxlength="100" name="From" id="From" /><br>'.
'<p>Title<br>'.
'<input type="text" size="100" maxlength="100" name="Title" id="Title" />'.
'<br>'.
'<input type="submit" name="Send" id="Send" value="Send" />'.
'</form>';
}
$message = array("message" => "notification test");
$message_status = sendFCMMessage($message, $tokens);
echo $message_status;
function sendFCMMessage($message,$target){
//FCM API end-point
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array();
$fields['body'] = $message;
if(is_array($target)){
$fields['registration_ids'] = $target;
}else{
$fields['to'] = $target;
}
//header with content_type api key
$headers = array(
'Content-Type:application/json',
'Authorization:key=********'
);
//CURL request to route notification to FCM connection server (provided by Google)
$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_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('Oops! FCM Send Error: ' . curl_error($ch));
}
curl_close($ch);
return $result;
}
?>
编辑:这个简短的php代码也给了我MismatchSenderId
错误
<?php
$ch = curl_init("https://fcm.googleapis.com/fcm/send");
$header=array('Content-Type: application/json',
"Authorization: key=***(serverkey from project)");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{ "notification": { "title": "Test desde curl", "text": "Otra prueba" }, "to" : "my device's token"}");
curl_exec($ch);
curl_close($ch);
?>
更新
卸载并重新安装应用程序解决了该问题。
尝试发送到与其他发件人(项目)关联的注册令牌时遇到MismatchSenderId
错误。从文档中:
注册令牌绑定到特定的一组发件人。当客户端应用注册 FCM 时,它必须指定允许哪些发件人发送消息。向客户端应用发送消息时,应使用这些发件人 ID 之一。如果切换到其他发件人,则现有注册令牌将不起作用。
确保您使用的服务器密钥来自与注册令牌关联的同一发件人项目。为此,您可以检查 google-services.json 文件,看看其中的发件人 ID 是否与您用于发送邮件的 Firebase 项目中可见的发件人 ID匹配。
对于没有收到消息的问题,您的代码发送的有效负载结构是什么有点不清楚。尝试检查它是否是具有notification
和/或data
消息负载的构造正确的消息负载。
让你从正确的地方获取服务器密钥 现在,从Firebase获取通知的服务器密钥有点棘手。
以下是步骤:
转到控制台 ->项目 ->项目设置 ->云消息传递(第二个选项卡)
并从他们的服务器密钥和发件人 ID 中获取您的服务器密钥和发件人 ID,这将为您工作。
卸载该应用程序并重新安装并尝试。