是否可以在 Firebase 上使用 REST API 发送推送通知?我可以使用 Firebase 控制台发送通知,但我需要使用 REST API 发送通知。
只是为了帮助,
如果有人想使用 REST POST API,就在这里,使用具有以下配置的 Postman
网址:
https://fcm.googleapis.com/fcm/send
标题:
"Content-Type": "application/json",
"Authorization": "key=<Server_key>"
身体:
{
"to": "<Device FCM token>",
"notification": {
"title": "Check this Mobile (title)",
"body": "Rich Notification testing (body)",
"mutable_content": true,
"sound": "Tri-tone"
},
"data": {
"url": "<url of media image>",
"dl": "<deeplink action on tap of notification>"
}
}
就是这样。谢谢!!!
如果您想了解有关 FCM 的丰富通知的更多详细信息,可以查看我在 Medium 上的文章 iOS 平台上使用 Firebase Cloud Messaging (FCM) 和 Pusher 的丰富推送通知
我使用下面的 REST API 来发送通知。
curl -X POST \
https://fcm.googleapis.com/fcm/send \
-H 'Authorization: key=AAAAG-oB4hk:APA91bFUilE6XqGzlqtr-M-LRl1JisWgEaSDfMZfHuJq3fs7IuvwhjoGM50i0YgU_qayJA8FKk15Uvkuo7SQtQlVt4qdcrrhvnfZyk_8zRGAskzalFUjr2nA2P_2QYNTfK6X8GbY0rni' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: c8af5355-dbf2-4762-9b37-a6b89484cf07' \
-H 'cache-control: no-cache' \
-d '{
"to": "ey_Bl_xs-8o:APA91bERoA5mXVfkzvV6I1I8r1rDXzPjq610twte8SUpsKyCuiz3itcIBgJ7MyGRkjmymhfsceYDV9Ck-__ObFbf0Guy-P_Pa5110vS0Z6cXBH2ThnnPVCg-img4lAEDfRE5I9gd849d",
"data":{
"body":"Test Notification !!!",
"title":"Test Title !!!"
}
}'
授权:key=AAAAG-oB4hk:APA91bFUilE6XqGzlqtr-M-LRl1JisWgEaSDfMZfHuJq3fs7IuvwhjoGM50i0YgU_qayJA8FKk15Uvkuo7SQtQlVt4qdcrrvnfZyk_8zRGAskzalFUjr2nA2P_2 QYNTfK6X8GbY0rni
其中密钥是来自控制台的web_server_key,您需要指定从应用程序中获取的唯一注册密钥。
“to”:“ey_Bl_xs-8o:APA91bERoA5mXVfkzvV6I1I8r1rDXzPjq610twte8SUpsKyCuiz3itcIBgJ7MyGRkjmymhfsceYDV9Ck-__ObFbf0Guy-P_Pa5110vS0Z6cXBH2ThnnPVCg- img4lAEDfRE5I9gd849d”是来自设备的 FCM 注册令牌。请参考以下链接。
https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0
这可能会有所帮助 - https://firebase.google.com/docs/cloud-messaging/http-server-ref 您可以在此处找到示例消息 - https://firebase.google.com/docs/cloud-messaging/downstream
从 Firebase 控制台,您可以获取服务器密钥作为授权,您可以将其放入 http 标头的云消息传递选项卡中。
试试这个,
网址 - https://fcm.googleapis.com/fcm/send
方法 - 发布
标题
身体
{
"to" : "FCM Token goes here",
"notification" : {
"body" : "New Lesson Added 1",
"title": "Lokesh"
}
}
新版本的 API(称为 v1)为通过 ARC 发送消息带来了更多挑战。您需要一个特殊的令牌,该令牌将会过期。您必须在 firebase 控制台中创建 firebase admin sdk 密钥(服务帐户密钥):
它们的密钥以 json 格式存储,如下所示:
{
"type": "service_account",
"project_id": "<your project ID>",
"private_key_id": "8b..............................37",
"private_key": "-----BEGIN PRIVATE KEY-----
MIIE.....
....
-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-6fzie@<yourprojectID>.iam.gserviceaccount.com",
"client_id": "1...................4",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url":
"https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-
6fzie%40<yourprojectID>.iam.gserviceaccount.com"
}
该密钥用于在获取http通信的token时识别您的身份。您需要一种对 firebase 的服务器访问权限。我在 WSL 中使用了 python 和这段代码:
import requests
import google.auth.transport.requests
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
credentials = service_account.Credentials.from_service_account_file('service-account.json', scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
print(credentials.token)
service-account.json 是运行 python 的文件系统上的文件中的私钥。您将获得令牌并可以在 ARC 内使用:
ya29.c.b0Aa9VdylWfrAFWysdUeh3m7cGF-Cow1OAyyE4bEqFL....................48Ye7w
ARC 配置与旧版 API 类似,但有一些变化。 URL 已更改,其中包含您的项目 ID:
https://fcm.googleapis.com/v1/projects/<your project ID>/messages:send
我们仍然使用 POST 方法,并且标头只有一行 Content-Type application/json。身份验证有一个单独的选项卡,我们应该使用 python 中的 Bearer + token:
选择 Bearer 并启用它非常重要,因为默认情况下它是禁用的。
身体也发生了变化。这是基于应用程序令牌向单个应用程序发送消息的示例:
{
"message" : {
"token" : "e6e....FurF",
"notification" : {
"body" : "Great deal!",
"title" : " Buy everything"
}
}
}
其中关键字“to”已更改为“token”。这就是全部,我们可以将消息发送到应用程序。我希望将它放在这里,以便能够按照 Goggle 目前的要求迁移到 API v1。最后一段代码是用于curl的:-)
curl " https://fcm.googleapis.com/v1/projects/<your project id>/messages:send" \
-X POST \
-d "{\r\n \"message\" : {\r\n \"token\" : \"e6e....FurF\",\r\n \"notification\" : {\r\n \"body\" : \"Great deal!\",\r\n \"title\" : \" Buy everything\"\r\n }\r\n }\r\n}" \
-H "Content-Type: application/json" \
-H "authorization: Bearer ya29.c.b...."
这是我使用过的来源:
使用 ARC 向 Firebase 控制台发送请求以发送通知
您可以使用 ARC OR Postman 或您自己的服务器发送通知。 您需要从控制台收集 web_server_key,并且需要指定在调用
onRefreshToken()
方法时从应用程序获取的唯一注册密钥。
您需要将请求发送到 https://fcm.googleapis.com/fcm/send,并使用 Content-Type :json 和 Authorization:web_server_key。 开启 为用户评价您的 app_registration_token 。
我们使用以下文档从网络客户端发送通知。
有一种简单的方法可以通过 Chrome 应用程序或扩展程序发送通知。
function sendMessage() {
var message = {
messageId: getMessageId(),
destinationId: senderId + "@gcm.googleapis.com",
timeToLive: 86400, // 1 day
data: {
"key1": "value1",
"key2": "value2"
}
};
chrome.gcm.send(message, function(messageId) {
if (chrome.runtime.lastError) {
// Some error occurred. Fail gracefully or try to send
// again.
return;
}
对于 C# 应用程序(Xamarin.Forms 等),您只需复制以下代码:
public async static void SendPushToTokenID(string tokenID, string title, string body)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
var url = serverURL;
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=" + serverKey);
var notification = new
{
title = title,
body = body
};
var postModel = new
{
to = tokenID,
notification = notification
};
var response = await client.PostAsJsonAsync(url, postModel);
// format result json into object
string content = await response.Content.ReadAsStringAsync();
string xw = (response.Content.ReadAsStringAsync().Result);
}
对于网址使用:https://fcm.googleapis.com/fcm/send 对于您的服务器密钥,请使用您的 firebase 服务器密钥。这就是全部。只是不要忘记将设备令牌 ID 存储在您的服务器上,然后您就可以全天免费向个人用户发送消息。非常简单。
对于新版本的 fcm api v1 Http kotlin 代码获取服务器身份验证密钥
class FcmAccessTokenManager(){
private val firebaseMessagingScope = "https://www.googleapis.com/auth/firebase.messaging"
fun getAccessToken(): String? {
return try {
val jsonString = """
//past your firebase service generated key gson content here
""".trimIndent()
val stream = ByteArrayInputStream(jsonString.toByteArray(StandardCharsets.UTF_8))
val googleCredentials = GoogleCredentials.fromStream(stream)
.createScoped(Lists.newArrayList(firebaseMessagingScope))
googleCredentials.refresh()
googleCredentials.accessToken.tokenValue
} catch (e: IOException) {
Log.d("access token error", e.localizedMessage ?: "Error occurred")
null
}
}}