WeChatService.cs 2.5 KB

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