QiYeWeChatApiService.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using OASystem.Domain.Dtos.QiYeWeChat;
  2. using OASystem.Domain.ViewModels.JuHeExchangeRate;
  3. using OASystem.Domain.ViewModels.QiYeWeChat;
  4. using Org.BouncyCastle.Ocsp;
  5. using System.Text.Json;
  6. using Ubiety.Dns.Core;
  7. namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
  8. {
  9. /// <summary>
  10. /// 聚合Api 服务
  11. /// </summary>
  12. public class QiYeWeChatApiService: IQiYeWeChatApiService
  13. {
  14. private readonly HttpClient _httpClient;
  15. private readonly string CorpId = "wwe978bef5495a0728"; //企业Id
  16. private readonly string PersonnelAssistant_AgentId = "3010011"; //人事助手Id
  17. private readonly string PersonnelAssistant_Corpsecret = "ig--IJd6TxWDMJ1wT4e-RDRcRX12v5GjB359DNATwJ4"; //人事助手凭证密钥
  18. private readonly string PunchCard_AgentId = "3010185"; //打卡Id
  19. private readonly string PunchCard_Corpsecret = "Xhrl37GOqlAjsu0VzUSJECaJdjzkDXQLbvrzRsZQb8M"; //打卡凭证密钥
  20. private readonly string Email_AgentId = "1000004"; //E-Mail Id
  21. private readonly string Email_Corpsecret = "NA1zbJM15GmgjPYwDOqz59dIo1Wnug-MbU107MeUemc"; //E-Mail 凭证密钥
  22. private readonly string AddressBook_Corpsecret = "Y1tnjh7j-BvbqAytAoXZPUbmDR6dqLTL6mXtc6PZ7fo"; //通讯录同步 凭证密钥
  23. private readonly JobPostRepository _jobPostRep;
  24. /// <summary>
  25. /// 初始化
  26. /// </summary>
  27. /// <param name="clientFactory"></param>
  28. /// <param name="jobPostRep"></param>
  29. public QiYeWeChatApiService(IHttpClientFactory clientFactory, JobPostRepository jobPostRep)
  30. {
  31. _httpClient = clientFactory.CreateClient("PublicQiYeWeChatApi"); ;
  32. _jobPostRep = jobPostRep;
  33. }
  34. /// <summary>
  35. /// 获取access_token
  36. /// </summary>
  37. /// <param name="applicationType">
  38. /// 1:人事助手
  39. /// 2:打卡
  40. /// 3:邮件
  41. /// 4:通讯录同步
  42. /// </param>
  43. /// <returns></returns>
  44. private async Task<Access_TokenView> GetTokenAsync(int applicationType)
  45. {
  46. Access_TokenView tokenResult = new Access_TokenView();
  47. Access_Token_Request access_Token = new Access_Token_Request();
  48. string cacheName = string.Empty;
  49. if (applicationType == 1)
  50. {
  51. access_Token.corpsecret = PersonnelAssistant_Corpsecret; //人事助手
  52. cacheName = "PersonnelAssistant_Access_Token";
  53. }
  54. else if (applicationType == 2)
  55. {
  56. access_Token.corpsecret = PunchCard_Corpsecret; //打卡
  57. cacheName = "PunchCard_Access_Token";
  58. }
  59. else if (applicationType == 3)
  60. {
  61. access_Token.corpsecret = Email_Corpsecret; //E-Mail
  62. cacheName = "Enail_Access_Token";
  63. }
  64. else if (applicationType == 4)
  65. {
  66. access_Token.corpsecret = AddressBook_Corpsecret; //通讯录同步
  67. cacheName = "AddressBook_Access_Token";
  68. }
  69. else
  70. {
  71. tokenResult.errmsg = "未识别应用类型Id!";
  72. return tokenResult;
  73. }
  74. string access_token = await RedisRepository.RedisFactory
  75. .CreateRedisRepository()
  76. .StringGetAsync<string>(cacheName);//string 取
  77. if (string.IsNullOrEmpty(access_token))
  78. {
  79. string access_token_url = string.Format(@"/cgi-bin/gettoken?corpid={0}&corpsecret={1}", access_Token.corpid, access_Token.corpsecret);
  80. var access_tokenReq = await _httpClient.GetAsync(access_token_url);
  81. if (access_tokenReq.IsSuccessStatusCode)
  82. {
  83. var stringResponse = await access_tokenReq.Content.ReadAsStringAsync();
  84. tokenResult = System.Text.Json.JsonSerializer.Deserialize<Access_TokenView>(stringResponse,
  85. new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
  86. if (tokenResult.errcode == 0)
  87. {
  88. TimeSpan ts = DateTime.Now.AddMinutes(118) - DateTime.Now; //设置redis 过期时间 118分钟
  89. await RedisRepository
  90. .RedisFactory
  91. .CreateRedisRepository()
  92. .StringSetAsync<string>(cacheName, tokenResult.access_token, ts);//string 存
  93. }
  94. }
  95. else
  96. {
  97. tokenResult.errmsg = "企业微信Token未获取到!";
  98. }
  99. }
  100. else
  101. {
  102. tokenResult.errcode = 0;
  103. tokenResult.access_token = access_token;
  104. }
  105. return tokenResult;
  106. }
  107. /// <summary>
  108. /// 获取部门列表
  109. /// </summary>
  110. /// <param name="access_token"></param>
  111. /// <returns></returns>
  112. private async Task<DepartmentListView> GetDepartmentAsync(string access_token)
  113. {
  114. DepartmentListView result = new DepartmentListView();
  115. string dep_url = string.Format("/cgi-bin/department/list?access_token={0}", access_token);
  116. var depReq = await _httpClient.GetAsync(dep_url);
  117. if (depReq.IsSuccessStatusCode)
  118. {
  119. var stringResponse = await depReq.Content.ReadAsStringAsync();
  120. result = System.Text.Json.JsonSerializer.Deserialize<DepartmentListView>(stringResponse,
  121. new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
  122. }
  123. else
  124. {
  125. result.errcode = -1;
  126. result.errmsg = "企业微信部门列表未获取到!";
  127. }
  128. return result;
  129. }
  130. /// <summary>
  131. /// 创建员工
  132. /// </summary>
  133. /// <param name="create_Request"></param>
  134. /// <returns></returns>
  135. public async Task<ResponseBase> CreateAsync(Create_Request create_Request)
  136. {
  137. ResponseBase responseBase = new ResponseBase();
  138. #region 职位
  139. string depName = string.Empty,
  140. jobName = string.Empty;
  141. List<Sys_JobPostI> jobs = await _jobPostRep.QueryJobPost(string.Empty);
  142. Sys_JobPostI jobPost = jobs.Where(it => it.IsDel == 0 && it.Id == Convert.ToInt32(create_Request.position)).FirstOrDefault();
  143. if (jobPost != null)
  144. {
  145. depName = jobPost.DepName;
  146. jobName = jobPost.JobName;
  147. }
  148. create_Request.position = jobName;
  149. if (string.IsNullOrEmpty(create_Request.biz_mail))
  150. {
  151. create_Request.biz_mail = string.Format("{0}@pan-american-intl.com", create_Request.userid);
  152. }
  153. #endregion
  154. Access_TokenView access_Token = new Access_TokenView();
  155. access_Token = await GetTokenAsync(4);
  156. if (access_Token.errcode == 0)
  157. {
  158. create_Request.access_token = access_Token.access_token;
  159. #region 处理部门
  160. DepartmentListView depData = await GetDepartmentAsync(access_Token.access_token);
  161. if (depData.errcode == 0)
  162. {
  163. var depData1 = depData.department.Where(x => x.name == depName).FirstOrDefault();
  164. if (depData1 != null)
  165. {
  166. create_Request.department = new List<long> { depData1.id };
  167. }
  168. else
  169. {
  170. responseBase.errcode = -1;
  171. responseBase.errmsg = "未在企业微信上找到OA内设置的部门";
  172. return responseBase;
  173. }
  174. }
  175. else
  176. {
  177. responseBase.errcode = depData.errcode;
  178. responseBase.errmsg = depData.errmsg;
  179. return responseBase;
  180. }
  181. #endregion
  182. create_Request.access_token = access_Token.access_token;
  183. string create_url = string.Format("/cgi-bin/user/create?access_token={0}", create_Request.access_token);
  184. var json = System.Text.Json.JsonSerializer.Serialize(create_Request);
  185. var content = new StringContent(json, Encoding.UTF8, "application/json");
  186. var create_Req = await _httpClient.PostAsync(create_url, content);
  187. var stringResponse = await create_Req.Content.ReadAsStringAsync();
  188. responseBase = System.Text.Json.JsonSerializer.Deserialize<ResponseBase>(stringResponse,
  189. new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
  190. }
  191. else
  192. {
  193. responseBase.errcode = access_Token.errcode;
  194. responseBase.errmsg = access_Token.errmsg;
  195. }
  196. return responseBase;
  197. }
  198. }
  199. }