SysWxOpenService.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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 = 240)]
  14. public class SysWxOpenService : IDynamicApiController, ITransient
  15. {
  16. private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
  17. private readonly SysConfigService _sysConfigService;
  18. private readonly WechatApiClient _wechatApiClient;
  19. public SysWxOpenService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
  20. SysConfigService sysConfigService,
  21. WechatApiHttpClientFactory wechatApiHttpClientFactory)
  22. {
  23. _sysWechatUserRep = sysWechatUserRep;
  24. _sysConfigService = sysConfigService;
  25. _wechatApiClient = wechatApiHttpClientFactory.CreateWxOpenClient();
  26. }
  27. /// <summary>
  28. /// 获取微信用户OpenId
  29. /// </summary>
  30. /// <param name="input"></param>
  31. [AllowAnonymous]
  32. [DisplayName("获取微信用户OpenId")]
  33. public async Task<WxOpenIdOutput> GetWxOpenId([FromQuery] JsCode2SessionInput input)
  34. {
  35. var reqJsCode2Session = new SnsJsCode2SessionRequest()
  36. {
  37. JsCode = input.JsCode,
  38. };
  39. var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session);
  40. if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  41. throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode);
  42. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resCode2Session.OpenId);
  43. if (wxUser == null)
  44. {
  45. wxUser = new SysWechatUser
  46. {
  47. OpenId = resCode2Session.OpenId,
  48. UnionId = resCode2Session.UnionId,
  49. SessionKey = resCode2Session.SessionKey,
  50. PlatformType = PlatformTypeEnum.微信小程序
  51. };
  52. wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
  53. }
  54. else
  55. {
  56. await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
  57. }
  58. return new WxOpenIdOutput
  59. {
  60. OpenId = resCode2Session.OpenId
  61. };
  62. }
  63. /// <summary>
  64. /// 获取微信用户电话号码
  65. /// </summary>
  66. /// <param name="input"></param>
  67. [AllowAnonymous]
  68. [DisplayName("获取微信用户电话号码")]
  69. public async Task<WxPhoneOutput> GetWxPhone([FromQuery] WxPhoneInput input)
  70. {
  71. var accessToken = await GetCgibinToken();
  72. var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest()
  73. {
  74. Code = input.Code,
  75. AccessToken = accessToken,
  76. };
  77. var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber);
  78. if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  79. throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode);
  80. return new WxPhoneOutput
  81. {
  82. PhoneNumber = resUserPhoneNumber.PhoneInfo?.PhoneNumber
  83. };
  84. }
  85. /// <summary>
  86. /// 微信小程序登录OpenId
  87. /// </summary>
  88. /// <param name="input"></param>
  89. /// <returns></returns>
  90. [AllowAnonymous]
  91. [DisplayName("微信小程序登录OpenId")]
  92. public async Task<dynamic> WxOpenIdLogin(WxOpenIdLoginInput input)
  93. {
  94. var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
  95. if (wxUser == null)
  96. throw Oops.Oh("微信小程序登录失败");
  97. var tokenExpire = await _sysConfigService.GetTokenExpire();
  98. return new
  99. {
  100. wxUser.Avatar,
  101. accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
  102. {
  103. { ClaimConst.UserId, wxUser.Id },
  104. { ClaimConst.RealName, wxUser.NickName },
  105. { ClaimConst.LoginMode, LoginModeEnum.APP },
  106. }, tokenExpire)
  107. };
  108. }
  109. /// <summary>
  110. /// 获取订阅消息模板列表
  111. /// </summary>
  112. [DisplayName("获取订阅消息模板列表")]
  113. public async Task<dynamic> GetMessageTemplateList()
  114. {
  115. var accessToken = await GetCgibinToken();
  116. var reqTemplate = new WxaApiNewTemplateGetTemplateRequest()
  117. {
  118. AccessToken = accessToken
  119. };
  120. var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateGetTemplateAsync(reqTemplate);
  121. if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  122. throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode);
  123. return resTemplate.TemplateList;
  124. }
  125. /// <summary>
  126. /// 发送订阅消息
  127. /// </summary>
  128. /// <param name="input"></param>
  129. /// <returns></returns>
  130. [DisplayName("发送订阅消息")]
  131. public async Task<dynamic> SendSubscribeMessage(SendSubscribeMessageInput input)
  132. {
  133. var accessToken = await GetCgibinToken();
  134. var reqMessage = new CgibinMessageSubscribeSendRequest()
  135. {
  136. AccessToken = accessToken,
  137. TemplateId = input.TemplateId,
  138. ToUserOpenId = input.ToUserOpenId,
  139. Data = input.Data,
  140. MiniProgramState = input.MiniprogramState,
  141. Language = input.Language,
  142. MiniProgramPagePath = input.MiniProgramPagePath
  143. };
  144. var resMessage = await _wechatApiClient.ExecuteCgibinMessageSubscribeSendAsync(reqMessage);
  145. return resMessage;
  146. }
  147. /// <summary>
  148. /// 增加订阅消息模板
  149. /// </summary>
  150. /// <param name="input"></param>
  151. /// <returns></returns>
  152. [ApiDescriptionSettings(Name = "AddSubscribeMessageTemplate"), HttpPost]
  153. [DisplayName("增加订阅消息模板")]
  154. public async Task<dynamic> AddSubscribeMessageTemplate(AddSubscribeMessageTemplateInput input)
  155. {
  156. var accessToken = await GetCgibinToken();
  157. var reqMessage = new WxaApiNewTemplateAddTemplateRequest()
  158. {
  159. AccessToken = accessToken,
  160. TemplateTitleId = input.TemplateTitleId,
  161. KeyworkIdList = input.KeyworkIdList,
  162. SceneDescription = input.SceneDescription
  163. };
  164. var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateAddTemplateAsync(reqMessage);
  165. return resTemplate;
  166. }
  167. /// <summary>
  168. /// 获取Access_token
  169. /// </summary>
  170. private async Task<string> GetCgibinToken()
  171. {
  172. var reqCgibinToken = new CgibinTokenRequest();
  173. var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken);
  174. if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
  175. throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
  176. return resCgibinToken.AccessToken;
  177. }
  178. }