You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从C# Web方法向Firebase Cloud Messaging发送消息返回401未授权

解决FCM调用返回401 Unauthorized的问题

你的代码出现401错误主要有两个核心问题,我帮你逐一梳理并修正:

1. Authorization头用错了凭证,且格式有误

FCM的Authorization头要求使用服务器密钥(Server Key),而不是你的Firebase项目ID。另外你代码里的格式多了不必要的单引号,正确格式应该是Key=你的服务器密钥(无单引号)。

  • 如何获取服务器密钥?
    登录Firebase控制台 → 进入目标项目 → 左侧菜单点击「项目设置」→ 切换到「云消息传递」标签页 → 在「旧版服务器密钥」区域即可找到(新项目可能需要手动生成)。

  • 修正后的Authorization头代码:

wr.Headers.Add("Authorization", "Key=" + FCM_SERVER_KEY); // 替换FCM_SERVER_KEY为你的服务器密钥

2. 手动拼接的JSON格式不符合规范

你用单引号拼接的JSON字符串是无效的,JSON要求必须用双引号包裹键和值。手动拼接不仅容易出错,还可能因特殊字符导致解析失败,建议用序列化工具生成JSON:

比如改成这样(分.NET版本处理):

// 先定义对应FCM请求结构的类
public class FcmNotificationRequest
{
    public object data { get; set; }
    public string to { get; set; }
}

// 在方法内构造请求对象并序列化
var notificationRequest = new FcmNotificationRequest
{
    to = cToken,
    data = new 
    {
        title = "Firebase notification",
        detail = "I am firebase notification. you can customise me. enjoy"
    }
};

string jsonBody;
// .NET Core/.NET 5+ 使用System.Text.Json
jsonBody = System.Text.Json.JsonSerializer.Serialize(notificationRequest);
// .NET Framework 使用JavaScriptSerializer
// jsonBody = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(notificationRequest);

byte[] byteArray = Encoding.UTF8.GetBytes(jsonBody);

3. 额外优化建议

  • 读取并记录FCM的响应内容,调试时能看到具体错误信息,方便排查:
using (WebResponse response = wr.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        string responseText = reader.ReadToEnd();
        // 可打印或记录responseText,查看FCM返回的详细结果
    }
}
  • 用using语句包裹流和响应对象,确保资源被正确释放,避免内存泄漏。

把这些修改完成后,你的代码应该就能正常调用FCM接口了。

内容的提问来源于stack exchange,提问作者Shai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:20:13