问题描述
尝试使用 Google Firebase 发送推送通知时出现以下错误:
{"multicast_id":1559489545169770337,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
任何人都可以提供任何线索吗?
这是一个新设置,不是从 GMC 导入的。
manifest.json 包含:
"gcm_sender_id": "1225****"
这匹配“项目设置”>“云消息传递”>[发件人ID]
function urlBase64ToUint8Array(base64String) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g,'+')
.replace(/_/g,'/');
var rawData = window.atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
function subscribePush() {
navigator.serviceWorker.ready.then(function(registration) {
if (!registration.pushManager) {
alert('Your browser doesn\'t support push notification.');
return false;
}
registration.pushManager.subscribe({
userVisibleOnly: true //Set user to see every notification,applicationServerKey: urlBase64ToUint8Array('*******')
//The "PUBLIC KEY PAIR" under Web configuration. Have tried with and without urlBase64ToUint8Array()
})
.then(function (subscription) {
console.info('Push notification subscribed.');
console.log(subscription);
//saveSubscriptionID(subscription);
})
.catch(function (error) {
console.error('Push notification subscription error: ',error);
});
})
}
我的代码正在注册用户,Firebase 的响应是(包括“注册 ID”):
Data {"endpoint":"https://fcm.googleapis.com/fcm/send/****:*****","expirationTime":null,"keys":{"p256dh":"****","auth":"****"}}
然后我使用这个 PHP cURL:
$id = "****:*****"; // "REGISTRATION ID" from the response above. If this is wrong it throws an error ("InvalidRegistration"),so I kNow that this is correct.
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array (
'registration_ids' => array (
$id
),'data' => array (
"message" => "Test"
)
);
$fields = json_encode ( $fields );
$headers = array (
'Authorization: key=' . "********",//This is the "Server key" above "Sender ID"
//This matches "Project Settings" > "Cloud Messaging" > [Server Key]
//If this is wrong it returns: INVALID_KEY error 401. So I kNow this is correct.
'Content-Type: application/json'
);
$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,CURLOPT_POSTFIELDS,$fields );
$result = curl_exec ( $ch );
echo $result;
curl_close ( $ch );
解决方法
所以我最终明白了这一点。而不是使用末尾的订阅 ID
https://fcm.googleapis.com/fcm/send/ABCDEF:KJHASKHDASDetc
我使用了以下代码,并使用了 TOKEN 并将其用作 CURL 帖子中的“registration_ids”
<script src="https://www.gstatic.com/firebasejs/8.2.6/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.2.6/firebase-messaging.js"></script>
<!-- TODO: Add SDKs for Firebase products that you want to use
https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/8.2.6/firebase-analytics.js"></script>
<script>
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later,measurementId is optional
var firebaseConfig = {
apiKey: "****",authDomain: "****",projectId: "****",storageBucket: "****",messagingSenderId: "****",appId: "****",measurementId: "****"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
firebase.analytics();
const messaging = firebase.messaging();
messaging.requestPermission()
.then(function() {
console.log('Notification permission granted.');
return messaging.getToken()
})
.then(function(result) {
console.log("The token is: ",result);
})
.catch(function(err) {
console.log('Unable to get permission to notify.',err);
});
messaging.getToken({ vapidKey: '*****-*****' }).then((currentToken) => {
if (currentToken) {
// Send the token to your server and update the UI if necessary
// ...
console.log("currentToken: ",currentToken);
} else {
// Show permission request UI
console.log('No registration token available. Request permission to generate one.');
// ...
}
}).catch((err) => {
console.log('An error occurred while retrieving token. ',err);
// ...
});