SysWxOpenService.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证。
  2. //
  3. // 必须在法律法规允许的范围内正确使用,严禁将其用于非法、欺诈、恶意或侵犯他人合法权益的目的。
  4. namespace Admin.NET.Core.Service;
  5. /// <summary>
  6. /// 微信小程序服务 💥
  7. /// </summary>
  8. [ApiDescriptionSettings(Order = 240)]
  9. public class SysWxOpenService : IDynamicApiController, ITransient
  10. {
  11. private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
  12. private readonly SysConfigService _sysConfigService;
  13. private readonly WechatApiClient _wechatApiClient;
  14. public SysWxOpenService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
  15. SysConfigService sysConfigService,
  16. WechatApiClientFactory wechatApiClientFactory)
  17. {
  18. _sysWechatUserRep = sysWechatUserRep;
  19. _sysConfigService = sysConfigService;
  20. _wechatApiClient = wechatApiClientFactory.CreateWxOpenClient();
  21. }
  22. /// <summary>
  23. /// 获取微信用户OpenId 🔖
  24. /// </summary>
  25. /// <param name="input"></param>
  26. [AllowAnonymous]
  27. [DisplayName("获取微信用户OpenId")]
  28. public async Task<WxOpenIdOutput> GetWxOpenId([FromQuery] JsCode2SessionInput input)
  29. {
  30. var reqJsCode2Session = new SnsJsCode2SessionRequest()
  31. {
  32. JsCode = input.JsCode,
  33. };
  34. var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session);
  35. if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  36. throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode);
  37. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resCode2Session.OpenId);
  38. if (wxUser == null)
  39. {
  40. wxUser = new SysWechatUser
  41. {
  42. OpenId = resCode2Session.OpenId,
  43. UnionId = resCode2Session.UnionId,
  44. SessionKey = resCode2Session.SessionKey,
  45. PlatformType = PlatformTypeEnum.微信小程序
  46. };
  47. wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
  48. }
  49. else
  50. {
  51. await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
  52. }
  53. return new WxOpenIdOutput
  54. {
  55. OpenId = resCode2Session.OpenId
  56. };
  57. }
  58. /// <summary>
  59. /// 获取微信用户电话号码 🔖
  60. /// </summary>
  61. /// <param name="input"></param>
  62. [AllowAnonymous]
  63. [DisplayName("获取微信用户电话号码")]
  64. public async Task<WxPhoneOutput> GetWxPhone([FromQuery] WxPhoneInput input)
  65. {
  66. var accessToken = await GetCgibinToken();
  67. var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest()
  68. {
  69. Code = input.Code,
  70. AccessToken = accessToken,
  71. };
  72. var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber);
  73. if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  74. throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode);
  75. return new WxPhoneOutput
  76. {
  77. PhoneNumber = resUserPhoneNumber.PhoneInfo?.PhoneNumber
  78. };
  79. }
  80. /// <summary>
  81. /// 微信小程序登录OpenId 🔖
  82. /// </summary>
  83. /// <param name="input"></param>
  84. /// <returns></returns>
  85. [AllowAnonymous]
  86. [DisplayName("微信小程序登录OpenId")]
  87. public async Task<dynamic> WxOpenIdLogin(WxOpenIdLoginInput input)
  88. {
  89. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
  90. if (wxUser == null)
  91. throw Oops.Oh("微信小程序登录失败");
  92. var tokenExpire = await _sysConfigService.GetTokenExpire();
  93. return new
  94. {
  95. wxUser.Avatar,
  96. accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
  97. {
  98. { ClaimConst.UserId, wxUser.Id },
  99. { ClaimConst.RealName, wxUser.NickName },
  100. { ClaimConst.LoginMode, LoginModeEnum.APP },
  101. }, tokenExpire)
  102. };
  103. }
  104. /// <summary>
  105. /// 获取订阅消息模板列表 🔖
  106. /// </summary>
  107. [DisplayName("获取订阅消息模板列表")]
  108. public async Task<dynamic> GetMessageTemplateList()
  109. {
  110. var accessToken = await GetCgibinToken();
  111. var reqTemplate = new WxaApiNewTemplateGetTemplateRequest()
  112. {
  113. AccessToken = accessToken
  114. };
  115. var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateGetTemplateAsync(reqTemplate);
  116. if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  117. throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode);
  118. return resTemplate.TemplateList;
  119. }
  120. /// <summary>
  121. /// 发送订阅消息 🔖
  122. /// </summary>
  123. /// <param name="input"></param>
  124. /// <returns></returns>
  125. [DisplayName("发送订阅消息")]
  126. public async Task<dynamic> SendSubscribeMessage(SendSubscribeMessageInput input)
  127. {
  128. var accessToken = await GetCgibinToken();
  129. var reqMessage = new CgibinMessageSubscribeSendRequest()
  130. {
  131. AccessToken = accessToken,
  132. TemplateId = input.TemplateId,
  133. ToUserOpenId = input.ToUserOpenId,
  134. Data = input.Data,
  135. MiniProgramState = input.MiniprogramState,
  136. Language = input.Language,
  137. MiniProgramPagePath = input.MiniProgramPagePath
  138. };
  139. var resMessage = await _wechatApiClient.ExecuteCgibinMessageSubscribeSendAsync(reqMessage);
  140. return resMessage;
  141. }
  142. /// <summary>
  143. /// 增加订阅消息模板 🔖
  144. /// </summary>
  145. /// <param name="input"></param>
  146. /// <returns></returns>
  147. [ApiDescriptionSettings(Name = "AddSubscribeMessageTemplate"), HttpPost]
  148. [DisplayName("增加订阅消息模板")]
  149. public async Task<dynamic> AddSubscribeMessageTemplate(AddSubscribeMessageTemplateInput input)
  150. {
  151. var accessToken = await GetCgibinToken();
  152. var reqMessage = new WxaApiNewTemplateAddTemplateRequest()
  153. {
  154. AccessToken = accessToken,
  155. TemplateTitleId = input.TemplateTitleId,
  156. KeyworkIdList = input.KeyworkIdList,
  157. SceneDescription = input.SceneDescription
  158. };
  159. var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateAddTemplateAsync(reqMessage);
  160. return resTemplate;
  161. }
  162. /// <summary>
  163. /// 获取Access_token
  164. /// </summary>
  165. private async Task<string> GetCgibinToken()
  166. {
  167. var reqCgibinToken = new CgibinTokenRequest();
  168. var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken);
  169. if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  170. throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
  171. return resCgibinToken.AccessToken;
  172. }
  173. }