WeChatService.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Hotline.Settings;
  2. using Hotline.Share.Dtos.Snapshot;
  3. using Hotline.Share.Tools;
  4. using Hotline.ThirdAccountDomainServices.Interfaces;
  5. using Microsoft.Extensions.Logging;
  6. using Senparc.CO2NET.Extensions;
  7. using Senparc.Weixin;
  8. using Senparc.Weixin.WxOpen.AdvancedAPIs.Sns;
  9. using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp;
  10. using Senparc.Weixin.WxOpen.Containers;
  11. using XF.Domain.Dependency;
  12. using XF.Domain.Exceptions;
  13. namespace Hotline.WeChat;
  14. public class WeChatService : IThirdIdentiyService, IScopeDependency
  15. {
  16. private readonly ILogger<WeChatService> _logger;
  17. private readonly ISystemLogRepository _systemLog;
  18. public WeChatService(ILogger<WeChatService> logger, ISystemLogRepository systemLog)
  19. {
  20. _logger = logger;
  21. _systemLog = systemLog;
  22. }
  23. public async Task<ThirdTokenOutDto> GetTokenAsync(ThirdTokenDto dto, CancellationToken token)
  24. {
  25. try
  26. {
  27. GetWebApiHost(dto.WebApiHost);
  28. var result = await SnsApi.JsCode2JsonAsync(dto.AppId, dto.Secret, dto.LoginCode);
  29. _systemLog.Add("微信获取Token", dto, status: 1, executeResult: result.ToJson());
  30. if (result.errcode != ReturnCode.请求成功) throw UserFriendlyException.SameMessage("获取微信用户信息失败");
  31. return new ThirdTokenOutDto() { SessionKey = result.session_key, OpenId = result.openid , UnIonId = result.unionid};
  32. }
  33. catch (Exception e)
  34. {
  35. _logger.LogError("微信登录失败:" + e.Message + "\r\n" + e.StackTrace);
  36. throw UserFriendlyException.SameMessage("微信登录失败:" + e.Message);
  37. }
  38. }
  39. /// <summary>
  40. /// 获取手机号码
  41. /// </summary>
  42. /// <param name="dto"></param>
  43. /// <returns></returns>
  44. public async Task<ThirdPhoneOutDto> GetPhoneNumberAsync(ThirdTokenDto dto, CancellationToken token)
  45. {
  46. GetWebApiHost(dto.WebApiHost);
  47. await AccessTokenContainer.RegisterAsync(dto.AppId, dto.Secret);
  48. _logger.LogInformation($"GetPhoneNumberAsync: {dto.ToJson()}");
  49. var result = await BusinessApi.GetUserPhoneNumberAsync(dto.AppId, dto.TelCode);
  50. _systemLog.Add("微信获取手机号码", dto, status: 1, executeResult: result.ToJson());
  51. if (result.errcode != ReturnCode.请求成功)
  52. _logger.LogError($"GetPhoneNumberAsync: {result.ToJson()}");
  53. return new ThirdPhoneOutDto()
  54. {
  55. ErrorCode = (int)result.errcode,
  56. IsError = result.errcode != ReturnCode.请求成功,
  57. ErrorMessage = result.errmsg + " " + result.errcode,
  58. PhoneNumber = result.phone_info?.phoneNumber,
  59. };
  60. }
  61. private void GetWebApiHost(string? webApiHost)
  62. {
  63. if (webApiHost.NotNullOrEmpty())
  64. Config.ApiMpHost = webApiHost;
  65. }
  66. }