SysWechatService.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. namespace Admin.NET.Core.Service;
  10. /// <summary>
  11. /// 微信公众号服务
  12. /// </summary>
  13. [ApiDescriptionSettings(Order = 230)]
  14. public class SysWechatService : IDynamicApiController, ITransient
  15. {
  16. private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
  17. private readonly WechatApiClient _wechatApiClient;
  18. public SysWechatService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
  19. WechatApiHttpClient wechatApiHttpClient)
  20. {
  21. _sysWechatUserRep = sysWechatUserRep;
  22. _wechatApiClient = wechatApiHttpClient.CreateWechatClient();
  23. }
  24. /// <summary>
  25. /// 生成网页授权Url
  26. /// </summary>
  27. /// <param name="input"></param>
  28. /// <returns></returns>
  29. [AllowAnonymous]
  30. [DisplayName("生成网页授权Url")]
  31. public string GenAuthUrl(GenAuthUrlInput input)
  32. {
  33. return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope, null);
  34. }
  35. /// <summary>
  36. /// 获取微信用户OpenId
  37. /// </summary>
  38. /// <param name="input"></param>
  39. [AllowAnonymous]
  40. [DisplayName("获取微信用户OpenId")]
  41. public async Task<string> SnsOAuth2([FromQuery] WechatOAuth2Input input)
  42. {
  43. var reqOAuth2 = new SnsOAuth2AccessTokenRequest()
  44. {
  45. Code = input.Code,
  46. };
  47. var resOAuth2 = await _wechatApiClient.ExecuteSnsOAuth2AccessTokenAsync(reqOAuth2);
  48. if (resOAuth2.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  49. throw Oops.Oh(resOAuth2.ErrorMessage + " " + resOAuth2.ErrorCode);
  50. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resOAuth2.OpenId);
  51. if (wxUser == null)
  52. {
  53. var reqUserInfo = new SnsUserInfoRequest()
  54. {
  55. OpenId = resOAuth2.OpenId,
  56. AccessToken = resOAuth2.AccessToken,
  57. };
  58. var resUserInfo = await _wechatApiClient.ExecuteSnsUserInfoAsync(reqUserInfo);
  59. wxUser = resUserInfo.Adapt<SysWechatUser>();
  60. wxUser.Avatar = resUserInfo.HeadImageUrl;
  61. wxUser.NickName = resUserInfo.Nickname;
  62. wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
  63. }
  64. else
  65. {
  66. wxUser.AccessToken = resOAuth2.AccessToken;
  67. wxUser.RefreshToken = resOAuth2.RefreshToken;
  68. await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
  69. }
  70. return resOAuth2.OpenId;
  71. }
  72. /// <summary>
  73. /// 微信用户登录OpenId
  74. /// </summary>
  75. /// <param name="input"></param>
  76. /// <returns></returns>
  77. [AllowAnonymous]
  78. [DisplayName("微信用户登录OpenId")]
  79. public async Task<dynamic> OpenIdLogin(WechatUserLogin input)
  80. {
  81. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
  82. if (wxUser == null)
  83. throw Oops.Oh("微信用户登录OpenId错误");
  84. return new
  85. {
  86. wxUser.Avatar,
  87. accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
  88. {
  89. { ClaimConst.UserId, wxUser.Id },
  90. { ClaimConst.OpenId, wxUser.OpenId },
  91. { ClaimConst.NickName, wxUser.NickName },
  92. { ClaimConst.LoginMode, LoginModeEnum.APP },
  93. })
  94. };
  95. }
  96. /// <summary>
  97. /// 获取配置签名参数(wx.config)
  98. /// </summary>
  99. /// <returns></returns>
  100. [DisplayName("获取配置签名参数(wx.config)")]
  101. public async Task<dynamic> GenConfigPara(SignatureInput input)
  102. {
  103. var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(new CgibinTokenRequest());
  104. var request = new CgibinTicketGetTicketRequest()
  105. {
  106. AccessToken = resCgibinToken.AccessToken
  107. };
  108. var response = await _wechatApiClient.ExecuteCgibinTicketGetTicketAsync(request);
  109. if (!response.IsSuccessful())
  110. throw Oops.Oh(response.ErrorMessage);
  111. return _wechatApiClient.GenerateParametersForJSSDKConfig(response.Ticket, input.Url);
  112. }
  113. }