FCM 得到错误匹配 SenderId

我有一个应用程序,使用谷歌 FCM 发送推送通知。

当我向一组用户发送一个推送通知时,我会得到其中一些用户的 MismatchSenderId响应。尽管如此,所有用户都有完全相同的应用程序。如何使一些用户获得成功响应,而另一些用户获得 Mismatch SenderId?

我已经研究了很多,并确保我已经添加了所有 FCM 需要的先决条件。

有什么建议吗?

编辑:

Sample response:

{"multicast_id":5340432438815499122,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}

编辑2:

下面是服务器端发送代码(PHP) :

$fields = array
(
'to' => $token,
'data' => $data
);


$headers = array
(
'Authorization: key=AIza**************************',
'Content-Type: application/json'
);


$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, true );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode($fields) );
curl_exec( $ch );
curl_close( $ch );

更新:

这个问题似乎已经通过 SDK 更新得到了解决。我现在使用最新的 com.google.firebase:firebase-messaging:9.6.1,我不会得到“错配发件人 ID”了。

191900 次浏览

I had the same problem, and I fixed it like this:

  1. 转到你的谷歌 fcm 控制台
  2. 选择你的应用程序
  3. 在左侧菜单中找到设置图标(标准轮)
  4. 点击它,然后点击项目设置
  5. 现在复制服务器密钥并粘贴到 php 中

瞧。

Make sure you remove all the Parse code from your app (libraries, receivers in AndroidManifest, etc). I found that intermittently push notifications were not working. From my observations, it would work on fresh installs but not app updates from the play store.

我相信 Parse 内部的一些东西与 FCM 是冲突的(Parse 使用 GCM,所以我猜测它必须同时使用 GCM 和 FCM)。我删除了所有的 Parse 接收器和库之后,一切都很顺利。

我也得到了同样的错误。我已经复制了 api _ key,并更改为 google _ services。Json.在那之后,它为我工作

"api_key": [
{
"current_key": "********************"
}
],

try this

我发现 senderId与 FCM 控制台中的项目编号不同
所以我重新下载了 google-services. json,一切正常

我找到了解决办法:

  • 首先我检查服务器密钥是否正确 像 AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • 然后我检查发件人身份证像79XXXXXXXX 它也是正确的。
  • 主要问题是在 device_ID(UDID),我必须向谁发送通知。实际上,我们在 FCM中得到的 DeviceId 在机器人端与 GCM是不同的。在 FCM中不能使用 GCM创建的 DeviceId

Firebase 已经将他们的服务器密钥升级到了新版本。 用新钥匙代替旧钥匙。

转到设置-> 项目设置-> 云消息标签

enter image description here

检查 Manifs.json 中的 Gcm _ sender _ id If mismatch - correct, but you need make new subscribers for new sender Id. Exists subscribers break.

升级 Firebase 初始化对我有用。

<script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js"></script>
<script>
// Initialize Firebase
// TODO: Replace with your project's customized code snippet
var config = {
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
storageBucket: "<BUCKET>.appspot.com",
messagingSenderId: "<SENDER_ID>",
};
firebase.initializeApp(config);
</script>

根据响应“ Mismatch SenderId”,这是 FireBase 和您的本地“ google-services”之间的不匹配。你必须确保两份清单都匹配

在 FireBase 控制台中,你可以进入“ YourProject > Project OverView > Cloud Messaging”,你会看到“ SenderID”,它必须与“ google-services”匹配。“ json”在您的 Android 项目中。

您所能做的最好的事情就是从“ General”选项卡下载最终的 json 文件并将其放置在您的项目中。

对我来说,问题是我正在使用的 phonegap-plugin-push在科尔多瓦,测试应用程序与电话缺口应用程序。

这个插件的问题在于,由于某种原因,phone egap 应用程序拦截它并返回一个虚拟的注册密钥,无论您有什么样的发件人 ID。

所以要让它正常工作(只要你所有的关键字都正确) ,就要用其他方法来测试你的程序,使用模拟器,或者通过 usb 进行仿真。你的钥匙也会配上的。

希望这能节省一些时间。

我在尝试发送推送通知时也出现了同样的错误。获取最新的谷歌服务。并替换为 json 文件。对我有用。

其实这个问题有很多原因。 我的是因为无效令牌传递。 我正在传递从一个应用程序生成的相同令牌,并在另一个应用程序中使用相同的令牌。 令牌一旦更新,我就能用了。

在我的案例中,我只是在项目凭证方面犯了一个错误: 从一个项目使用 google-services. json,从另一个项目使用服务器密钥。

