FCM отримує MismatchSenderId


88

У мене є програма, яка використовує Google FCM для надсилання push-сповіщень.

Коли я надсилаю push-повідомлення групі користувачів, я отримую відповідь від 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".


4
MismatchSenderId означає, що ваш клієнт реєструється на сервері, відмінному від того, який ви використовуєте для надсилання. Чи всі ваші клієнти реєструються в одному проекті? Також ви могли б включити відповідь MismatchSenderId до запитання?
Артур Томпсон,

Так, той самий проект, той самий додаток, той самий ключ сервера.
TareK Khoury

Не могли б ви показати код, як ви надіслали це повідомлення? Я міг би знати причину проблеми ..
AnZ

3
@TareKhoury, дякую. Поперше. Переконайтеся, що використовуваний вами ключ авторизації Server Key(його можна знайти на консолі Firebase на вкладці сервера), а не API_KEYз google-service.json. По-друге, переконайтеся, що ви правильно встановили пункт призначення. Наприклад, to" : "/topics/yourtopic"якщо ви хочете надіслати повідомлення на всі пристрої (вони повинні спочатку підписатися на цю тему). Або спробуйте відправити на певний пристрій, тоді потрібно ввести маркер пристрою (отриманий при першому запуску в службі firebase)cec5gH04....92IyHrB2K
AnZ

3
Чи вдалося комусь вирішити проблему за останні 2 роки?
Dylanthepiguy

Відповіді:


36

Firebase оновив свої ключі сервера до нової версії. Використовуйте нові ключі замість старих.

перейдіть до налаштувань-> налаштування проекту-> вкладка хмарних повідомлень

введіть тут опис зображення


Немає різниці, якщо ви використовуєте серверний ключ АБО застарілий серверний ключ
R15,

23

Я знайшов таке рішення:

  • Спочатку я перевіряю правильність ключа сервера чи він був неправильним, що схоже на AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • Потім я перевіряю ідентифікатор відправника, як 79XXXXXXXX, він також був правильним.
  • Основна проблема полягала в ідентифікаторі пристрою (UDID), якому я повинен надіслати повідомлення. Насправді DeviceId, який ми отримали на стороні Android у FCM , відрізняється від GCM . Ви не можете використовувати створений GCM DeviceId у FCM .

Ви мені дуже допомогли. Мені довелося попросити розробника програми включити в код ідентифікатор відправника, тоді мій FCM API KEY запрацював. Дуже дякую.
Луїс Міланезе,

3
Коли ми оновлюємо нашу серверну програму та додаток для Android до FCM, як ми можемо надіслати push-сповіщення користувачам, як вони вже зареєстровані в серверній системі з маркерами GCM? ?
Pinkesh Darji

Система FCM підтримує старі токени GCM developers.google.com/cloud-messaging/faq
Парас Діван

Привіт, чоловіче. Де ви розміщуєте id відправника? Я бачу, що не використовую його, і я мав змогу надсилати сповіщення кілька днів тому. Заздалегідь
дякую

Привіт @voghDev із серверного сервера, використовуючи FCM Api ( fcm.googleapis.com/fcm/send ), надсилаючи senderId у заголовках та на стороні програми, такий же SenderId використовується для створення UDID (device_Id)
Науман Хан

17

ЦЕ РОБОТАЛО ДЛЯ МЕНЯ:

  • ПЕРЕВІРКА ЯКИХ FIREBASE проектувати ТОК ANDROID проект пов'язаний і використання сервера ключ з цього проекту.

Я використовував серверний ключ з іншого проекту Firebase (скажімо, Проект 2). Я використовував той самий ключ сервера, що і зв’язаний із моїм проектом для Android (Say Project 1), і він спрацював. На моєму досвіді, здавалося, проблему вирішило використання однієї програми firebase для всього проекту Android.


Я стикався з такою ж ситуацією. Старий проект пов'язаний з додатком для Android. І серверний ключ нового проекту не працює (повернути помилку MismatchSenderId). Після того, як я видалив додаток Android у старому проекті, новий ключ сервера від нового проекту став спрацьованим.
vk26,

12

Просто FYI. Я стикався з цією помилкою, хоча, клянусь, тестований додаток для Android, створений за допомогою останнього / найкращого файлу google-services.json, і я міг надіслати його з консолі FCM до програми. Я відновив програму після того, як зробив, Clean Projectі тепер я можу надіслати програму за допомогою маркера FCM, який вона реєструє. Тож, можливо, спробуйте чисту перебудову, перш ніж бити головою об стіну занадто довго.


це було рішення для мене!
Гоміно

1
В обох проектах використовується новий FCM, і це все ще залишалося проблемою. Врятував мій день!
Крістіан Колб

11

