SysSmsService.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. using AlibabaCloud.SDK.Dysmsapi20170525.Models;
  7. namespace Admin.NET.Core.Service;
  8. /// <summary>
  9. /// 系统短信服务 🧩
  10. /// </summary>
  11. [AllowAnonymous]
  12. [ApiDescriptionSettings(Order = 150)]
  13. public class SysSmsService : IDynamicApiController, ITransient
  14. {
  15. private readonly SMSOptions _smsOptions;
  16. private readonly SysCacheService _sysCacheService;
  17. public SysSmsService(IOptions<SMSOptions> smsOptions,
  18. SysCacheService sysCacheService)
  19. {
  20. _smsOptions = smsOptions.Value;
  21. _sysCacheService = sysCacheService;
  22. }
  23. /// <summary>
  24. /// 发送短信 📨
  25. /// </summary>
  26. /// <param name="phoneNumber"></param>
  27. /// <returns></returns>
  28. [AllowAnonymous]
  29. [DisplayName("发送短信")]
  30. public async Task SendSms([Required] string phoneNumber)
  31. {
  32. if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
  33. throw Oops.Oh("请正确填写手机号码");
  34. // 生成随机验证码
  35. var random = new Random();
  36. var verifyCode = random.Next(100000, 999999);
  37. var templateParam = Clay.Object(new
  38. {
  39. code = verifyCode
  40. });
  41. var client = CreateClient();
  42. var sendSmsRequest = new SendSmsRequest
  43. {
  44. PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
  45. SignName = _smsOptions.Aliyun.SignName, // 短信签名
  46. TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板
  47. TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串
  48. OutId = YitIdHelper.NextId().ToString()
  49. };
  50. var sendSmsResponse = client.SendSms(sendSmsRequest);
  51. if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK")
  52. {
  53. // var bizId = sendSmsResponse.Body.BizId;
  54. _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
  55. }
  56. else
  57. {
  58. throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}");
  59. }
  60. await Task.CompletedTask;
  61. }
  62. /// <summary>
  63. /// 阿里云短信配置
  64. /// </summary>
  65. /// <returns></returns>
  66. private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient()
  67. {
  68. var config = new AlibabaCloud.OpenApiClient.Models.Config
  69. {
  70. AccessKeyId = _smsOptions.Aliyun.AccessKeyId,
  71. AccessKeySecret = _smsOptions.Aliyun.AccessKeySecret,
  72. Endpoint = "dysmsapi.aliyuncs.com"
  73. };
  74. return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config);
  75. }
  76. }