WorkWeixinNotifyPusher.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System.Net.Http;
  2. using System.Net.Http.Json;
  3. namespace Admin.NET.Plugin.ApprovalFlow.Service;
  4. /// <summary>
  5. /// 企业微信推送(P4-16 - 首版 Webhook 机制)
  6. /// 通过配置的群机器人 Webhook URL(含 key)推送文本消息。
  7. /// 不做企微应用消息(需要 WeixinId 与 AgentId,留待后续 P5 补齐 SysUser.WeixinId 字段)。
  8. /// </summary>
  9. public class WorkWeixinNotifyPusher : INotifyPusher, ITransient
  10. {
  11. public string Channel => "WorkWeixin";
  12. private static readonly HttpClient _httpClient = new() { Timeout = TimeSpan.FromSeconds(5) };
  13. public bool IsEnabled(NotifyChannelConfig cfg) =>
  14. cfg?.WorkWeixin == true && !string.IsNullOrWhiteSpace(cfg.WorkWeixinWebhookUrl);
  15. public async Task<FlowNotifyPushResult> PushAsync(List<long> userIds, FlowNotification notification)
  16. {
  17. var cfg = App.GetConfig<NotifyChannelConfig>("ApprovalFlow:Notify");
  18. var url = cfg?.WorkWeixinWebhookUrl;
  19. if (string.IsNullOrWhiteSpace(url)) return FlowNotifyPushResult.Ok(0);
  20. var content = $"【{notification.Title}】\n{notification.Content}\n实例: {notification.InstanceId}";
  21. var payload = new { msgtype = "text", text = new { content } };
  22. try
  23. {
  24. var resp = await _httpClient.PostAsJsonAsync(url, payload);
  25. var body = await resp.Content.ReadAsStringAsync();
  26. if (!resp.IsSuccessStatusCode)
  27. return FlowNotifyPushResult.Fail($"HTTP {(int)resp.StatusCode}: {body}");
  28. if (body.Contains("\"errcode\":0") || body.Contains("errcode\": 0"))
  29. return FlowNotifyPushResult.Ok(userIds.Count);
  30. return FlowNotifyPushResult.Fail($"WorkWeixin resp: {body}");
  31. }
  32. catch (Exception ex)
  33. {
  34. return FlowNotifyPushResult.Fail(ex.Message);
  35. }
  36. }
  37. }