your probably doing whwat i was doing. GCM token is not the same as FCM anymore. check if your pulling the GCM token ID instead of FCM. just override FirebaseInstanceIdService & ensure your getting the right ID. i thought at one point they were the same but now there not. i logged a test and saw. after you do that also update google-services.json like others say as a safety.

仅供参考。我正在运行这个错误,即使我 发誓的安卓应用程序,我正在测试是建立与最新/最伟大的谷歌服务。Json 文件和我可以从 FCM 控制台发送到应用程序。 我重建后,做了一个 Clean Project的应用程序,现在我可以发送到该应用程序与 FCM 令牌它注册。所以,在你的脑袋撞墙太久之前,也许可以尝试一个干净利落的重建。

We spent hours and hours to resolve this issue. What we found that token was being generated using different FCM account settings (google-services.json) and notification was being set using different FCM account. 我们同步的时候,效果非常好。

我已经注意到,当在 GCM 中创建设备 ID 时,您不能使用新的服务器密钥通过 FCM 发送推送消息,必须使用旧的 API 密钥。

这招对我很管用:

  • 检查当前的 ANDROID 项目与哪个 FIREBASE 项目链接并使用 服务器密钥 FROM THAT PROJECT。

我使用的服务器密钥来自另一个 Firebase 项目(比如 Project2)。我使用了与我的 android 项目(比如说 Project1)相同的服务器密钥,它起作用了。根据我的经验,在整个 android 项目中使用一个 firebase 应用程序似乎解决了这个问题。

我在这上面浪费了好几天。

在我的例子中,我按照这个 博客使用 Postman 并得到 mismatch senderid 错误。以前,我得到的是 messaging/mismatched-credential,人们报告说,他们的客户端应用程序使用了多个项目。

然而,对我来说,我有一对一,一个网络应用程序和一个项目。但是,我通过默认端口4200上的 ng serve托管所有应用程序。因此,无论我在开发什么项目/应用程序对,我总是从我的客户端网络应用程序使用 AngularFireMessaging.requestToken相同的令牌-这个令牌总是在我第一次运行一个 Firebase 应用程序在开发中创建的令牌。

As a work around, I start different apps / projects on different ports and get proper tokens for respective projects.

我很难搞清楚为什么我会得到一个“错配发件人身份”状态。 我在根 build.gradle中添加了 gms 依赖项,但是我的错误实际上是没有在应用程序 build.gradle中应用 gms 插件。

如果你在应用程序 build.gradle中没有这一行,这可能是通知无法工作的原因: apply plugin: 'com.google.gms.google-services'

Note: I had truncated the first part of the FCM token (before :) and the error was MismatchSenderId

修正了我的脚本,现在一切都很好。

用于在 fcm 中消除不匹配发送方 ID 的此错误

{"multicast_id":7751536172966571167,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}

出现了错误,

  1. 因此,我们首先要求,在 FCM 中,注册应用程序,例如 MyDemoApplication

  2. 之后,FCM 将生成服务器密钥,即 AIzaSyB9krC8mLHzO_TtECb5qg7NDZPxeG03jHU和发送方 ID,即 346252831806,这些格式如下所示。

  3. 在 Android Studio 中,我们的项目连接到这些 FCM 创建的项目,即 MyDemoApplication

  4. And most important step is there required to device token or registration id. These token must created in Android Studio..

  5. 在此之后,使用发件人 ID 和 API 的关键在网络 API 项目你一定会得到通知

In my case someone had deleted APN SSL Certificates for my app in Apple development portal.

  • 我需要创建新的证书: 标识符/我的 AppId/推送通知/编辑。
  • 然后我将它们从控制台上传到 Firebase 项目: 项目设置/云消息/iOS 应用程序配置/APNs 证书。

这解决了问题。

  • 我交叉验证了所有证件

  • 添加新的服务器密钥和删除旧的

  • 再次下载 google-services. json

Nothing solved the issue

然后我只是清理项目,然后重建项目。之后,它的工作很好

对我来说,这很简单。我从数据库里找错了注册身份。我拿到正确的身份证后,就成功了。

在我的 response-national-node.js 项目中也有同样的问题。 我想用机器人发送通知。 一切都设置好了,工作正常(也就是说,我能够从 node.js 发送通知,并在 android 设备上接收通知)。

几天后,我不得不使用一个不同的 Firebase 帐户,所以我改变了谷歌服务。Json 文件放在我的项目的 Android/app文件夹中,并重新构建了该项目。但是,当我再次尝试从服务器发送通知时,出现了一个错误-

{.............
errorInfo: {
code: 'messaging/mismatched-credential',
message: 'SenderId mismatch'
},
codePrefix: 'messaging'
}

解决方案:

