• 使用FCM服务


    1.建谷歌账号

    2.在console上新建应用 https://console.firebase.google.com 并下载私钥.json

    3.创建测试网页应用 (或app应用)

    C#服务端:

    用HTTP v1 API 的方式获取OAuth2的验证,然后再发http请求到FCM发送消息通知。

    1.获取Token

     1 public async Task<string> GetTokenAsync(string filePath)
     2         {
     3             var token = _redisDBManager.GetValue(filePath);
     4             if (token != null)
     5                 return token;
     6 
     7             try
     8             {
     9                 GoogleCredential credential = null;
    10                 using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    11                 {
    12                     credential = GoogleCredential.FromStream(stream)
    13                         .CreateScoped(@"https://www.googleapis.com/auth/firebase.messaging");
    14                 }
    15                 var result = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync().ConfigureAwait(false);
    16 
    17                 _redisDBManager.SetValue(filePath, result, TimeSpan.FromMinutes(50));
    18 
    19                 return result;
    20             }
    21             catch (Exception e)
    22             {
    23                 Logger.LogError($"FCMManager getTokenAsync error, filePath = {filePath}", e);
    24                 return null;
    25             }
    26         }

    2.从json解析ProjectId

     1 private static string GetProjectId(string serviceAccountKeyFile)
     2         {
     3             var serviceAccountKeyJson = File.ReadAllText(serviceAccountKeyFile);
     4             var serviceAccountKeyDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(serviceAccountKeyJson);
     5 
     6             if (!serviceAccountKeyDictionary.ContainsKey("project_id"))
     7             {
     8                 throw new Exception($"Could not read Project ID from ServiceAccountKey File '{serviceAccountKeyFile}'");
     9             }
    10 
    11             return serviceAccountKeyDictionary["project_id"];
    12         }

    3.发送消息

     1 public async Task<AcceptorNoticeInfo> SendAsync(FcmMessage message, string filePath)
     2         {
     3             try
     4             {
     5                 var token = await GetTokenAsync(filePath).ConfigureAwait(false);
     6                 if (token == null)
     7                 {
     8                     _redisDBManager.Remove(filePath);
     9                     token = await GetTokenAsync(filePath).ConfigureAwait(false);
    10                 }
    11 
    12                 var httpClient = new HttpClient();
    13                 httpClient.DefaultRequestHeaders
    14                     .Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    15                 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {token}");
    16 
    17                 StringContent content = new StringContent(JsonConvert.SerializeObject(message, new JsonSerializerSettings()
    18                 {
    19                     NullValueHandling = NullValueHandling.Ignore
    20                 }));
    21                 var projectId = GetProjectId(filePath);
    22                 var url = $"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send";
    23 
    24                 var responseMessage = await httpClient.PostAsync(url, content)
    25                     .ConfigureAwait(false);
    26 
    27                 if (responseMessage.StatusCode == HttpStatusCode.OK)
    28                 {31                     return new AcceptorNoticeInfo()
    32                     {
    33                         ErrorCode = (int)NoticeError.Success,
    34                         ErrorMessage = NoticeError.Success.ToString()
    35                     };
    36                 }
    37                 else
    38                 {
    39                     var responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
    40                     var error = JsonConvert.DeserializeObject<FcmMessageErrorResponse>(responseContent);
    41                     return new AcceptorNoticeInfo()
    42                     {
    43                         ErrorCode = (int)responseMessage.StatusCode,
    44                         ErrorMessage = error.Error["message"].ToString()
    45                     };
    46                 }
    47             }
    48             catch (Exception ex)
    49             {
    50                 Logger.LogError($"FCM SendAsync error. token = {message.Message.Token}, topic = {message.Message.Token}{message.Message.Condition}", ex);
    51                 return new AcceptorNoticeInfo()
    52                 {
    53                     ErrorCode = (int)NoticeError.Failed,
    54                     ErrorMessage = NoticeError.Failed.ToString()
    55                 };
    56             }
    57             
    58 
    59         }
  • 相关阅读:
    P1983 车站分级
    P1807 最长路
    P1347 排序
    P1073 最优贸易 (tarjan缩点+dp)
    最小费用最大流解决KM匹配问题
    CF191C Fools and Roads
    case when
    防呆机制
    DbCommand :执行超时已过期。完成操作之前已超时或服务器未响应。
    存储过程带参数和sqlcommand
  • 原文地址:https://www.cnblogs.com/sylvialucy/p/10196258.html
Copyright © 2020-2023  润新知