CaptchaService.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using ZhonTai.DynamicApi;
  2. using ZhonTai.DynamicApi.Attributes;
  3. using ZhonTai.Admin.Core.Consts;
  4. using Lazy.SlideCaptcha.Core;
  5. using Lazy.SlideCaptcha.Core.Validator;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.AspNetCore.Authorization;
  8. using ZhonTai.Admin.Core.Attributes;
  9. using ZhonTai.Admin.Core.Captcha;
  10. using ZhonTai.Admin.Core.Dto;
  11. using static Lazy.SlideCaptcha.Core.ValidateResult;
  12. using System.Threading.Tasks;
  13. using System;
  14. using ZhonTai.Common.Helpers;
  15. using DotNetCore.CAP;
  16. using ZhonTai.Admin.Services.Captcha.Dto;
  17. namespace ZhonTai.Admin.Services.Cache;
  18. /// <summary>
  19. /// 验证码服务
  20. /// </summary>
  21. [Order(210)]
  22. [DynamicApi(Area = AdminConsts.AreaName)]
  23. public class CaptchaService : BaseService, IDynamicApi
  24. {
  25. private ICaptcha _captcha => LazyGetRequiredService<ICaptcha>();
  26. private ISlideCaptcha _slideCaptcha => LazyGetRequiredService<ISlideCaptcha>();
  27. public CaptchaService()
  28. {
  29. }
  30. /// <summary>
  31. /// 生成
  32. /// </summary>
  33. /// <param name="captchaId">验证码id</param>
  34. /// <returns></returns>
  35. [AllowAnonymous]
  36. [NoOprationLog]
  37. public CaptchaData Generate(string captchaId = null)
  38. {
  39. return _captcha.Generate(captchaId);
  40. }
  41. /// <summary>
  42. /// 验证
  43. /// </summary>
  44. /// <param name="captchaId">验证码id</param>
  45. /// <param name="track">滑动轨迹</param>
  46. /// <returns></returns>
  47. [AllowAnonymous]
  48. [NoOprationLog]
  49. public ValidateResult CheckAsync([FromQuery] string captchaId, SlideTrack track)
  50. {
  51. if (captchaId.IsNull() || track == null)
  52. {
  53. throw ResultOutput.Exception("请完成安全验证");
  54. }
  55. return _slideCaptcha.Validate(captchaId, track, false);
  56. }
  57. /// <summary>
  58. /// 发送短信验证码
  59. /// </summary>
  60. /// <param name="input"></param>
  61. /// <returns></returns>
  62. [AllowAnonymous]
  63. [NoOprationLog]
  64. public async Task<string> SendSmsCodeAsync(SendSmsCodeInput input)
  65. {
  66. if (input.Mobile.IsNull())
  67. {
  68. throw ResultOutput.Exception("请输入手机号");
  69. }
  70. if (input.CaptchaId.IsNull() || input.Track == null)
  71. {
  72. throw ResultOutput.Exception("请完成安全验证");
  73. }
  74. var validateResult = _captcha.Validate(input.CaptchaId, input.Track);
  75. if (validateResult.Result != ValidateResultType.Success)
  76. {
  77. throw ResultOutput.Exception($"安全{validateResult.Message}");
  78. }
  79. var codeId = input.CodeId.IsNull() ? Guid.NewGuid().ToString() : input.CodeId;
  80. var code = StringHelper.GenerateRandomNumber();
  81. await Cache.SetAsync(CacheKeys.GetSmsCode(input.Mobile, codeId), code, TimeSpan.FromMinutes(5));
  82. //发送短信
  83. await LazyGetRequiredService<ICapPublisher>().PublishAsync(SubscribeNames.SmsSingleSend,
  84. new
  85. {
  86. input.Mobile,
  87. Text = code
  88. });
  89. return codeId;
  90. }
  91. }