the XML file at the location - 根据新的 Google-services. json,app/build/generated/res/google-services/{ build _ type }/values/values.xml 没有得到自动更新。 它仍然由我以前的 Google-services. json文件中的旧值组成。我必须手动更改 Xml文件。

这就是 app/build/generated/res/google-services/{build_type}/values/values.xml文件的外观(如果没有根据 Google-services. json自动更新,则需要手动更改)-

<?xml version="1.0" encoding="utf-8"?>
<resources>


<! -- Present in all applications -->
<string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>


<! -- Present in applications with the appropriate services configured -->
<string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
<string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
<string name="ga_trackingId" translatable="false">UA-65557217-3</string>
<string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
<string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="project_id" translatable="false">mydemoapp</string>


</resources>

你可参考以下连结:

  1. Https://firebase.google.com/docs/projects/multiprojects
  2. 处理 JSON 文件: https://developers.google.com/android/guides/google-services-plugin#processing_the_json_file

如下所示,通过输入正确的键解决了我的问题。

Copy 服务器密钥 like this picture enter image description here

然后像这张图片一样把这个代码复制到邮递员那里 enter image description here

身体是 划船就像这张照片

enter image description here NOTE:

  • 您必须在头部的服务器键之前添加 键 =
  • 确保输入 正确的标题键(Authorization = "key=..." and ContentType = "application/json")
  • 您已将请求发送到 < strong > 正确的地址 (https://fcm.googleapis.com/fcm/send和 Post 方法)

我试图用 fcm api“ https://fcm.googleapis.com/fcm/send" 发送通知,邮递员发来的。服务器密钥没问题,令牌粘贴得很好,但仍然得到错误“ Mismatch SenderId”。

然后在 android 端的 gradle 文件中引入了以下依赖项。

implementation platform('com.google.firebase:firebase-bom:25.12.0')

它开始接收设备上的通知

我花了好几个小时才弄明白。如果发送方应用程序使用的服务帐户与接收方使用的服务帐户不同,则会发生此问题。

您可以通过 Firebase -> Project Overview -> Project Settings -> Service Accounts找到您的接收方服务帐户,并生成一个新的密钥,并在发送方初始化您的 FirebaseApp时使用该密钥:

FileInputStream serviceAccount = new FileInputStream("YOUR_PATH_TO_GENERATED_KEY.json");
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(serviceAccount);
FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(googleCredentials).build();
firebaseApp =  FirebaseApp.initializeApp(options);

This initialization need to be done once before you send push notifications.

在我的情况下,我已经做了一切正确的,我仍然有这个问题。我对“谷歌服务”做了一些修改。我注意到 AndroidStudio 没有使用我的新文件。解决办法很简单:

AndroidStudio -> Build -> Clean Project和 Build-> Rebuild Project

我得到这个错误后,我添加了更多的产品风味到我当前的应用程序, 它似乎使用软件包名称来生成 FCM 令牌,所以为了解决这个问题,我必须添加一个应用程序来使用它相应的 PackageName 来生成每个 Flavour,然后用最新生成的一个包含每个 Flavour (软件包名称)的 Client 信息的程序来更新 google-services.json文件。

确保 google-service. json 文件中的“ package _ name”是 build.gradle (app)文件中的 applicationId。

  "client_info": {
"mobilesdk_app_id": "",
"android_client_info": {
"package_name": "" // -> your applicationId
}
}

我发现这个问题的原因后5年使用 Firebase。

当然,当我试图为旧项目获取新的 google-services. json 文件时,这种情况发生了。

When you receive the new file, you must use the latest version of google-services.

classpath 'com.google.gms:google-services:$.$.$'

You can check what google-services.json your app is using by logging react native firebase options like this:

console.log(JSON.stringify(messaging().app.options));

它将打印消息 SenderId 等等。

对我来说,在反应本地项目的原因是,我没有清理项目后,我取代了谷歌服务。Json 和一个新的。

跑步后:

gradlew clean (in android folder)

通知开始工作。 To make sure I also stopped emulators, wiped data from them and restarted.

在我们的例子中,UI 向后端发送它的 FCM 令牌,而后端在需要时发送通知。 所以问题是 FCM 令牌是用错误的 google 服务生成的。Json 和后端正在使用正确的新值,并且有一个不匹配。

我有两个错误: 未发送请求实体未找到和 SenderId 不匹配 也在这里寻找答案:

在 Firebase Cloud 函数中使用 Firebase Cloud Messaging 发送推送通知时,未找到请求的实体

“本地反应”“0.68.1”

"@react-native-firebase/app": "^15.1.1",

“@response-national-firebase/message”: “ ^ 15.1.1”,