WxController.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using Autofac.Core;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Caching.Memory;
  5. using Microsoft.Extensions.Options;
  6. using Newtonsoft.Json;
  7. using NPOI.SS.Formula.Functions;
  8. using Ropin.Core.Extensions;
  9. using Ropin.Inspection.Api.Common;
  10. using Ropin.Inspection.Api.Common.Options;
  11. using Ropin.Inspection.Api.Common.Token;
  12. using Ropin.Inspection.Api.Filters;
  13. using Ropin.Inspection.Api.Wx;
  14. using Ropin.Inspection.Common.Helper;
  15. using Ropin.Inspection.Model.Entities;
  16. using Ropin.Inspection.Model.ViewModel;
  17. using Ropin.Inspection.Service.Interface;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Net.Http;
  23. using System.Security.Claims;
  24. using System.Threading.Tasks;
  25. using System.Xml;
  26. namespace Ropin.Inspection.Api.Controllers
  27. {
  28. public class WxController : BaseController
  29. {
  30. private readonly IOptionsMonitor<WXOptions> _options;
  31. private readonly IHttpClientFactory _httpClientFactory;
  32. private readonly IMemoryCache _memoryCache;
  33. private readonly ITsysUserService _userService;
  34. private readonly ITokenHelper _tokenHelper;
  35. public WxController(IOptionsMonitor<WXOptions> options, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache, ITsysUserService userService, ITokenHelper tokenHelper)
  36. {
  37. _options = options;
  38. _httpClientFactory = httpClientFactory;
  39. _memoryCache = memoryCache;
  40. _userService = userService;
  41. _tokenHelper = tokenHelper;
  42. }
  43. // GET: api/<controller>
  44. [HttpGet]
  45. public ActionResult Get(SignatureModel signatureModel)
  46. {
  47. signatureModel.Token = _options.Get("WXOptions").Token;
  48. string rtnStr;
  49. if (SignatureHelper.Check(signatureModel))
  50. {
  51. rtnStr = signatureModel.Echostr;
  52. }
  53. else
  54. {
  55. rtnStr = signatureModel.Signature + signatureModel.Timestamp + signatureModel.Nonce + signatureModel.Echostr;
  56. }
  57. return Content(rtnStr);
  58. }
  59. /// <summary>
  60. /// 获取ai公众号的openID
  61. /// </summary>
  62. /// <returns></returns>
  63. [HttpGet("GetOpenId")]
  64. [AllowAnonymous]
  65. public async Task<ApiResult> GetOpenId(string jsCode)
  66. {
  67. var openid = await (new WeChatHelper(_httpClientFactory)).GetOpenIdByCodeAsync(jsCode);
  68. return new ApiResult<string>(openid, ReturnCode.Success);
  69. }
  70. /// <summary>
  71. /// 获取ai公众号的openID
  72. /// </summary>
  73. /// <returns></returns>
  74. [HttpGet("GetQRCode")]
  75. [AllowAnonymous]
  76. public async Task<ApiResult> GetQRCode()
  77. {
  78. var openid = await (new WeChatHelper(_httpClientFactory)).GetQRCode();
  79. return new ApiResult<WeChatQrCodeModel>(openid, ReturnCode.Success);
  80. }
  81. /// <summary>
  82. /// 服务器配置认证
  83. /// </summary>
  84. /// <param name="signature"></param>
  85. /// <param name="timestamp"></param>
  86. /// <param name="nonce"></param>
  87. /// <param name="echostr"></param>
  88. /// <returns></returns>
  89. [HttpGet("event")]
  90. [AllowAnonymous]
  91. public async Task<IActionResult> Verify(
  92. [FromQuery] string signature,
  93. [FromQuery] string timestamp,
  94. [FromQuery] string nonce,
  95. [FromQuery] string echostr)
  96. {
  97. try
  98. {
  99. using var reader = new StreamReader(Request.Body);
  100. var xmlContent = await reader.ReadToEndAsync();
  101. }
  102. catch (Exception ex)
  103. {
  104. // 记录日志
  105. return StatusCode(500);
  106. }
  107. // 验证逻辑可在此添加
  108. return Content(echostr);
  109. }
  110. /// <summary>
  111. /// 服务器事件推送
  112. /// </summary>
  113. /// <returns></returns>
  114. [HttpPost("event")]
  115. [AllowAnonymous]
  116. public async Task<IActionResult> HandleEvent()
  117. {
  118. try
  119. {
  120. using var reader = new StreamReader(Request.Body);
  121. var xmlContent = await reader.ReadToEndAsync();
  122. var xmlDoc = new XmlDocument();
  123. xmlDoc.LoadXml(xmlContent);
  124. var message = new Dictionary<string, string>();
  125. foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
  126. {
  127. message[node.Name] = node.InnerText;
  128. }
  129. var json = JsonConvert.SerializeObject(message);
  130. var callBack = JsonConvert.DeserializeObject<WeChatCallBack>(json);
  131. //扫码把openid存缓存
  132. _memoryCache.Set(callBack.Ticket, callBack.FromUserName, TimeSpan.FromMinutes(5));
  133. //if (_memoryCache.TryGetValue(callBack.Ticket, out string scan))
  134. //{
  135. // _memoryCache.Set(callBack.Ticket, callBack.FromUserName, TimeSpan.FromMinutes(5));
  136. //}
  137. //else
  138. //{
  139. // _memoryCache.Set(callBack.Ticket, callBack.FromUserName, TimeSpan.FromMinutes(5));
  140. //}
  141. return Ok();
  142. }
  143. catch (Exception ex)
  144. {
  145. // 记录日志
  146. return StatusCode(500);
  147. }
  148. }
  149. /// <summary>
  150. /// 扫码登录
  151. /// </summary>
  152. /// <returns></returns>
  153. [HttpPost("ScanLogin")]
  154. [AllowAnonymous]
  155. public async Task<ApiResult> ScanLogin(WeChatQrCodeModel weChatQrCodeModel)
  156. {
  157. //扫码把openid存缓存
  158. if (!_memoryCache.TryGetValue(weChatQrCodeModel.ticket, out string openid))
  159. {
  160. return new ApiResult<ComplexToken>(null, ReturnCode.Success,"未收到推送");
  161. }
  162. var u = await _userService.GetUserByOpenidAsync(openid);
  163. if (u is null)
  164. {
  165. return new ApiResult(ReturnCode.LoginError, "账户不存在");
  166. }
  167. var user = await _userService.GetUserDetailByAsync(new Model.SearchModel.LoginModel { Mobile=u.C_Mobile,Password=u.C_Password,PrivModule= "SYS_PRIV_MODULE_001" });
  168. if (user.RoleTypePrivS == null || user.RoleTypePrivS.Count() == 0)
  169. {
  170. return new ApiResult(ReturnCode.LoginPriv, "没有权限");
  171. }
  172. var token = _tokenHelper.CreateToken(user);
  173. return new ApiResult<ComplexToken>(token, ReturnCode.Success);
  174. }
  175. }
  176. public class WeChatCallBack
  177. {
  178. public string ToUserName { get; set; }
  179. public string FromUserName { get; set; }
  180. public string CreateTime { get; set; }
  181. public string MsgType { get; set; }
  182. public string Event { get; set; }
  183. public string EventKey { get; set; }
  184. public string Ticket { get; set; }
  185. }
  186. }