SysWxOpenService.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 微信小程序服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 250)]
  6. public class SysWxOpenService : IDynamicApiController, ITransient
  7. {
  8. private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
  9. private readonly WechatApiClient _wechatApiClient;
  10. public SysWxOpenService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
  11. WechatApiHttpClient wechatApiHttpClient)
  12. {
  13. _sysWechatUserRep = sysWechatUserRep;
  14. _wechatApiClient = wechatApiHttpClient.CreateWxOpenClient();
  15. }
  16. /// <summary>
  17. /// 获取微信用户OpenId
  18. /// </summary>
  19. /// <param name="input"></param>
  20. [AllowAnonymous]
  21. [DisplayName("获取微信用户OpenId")]
  22. public async Task<WxOpenIdOutput> GetWxOpenId([FromQuery] JsCode2SessionInput input)
  23. {
  24. var reqJsCode2Session = new SnsJsCode2SessionRequest()
  25. {
  26. JsCode = input.JsCode,
  27. };
  28. var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session);
  29. if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  30. throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode);
  31. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resCode2Session.OpenId);
  32. if (wxUser == null)
  33. {
  34. wxUser = new SysWechatUser
  35. {
  36. OpenId = resCode2Session.OpenId,
  37. UnionId = resCode2Session.UnionId,
  38. SessionKey = resCode2Session.SessionKey,
  39. PlatformType = PlatformTypeEnum.微信小程序
  40. };
  41. wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
  42. }
  43. else
  44. {
  45. await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
  46. }
  47. return new WxOpenIdOutput
  48. {
  49. OpenId = resCode2Session.OpenId
  50. };
  51. }
  52. /// <summary>
  53. /// 获取微信用户电话号码
  54. /// </summary>
  55. /// <param name="input"></param>
  56. [AllowAnonymous]
  57. [DisplayName("获取微信用户电话号码")]
  58. public async Task<WxPhoneOutput> GetWxPhone([FromQuery] WxPhoneInput input)
  59. {
  60. var reqCgibinToken = new CgibinTokenRequest();
  61. var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken);
  62. if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  63. throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
  64. var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest()
  65. {
  66. Code = input.Code,
  67. AccessToken = resCgibinToken.AccessToken,
  68. };
  69. var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber);
  70. if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  71. throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode);
  72. return new WxPhoneOutput
  73. {
  74. PhoneNumber = resUserPhoneNumber.PhoneInfo?.PhoneNumber
  75. };
  76. }
  77. /// <summary>
  78. /// 微信小程序登录OpenId
  79. /// </summary>
  80. /// <param name="input"></param>
  81. /// <returns></returns>
  82. [AllowAnonymous]
  83. [DisplayName("微信小程序登录OpenId")]
  84. public async Task<dynamic> WxOpenIdLogin(WxOpenIdLoginInput input)
  85. {
  86. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
  87. if (wxUser == null)
  88. throw Oops.Oh("微信小程序登录失败");
  89. return new
  90. {
  91. wxUser.Avatar,
  92. accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
  93. {
  94. { ClaimConst.UserId, wxUser.Id },
  95. { ClaimConst.OpenId, wxUser.OpenId },
  96. { ClaimConst.RealName, wxUser.NickName },
  97. { ClaimConst.LoginMode, LoginModeEnum.APP },
  98. })
  99. };
  100. }
  101. }