SysSmsService.cs 3.0 KB

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