SysWxOpenService.cs 7.1 KB

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