У моєму випадку я просто помилявся щодо облікових даних проекту: використання google-services.json з одного проекту та ключ сервера з іншого.


6

Ми витратили години та години, щоб вирішити цю проблему. Ми виявили, що маркер генерується за допомогою різних налаштувань облікового запису FCM (google-services.json), а сповіщення встановлюється за допомогою іншого облікового запису FCM. Коли ми синхронізували обидва, це спрацювало як шарм.


Це трапилось і зі мною. Переконайтеся на 100%, що маркер, створений для вашого телефону, є правильним середовищем збірки (dev / alpha / prod)
ehacinom

4

Я виявив, що senderIdвін відрізняється від номера проекту в консолі FCM,
тому я перезавантажив google-services.json і все працює нормально


4

Мою проблему було вирішено введенням правильного ключа, як показано нижче.

Копіювати серверний ключ, як на цьому малюнку введіть тут опис зображення

А потім скопіюйте цей код у поштовій скриньці, як ця картинка введіть тут опис зображення

а тіло - рядок, як на цьому малюнку

введіть тут опис зображення ПРИМІТКА:

  • Ви повинні додати key = перед ключем сервера в заголовку
  • Переконайтеся, що ви правильно ввели заголовкові ключі (Authorization = "key = ..." та ContentType = "application / json")
  • Ви надіслали запит на правильну адресу ( https://fcm.googleapis.com/fcm/send та метод публікації)

3
  • Я перевірив усі дані

  • Додано новий ключ сервера та видалено старий

  • Знову завантажив google-services.json

Ніщо не вирішило проблему

Потім я просто очищаю проект, а потім відновлюю проект, після чого він працює нормально


Ти врятуєш мій день: D
Туан Луонг

2

Переконайтеся, що ви видалили весь код розбору з вашої програми (бібліотеки, приймачі в AndroidManifest тощо). Я виявив, що сповіщення про періодичне надсилання не працюють. З моїх спостережень, це буде працювати при свіжих встановленнях, але не оновленнях програм із магазину ігор.

Я вважаю, що щось внутрішнє для Parse суперечило FCM (Parse використовує GCM, тому я здогадуюсь, що це було пов’язано з одночасним використанням GCM та FCM). Як тільки я вирвав усі приймачі та бібліотеки Parse, все вдалося чудово.


2

Насправді у цього питання є багато причин. Моя була через передачу недійсного маркера. Я передавав той самий маркер, згенерований з одного додатка, і використовуючи той самий маркер в іншому додатку. Після оновлення маркера він працює для мене.


2

Для усунення цієї помилки через невідповідність ідентифікатора відправника у fcm

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

сталася помилка,

  1. Тож спочатку ми вимагали, у FCM, зареєструвати додаток, наприклад MyDemoApplication

  2. Після цього FCM згенерує серверний ключ, тобто AIzaSyB9krC8mLHzO_TtECb5qg7NDZPxeG03jHUі ідентифікатор відправника, тобто 346252831806такий формат, як цей.

  3. Після того, як В Android Studio, наш проект підключається до цих проектів, створених FCM, тобто MyDemoApplication

  4. І найважливішим кроком є ​​наявність маркера пристрою або реєстраційного ідентифікатора. Ці маркери повинні бути створені в Android Studio.

  5. Після цього використання ідентифікатора відправника та ключа API у проекті веб-API u точно отримає сповіщення


1

перевірити gcm_sender_id у manifest.json. Якщо невідповідність - правильна, але вам потрібно створити нових підписників для нового ідентифікатора відправника. Існують абоненти перерва.


1

Відповідно до відповіді "MismatchSenderId", це невідповідність між FireBase і вашим локальним "google-services.json", ви повинні переконатися, що обидва маніфести збігаються

У консолі FireBase ви перейдете до «YourProject> Project OverView> Cloud Messaging», ви побачите «SenderID», який ПОВИНЕН збігатися з «google-services.json» у вашому проекті Android.

Найкраще, що ви можете зробити, це завантажити остаточний файл json з вкладки "Загальні" та помістити його у свій проект.


1

У мене була та ж помилка під час спроби надіслати push-повідомлення. Отримайте оновлений файл google-services.json і замініть його. Працював у мене.


0

У мене була та ж проблема, і я її виправив так:

  1. Перейдіть на консоль Google Fcm
  2. Виберіть програму
  3. У лівому боковому меню знайдіть піктограму налаштувань (стандартне колесо)
  4. Клацніть на нього і після натисніть на налаштування проекту
  5. Тепер скопіюйте свій серверний ключ і вставте його в php

Вуаля ...


0

Оновлення ініціалізації 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>

0

Для мене проблема полягала в тому, що я використовував phonegap-plugin-pushin cordova, тестуючи програму за допомогою програми phonegap.

Проблема в тому, що з якоїсь причини за допомогою цього плагіна програма phonegap перехоплює його та повертає фіктивний реєстраційний ключ, незалежно від того, який ідентифікатор відправника у вас є.

Тож змусити це працювати (якщо у вас усі ключі правильно) - це протестувати свою програму якимось іншим способом, за допомогою емулятора або емуляції андроїда через usb. І ваші ключі будуть збігатися.

Сподіваємось, це економить комусь час.


0

ти, мабуть, робиш те, що я робив. Маркер GCM вже не такий, як FCM. перевірте, чи витягуєте ідентифікатор маркера GCM замість FCM. просто перевизначте FirebaseInstanceIdService і переконайтесь, що ви отримали правильний ідентифікатор. Я думав, що в один момент вони були однаковими, але зараз їх немає. я записав тест і побачив. після цього також оновіть google-services.json, як кажуть інші як безпеку.


0

Я марнував дні на це.

У моєму випадку я пішов за цим блогом, щоб використовувати Postman та отримати помилку mismatchsenderid. Раніше я отримував messaging/mismatched-credential, і люди повідомляли, що їх клієнтська програма використовує кілька проектів.

Однак для мене у мене є один на один, веб-програма та проект. АЛЕ я розміщую всі програми через ng serveпорт за замовчуванням 4200. Отже, незалежно від того, на якій парі проект / програма я розробляв, я завжди отримував би один і той же маркер із мого клієнтського веб-застосунку AngularFireMessaging.requestToken- цей маркер завжди був маркером, створеним у моєму першому в історії запуск програми Firebase у розробці.

В якості роботи я запускаю різні програми / проекти на різних портах і отримую відповідні токени для відповідних проектів.


0

Примітка: Я скоротив першу частину маркера FCM (раніше :), і помилка булаMismatchSenderId

Виправили мій сценарій і тепер все працює нормально.


0

У моєму випадку хтось видалив сертифікати APN SSL для мого додатка на порталі розробки Apple.

  • Мені потрібно було створити нові сертифікати: Ідентифікатори / My AppId / Push Notifications / Edit.
  • Потім я завантажив їх у проект Firebase із консолі: Налаштування проекту / Хмарні повідомлення / Конфігурація програми iOS / Сертифікати APN.

Це вирішило проблему.


0

У моєму випадку це було дуже просто. Я витягував з бази даних неправильний ідентифікатор реєстрації. Після того, як я витягнув правильний ідентифікатор, це спрацювало.


0

У мене була та сама проблема у моєму проекті-реагуванні - node.js. Я хотів відправляти сповіщення в android. Все було налаштовано і працювало нормально (тобто я зміг надсилати сповіщення з node.js і отримувати сповіщення на пристрої Android).

Через кілька днів мені довелося використовувати інший обліковий запис Firebase, тому я змінив файл google-services.json у папці android / app мого проекту та відновив проект. Але, коли я спробував ще раз надіслати сповіщення зі свого сервера, я отримав повідомлення про помилку -

{.............
  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 .

0

У мене були великі проблеми з з’ясуванням, чому я отримую статус „MismatchSenderId”. Я додав gms-залежність у кореневій системі, build.gradleале помилка насправді не застосовувала плагін gms у програмі build.gradle.

Якщо у вас немає цього рядка в додатку build.gradle, це може бути причиною того, що сповіщення не працює: apply plugin: 'com.google.gms.google-services'


0

Я помітив, що коли в GCM створюється ідентифікатор пристрою, ви не можете надсилати push-повідомлення через FCM за допомогою нового ключа сервера, вам доведеться використовувати старий API-ключ.


0

Я намагався надіслати сповіщення за допомогою API fcm "https://fcm.googleapis.com/fcm/send" від листоноші. Ключ сервера був у порядку, і маркер був вставлений чудово, але все ще отримував помилку "MismatchSenderId".

Потім ввів наступну залежність у файл gradle на стороні Android.

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

і він почав отримувати сповіщення на пристрій


-3

Я також отримую ту ж помилку. я скопіював api_key і змінив на google_services.json. після цього це працює для мене

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

спробуйте це


-6

У вас буде ключ сервера приблизно такий AIzaSyDiTEVq4Li1pj7IyraRlyRU9adc-49-KVY, який доступний у розділі " Налаштування " консолі консолі Firebase.firebase.google.com/project/project-XXXXXXXXXXXX/settings/cloudmessaging .

Вкажіть правильний ключ разом із кодом і повторіть спробу.


8
Я використовую правильний ключ сервера. Якби я цього не зробив, я отримав би "MismatchSenderId" для всіх запитів, а не для "деяких з них", як згадувалось.
TareK Khoury
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.