【问题标题】:FCM getting MismatchSenderIdFCM 获取 MismatchSenderId
【发布时间】:2016-10-18 04:50:48
【问题描述】:

我有一个使用 Google FCM 发送推送通知的应用程序。

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

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

有什么建议吗?

编辑:

示例响应:

{"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,我不再收到“MismatchSenderId”了。

【问题讨论】:

  • MismatchSenderId 表示您的客户端正在注册与您用于发送的服务器不同的服务器。您的所有客户都注册同一个项目吗?您还可以在问题中包含 MismatchSenderId 响应吗?
  • 是的,相同的项目,相同的应用程序,相同的服务器密钥。
  • 您能否展示一下您如何发送此消息的代码?我可能知道问题的原因..
  • @TareKhoury,谢谢。首先。确保您使用的授权密钥是Server Key(可以在服务器选项卡的firebase 控制台中找到)而不是google-service.json 中的API_KEY。其次,确保您设置的目的地正确。例如,to" : "/topics/yourtopic" 如果您想向所有设备发送消息(他们应该首先订阅该主题)。或者尝试发送到特定设备,然后需要输入设备令牌(在firebase服务中首次启动时收到)cec5gH04....92IyHrB2K
  • 过去 2 年有没有人设法解决这个问题?

标签: firebase firebase-cloud-messaging


【解决方案1】:

Firebase 已将其服务器密钥升级到新版本。 使用新密钥而不是旧密钥。

转到设置->项目设置->云消息选项卡

【讨论】:

  • 使用服务器密钥或旧服务器密钥没有任何区别
【解决方案2】:

我找到了这个解决方案:

  • 首先我检查服务器密钥是否正确 喜欢AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • 然后我检查发件人 ID,如 79XXXXXXXX,它也是正确的。
  • 主要问题在于我必须向其发送通知的 device_ID(UDID)。实际上,我们在 FCM 中获得的 Android 端 DeviceId 与 GCM 不同。您不能在 FCM 中使用 GCM 创建的 DeviceId

【讨论】:

  • 你帮了我很多。我不得不要求应用程序开发人员在代码中包含发件人 ID,然后我的 FCM API KEY 才起作用。非常感谢。
  • 当我们将后端和 Android 应用升级到 FCM 时,我们如何向已在后端注册 GCM 令牌的用户发送推送通知。 ?
  • FCM 系统支持旧的 GCM 令牌developers.google.com/cloud-messaging/faq
  • 嗨,伙计。您将 senderId 放在哪里?我看到我没有使用它,并且几天前我已经能够发送通知。提前感谢队友
  • Hi @voghDev 从后端使用 FCM Api (fcm.googleapis.com/fcm/send) 在标头和应用程序端发送 senderId 相同的 SenderId 用于创建 UDID (device_Id)
【解决方案3】:

仅供参考。我遇到了这个错误,尽管我发誓我正在测试的 android 应用程序是使用最新/最好的 google-services.json 文件构建的,并且我可以从 FCM 控制台发送到应用程序。 我在执行Clean Project 后重建了应用程序,现在我可以使用它注册的 FCM 令牌发送到应用程序。所以,也许在你的头撞墙太久之前尝试干净的重建。

【讨论】:

  • 这就是我的解决方案!
  • 两个项目都使用新的 FCM,这仍然是问题所在。拯救了我的一天!
  • 这就是解决方案。我希望我们有更好的错误消息。
【解决方案4】:

这对我有用:

  • 检查您当前的 Android 项目与哪个 Firebase 项目相关联并使用 服务器密钥来自那个项目。

我正在使用来自不同 firebase 项目(例如项目 2)的服务器密钥。我使用了与我的 android 项目(例如项目 1)链接的相同服务器密钥,并且它有效。根据我的经验,为整个 android 项目使用一个 firebase 应用似乎可以解决问题。

【讨论】:

  • 我遇到了同样的情况。链接到 android 应用程序的旧项目。并且新项目的服务器密钥不起作用(返回错误 MismatchSenderId)。在旧项目中删除 android 应用程序后,新项目中的新服务器密钥开始工作。
  • 这是完美的,对我来说就像一个魅力
【解决方案5】:

就我而言,我只是误认为项目凭据:使用来自一个项目的 google-services.json 和来自另一个项目的服务器密钥。

【讨论】:

    【解决方案6】:

    我们花了好几个小时来解决这个问题。我们发现令牌是使用不同的 FCM 帐户设置 (google-services.json) 生成的,并且通知是使用不同的 FCM 帐户设置的。 当我们同步两者时,它就像一个魅力。

    【讨论】:

    • 这也发生在我身上。 100% 确保为您的手机生成的令牌是正确的构建环境 (dev/alpha/prod)
    【解决方案7】:

    输入正确的密钥解决了我的问题,如下所示。

    像这张图片一样复制服务器密钥

    然后像这张图片一样在post man中复制这段代码

    和Body是就像这张图片

    注意:

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

    【讨论】:

      【解决方案8】:

      确保从您的应用(库、AndroidManifest 中的接收器等)中删除所有 Parse 代码。我发现间歇性推送通知不起作用。根据我的观察,它适用于全新安装,但不适用于来自 Play 商店的应用更新。

      我相信 Parse 内部的某些东西与 FCM 冲突(Parse 使用 GCM,所以我猜它与同时使用 GCM 和 FCM 有关)。当我删除所有 Parse 接收器和库后,一切都很好。

      【讨论】:

        【解决方案9】:
        • 我交叉验证了所有凭据

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

        • 再次下载 google-services.json

        没有解决问题

        然后我只是清理项目然后重建项目。之后它工作正常

        【讨论】:

        • 你拯救了我的一天:D
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

            为了消除fcm中发件人ID不匹配的错误

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

            发生错误,

            1. 所以我们首先需要,在 FCM 中,注册 Application,例如 MyDemoApplication

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

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

            4. 最重要的一步是设备令牌或注册ID。这些令牌必须在 Android Studio 中创建..

            5. 在 Web API 项目中使用 Sender Id 和 API 密钥后,您肯定会收到通知

            【讨论】:

              【解决方案13】:

              我在这上面花了几个小时终于弄明白了。如果您的发送方应用程序使用的服务帐户与您的接收方使用的服务帐户不同,则会出现此问题。

              您可以通过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);
              

              此初始化需要在您发送推送通知之前完成一次。

              就我而言,我做的一切都是正确的,但我仍然遇到这个问题。我对接收器应用程序中使用的“google-services.json”进行了一些更改,我注意到 AndroidStudio 没有使用我的新文件。解决方案非常简单:

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

              【讨论】:

                【解决方案14】:

                检查 manifest.json 中的 gcm_sender_id 如果不匹配 - 正确,但您需要为新的发件人 ID 创建新订阅者。 现有订阅者中断。

                【讨论】:

                  【解决方案15】:

                  根据响应“MismatchSenderId”,这是 FireBase 与您本地的“google-services.json”不匹配,您必须确保两个清单匹配

                  在 FireBase 控制台中,您转到“YourProject > Project OverView > Cloud Messaging”,您将看到“SenderID”,它必须与您的 Android 项目中的“google-services.json”匹配。

                  您可以做的最好的事情是从“常规”选项卡下载最终的 json 文件并将其放入您的项目中。

                  【讨论】:

                    【解决方案16】:

                    我在尝试发送推送通知时遇到了同样的错误。获取更新的 google-services.json 文件并用它替换。为我工作。

                    【讨论】:

                      【解决方案17】:

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

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

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

                      它开始在设备上接收通知

                      【讨论】:

                      • 为我工作,谢谢
                      【解决方案18】:

                      在我当前的应用程序中添加了更多产品风味后,我收到了这个错误, 似乎它使用包名称来生成 FCM 令牌,所以为了解决这个问题,我必须添加一个带有相应 PackageName 的eatch Flavor 应用程序,并使用最新生成的包含客户端信息的文件更新google-services.json 文件每种口味(包装名称)。

                      【讨论】:

                        【解决方案19】:

                        更新 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>
                        

                        【讨论】:

                          【解决方案20】:

                          对我来说,问题是我在cordova中使用phonegap-plugin-push,使用phonegap应用程序测试该应用程序。

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

                          所以要让它工作(只要你所有的键都正确)就是用其他方式测试你的程序,使用模拟器,或通过 USB 进行 android 仿真。并且您的密钥将匹配。

                          希望这可以节省一些时间。

                          【讨论】:

                            【解决方案21】:

                            你可能正在做我正在做的事情。 GCM 令牌不再与 FCM 相同。检查您是否提取了 GCM 令牌 ID 而不是 FCM。只需覆盖 FirebaseInstanceIdService 并确保您获得正确的 ID。我一度以为它们是一样的,但现在不一样了。我记录了一个测试并看到了。在你这样做之后,也像其他人所说的那样更新 google-services.json 作为安全。

                            【讨论】:

                              【解决方案22】:

                              我在这上面浪费了几天时间。

                              就我而言,我按照blog 使用 Postman 并得到 mismatchsenderid 错误。以前,我收到了messaging/mismatched-credential,人们报告说他们的客户端应用程序使用了多个项目。

                              但是,对我来说,我有一对一的、一个网络应用程序和一个项目。 但是,我通过 ng serve 在默认端口 4200 上托管所有应用程序。因此,无论我正在开发什么项目/应用程序对,我总是会使用 @987654324 从我的客户端 Web 应用程序中获得相同的令牌@ - 这个令牌始终是我第一次运行开发中的 firebase 应用时创建的令牌。

                              作为一种变通方法,我在不同的端口上启动不同的应用程序/项目并为各个项目获取适当的令牌。

                              【讨论】:

                                【解决方案23】:

                                注意:我截断了 FCM 令牌的第一部分(: 之前),错误为 MismatchSenderId

                                修复了我的脚本,现在一切正常。

                                【讨论】:

                                  【解决方案24】:

                                  就我而言,有人在 Apple 开发门户中为我的应用删除了 APN SSL 证书。

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

                                  这解决了问题。

                                  【讨论】:

                                    【解决方案25】:

                                    就我而言,这非常简单。我从数据库中提取了错误的registrationId。在我提取了正确的 ID 后,它就起作用了。

                                    【讨论】:

                                      【解决方案26】:

                                      我在 react-native - node.js 项目中遇到了同样的问题。 我想在android中发送通知。 一切都设置好并且工作正常(即我能够从 node.js 发送通知并在 android 设备上接收通知)。

                                      几天后,我不得不使用不同的 firebase 帐户,因此我更改了项目 android/app 文件夹中的 google-services.json 文件并重建了项目。但是,当我再次尝试从服务器发送通知时,出现错误 -

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

                                      解决方案:

                                      该位置的 XML 文件 - app/build/generated/res/google-services/{build_type}/values/values.xml 没有根据新的 google-services 自动更新。 json。 它仍然包含我之前的 google-services.json 文件中的旧值。我不得不手动更改 values.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

                                      【讨论】:

                                        【解决方案27】:

                                        我很难弄清楚为什么我会收到“MismatchSenderId”状态。 我在根 build.gradle 中添加了 gms 依赖项,但我的错误实际上是没有在应用程序 build.gradle 中应用 gms 插件。

                                        如果您在应用程序build.gradle 中没有此行,这可能是通知不起作用的原因: apply plugin: 'com.google.gms.google-services'

                                        【讨论】:

                                          【解决方案28】:

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

                                          【讨论】:

                                            【解决方案29】:

                                            我遇到了同样的问题,我是这样解决的:

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

                                            瞧……

                                            【讨论】:

                                              【解决方案30】:

                                              我也遇到同样的错误。我已复制 api_key 并更改为 google_services.json。之后它对我有用

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

                                              试试这个

                                              【讨论】:

                                                猜你喜欢
                                                • 2018-06-26
                                                • 1970-01-01
                                                • 2017-12-09
                                                • 1970-01-01
                                                • 1970-01-01
                                                • 1970-01-01
                                                • 1970-01-01
                                                • 1970-01-01
                                                • 1970-01-01
                                                相关资源
                                                最近更新 更多