颐和api

LoginController.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using MadRunFabric.Common;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.Extensions.Configuration;
  8. using Senparc.Weixin.MP;
  9. using Senparc.Weixin.MP.AdvancedAPIs;
  10. using MadRunFabric.Model;
  11. using Api.SignToken;
  12. using Microsoft.Extensions.Logging;
  13. using NLog;
  14. using Microsoft.AspNetCore.Cors;
  15. using Senparc.Weixin.MP.Containers;
  16. using Microsoft.Net.Http.Headers;
  17. using Microsoft.Extensions.Caching.Distributed;
  18. namespace WechatApi.Controllers
  19. {
  20. [ApiVersion("6.0")]
  21. [Produces("application/json")]
  22. [Route("api/[controller]")]
  23. public class LoginController : BaseController
  24. {
  25. private readonly string AppId;
  26. private readonly string AppSecret;
  27. private readonly string FocusUrl;
  28. private readonly string QRCodeTimeOut;
  29. private readonly IDistributedCache _cache;
  30. private readonly ISignTokenService _signTokenService;
  31. static Logger Logger = LogManager.GetCurrentClassLogger();
  32. public LoginController(IConfiguration configuration, IDistributedCache cache, ISignTokenService signTokenService)
  33. {
  34. AppId = configuration["WechatStatic:AppId"];
  35. AppSecret = configuration["WechatStatic:AppSecret"];
  36. FocusUrl = configuration["WechatStatic:FocusUrl"];
  37. QRCodeTimeOut = configuration["WechatStatic:QRCodeTimeOut"];
  38. _signTokenService = signTokenService;
  39. _cache = cache;
  40. }
  41. /// <summary>
  42. /// 获取UserInfo 和 Token
  43. /// </summary>
  44. /// <param name="wxLoginDto"></param>
  45. /// <returns></returns>
  46. [HttpPost("getuserinfotoken")]
  47. public async Task<IActionResult> GetUserInfoTokenAsync(string code)
  48. {
  49. if (string.IsNullOrWhiteSpace(code))
  50. {
  51. var refurl = Request.Headers[HeaderNames.Referer].ToString();
  52. var url = OAuthApi.GetAuthorizeUrl(AppId, refurl, "qwertyuidfghjkl", OAuthScope.snsapi_userinfo);
  53. return Redirect("跳转", url);
  54. }
  55. var access = await OAuthApi.GetAccessTokenAsync(AppId, AppSecret, code);
  56. var userinfo = await OAuthApi.GetUserInfoAsync(access.access_token, access.openid);
  57. #region 发送请求获取系统内验证Token
  58. var res = await _signTokenService.Wechat_LoginAsync(userinfo.openid, userinfo.nickname, userinfo.headimgurl);
  59. #endregion
  60. return Content(res);
  61. }
  62. /// <summary>
  63. /// 获取UserInfo
  64. /// </summary>
  65. /// <param name="wxLoginDto"></param>
  66. /// <returns></returns>
  67. [HttpGet("getuserinfo")]
  68. public IActionResult GetUserInfoAsync(string openid)
  69. {
  70. var accessToken = AccessTokenContainer.GetAccessToken(AppId);
  71. Senparc.Weixin.MP.AdvancedAPIs.User.UserInfoJson userInfos = UserApi.Info(accessToken, openid);
  72. return Success("成功", userInfos);
  73. }
  74. /// <summary>
  75. /// 获取二维码图片
  76. /// </summary>
  77. /// <param name="wxLoginDto"></param>
  78. /// <returns></returns>
  79. [HttpGet("getqrcode")]
  80. public async Task<IActionResult> GetQRCodeAsync(string usercode)
  81. {
  82. string url= await _cache.GetStringAsync($"qrcode{usercode}");
  83. if (string.IsNullOrEmpty(url))
  84. {
  85. int timeout = int.Parse(QRCodeTimeOut);
  86. var ExpirationTime = DateTime.Now.AddSeconds(timeout);
  87. var accessToken = AccessTokenContainer.GetAccessToken(AppId);
  88. var cre = await QrCodeApi.CreateAsync(accessToken, timeout, 1, QrCode_ActionName.QR_STR_SCENE, usercode);
  89. url = QrCodeApi.GetShowQrCodeUrl(cre.ticket);
  90. DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
  91. options.AbsoluteExpiration = ExpirationTime;
  92. await _cache.SetStringAsync($"qrcode{usercode}", url, options);
  93. }
  94. return Success("成功", url);
  95. }
  96. }
  97. }