SysSmsService.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. using AlibabaCloud.SDK.Dysmsapi20170525.Models;
  5. namespace Admin.NET.Core.Service;
  6. /// <summary>
  7. /// 系统短信服务 💥
  8. /// </summary>
  9. [AllowAnonymous]
  10. [ApiDescriptionSettings(Order = 150)]
  11. public class SysSmsService : IDynamicApiController, ITransient
  12. {
  13. private readonly SMSOptions _smsOptions;
  14. private readonly SysCacheService _sysCacheService;
  15. public SysSmsService(IOptions<SMSOptions> smsOptions,
  16. SysCacheService sysCacheService)
  17. {
  18. _smsOptions = smsOptions.Value;
  19. _sysCacheService = sysCacheService;
  20. }
  21. /// <summary>
  22. /// 发送短信 📨
  23. /// </summary>
  24. /// <param name="phoneNumber"></param>
  25. /// <returns></returns>
  26. [AllowAnonymous]
  27. [DisplayName("发送短信")]
  28. public async Task SendSms([Required] string phoneNumber)
  29. {
  30. if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
  31. throw Oops.Oh("请正确填写手机号码");
  32. // 生成随机验证码
  33. var random = new Random();
  34. var verifyCode = random.Next(100000, 999999);
  35. var templateParam = Clay.Object(new
  36. {
  37. code = verifyCode
  38. });
  39. var client = CreateClient();
  40. var sendSmsRequest = new SendSmsRequest
  41. {
  42. PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
  43. SignName = _smsOptions.Aliyun.SignName, // 短信签名
  44. TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板
  45. TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串
  46. OutId = YitIdHelper.NextId().ToString()
  47. };
  48. var sendSmsResponse = client.SendSms(sendSmsRequest);
  49. if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK")
  50. {
  51. // var bizId = sendSmsResponse.Body.BizId;
  52. _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
  53. }
  54. else
  55. {
  56. throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}");
  57. }
  58. await Task.CompletedTask;
  59. }
  60. /// <summary>
  61. /// 阿里云短信配置
  62. /// </summary>
  63. /// <returns></returns>
  64. private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient()
  65. {
  66. var config = new AlibabaCloud.OpenApiClient.Models.Config
  67. {
  68. AccessKeyId = _smsOptions.Aliyun.AccessKeyId,
  69. AccessKeySecret = _smsOptions.Aliyun.AccessKeySecret,
  70. Endpoint = "dysmsapi.aliyuncs.com"
  71. };
  72. return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config);
  73. }
  74. }