JuheSendSmsUtils.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Aliyun.OSS.Model;
  2. using CSRedis;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Net.Http;
  6. using System.Threading.Tasks;
  7. using System.Web;
  8. using Wicture.DbRESTFul;
  9. using Wicture.DbRESTFul.Cache;
  10. namespace JiaZhiQuan.Common.JuheAPI.SendSms
  11. {
  12. /// <summary>
  13. /// 发送短信服务
  14. /// 1分钟两次,每天最多10次
  15. /// </summary>
  16. public static class JuheSendSmsUtils
  17. {
  18. const string JUHE_SMS_KEY = "d753412f9bf62957f872b4e0a12d3122";
  19. const int JUHE_SMS_TPL_ID = 266760;
  20. /// <summary>
  21. /// 发送验证码短信
  22. /// </summary>
  23. /// <param name="mobile">手机号</param>
  24. /// <param name="client"></param>
  25. /// <returns></returns>
  26. public static async Task SendCodeSms(string mobile, string code, RedisCacheProvider redis, HttpClient client)
  27. {
  28. string dayLimitKey = CacheKeys.MobileDayLimit(mobile),
  29. continuousLimitKey = CacheKeys.ContinuousLimit(mobile);
  30. int dayLimitCount = await redis.Get<int>(dayLimitKey);
  31. dynamic continuousLimit = await redis.Get<dynamic>(continuousLimitKey);
  32. if (dayLimitCount >= 10)
  33. {
  34. throw new LogicalException("您当日发送短信太频繁,请明天再试", ErrorCodes.SMSendDayLimitError);
  35. }
  36. if (continuousLimit != null && continuousLimit.count >= 2)
  37. {
  38. throw new LogicalException("您发送短信太频繁,请稍后再试", ErrorCodes.SMSendBusinessLimitError);
  39. }
  40. // 发送短信
  41. string sendParams = HttpUtility.UrlEncode($"#code#={code}");
  42. var res = await client.GetStringAsync($"http://v.juhe.cn/sms/send?mobile={mobile}&tpl_id={JUHE_SMS_TPL_ID}&tpl_value={sendParams}&key={JUHE_SMS_KEY}");
  43. // 设置今天的发送次数
  44. int newDayLimitCount = dayLimitCount + 1;
  45. await redis.Set(dayLimitKey, newDayLimitCount, DateTime.Now.Date.AddDays(1));
  46. // 设置连续发送的次数
  47. DateTime expiration = continuousLimit is null ? DateTime.Now.AddMinutes(1) : continuousLimit.endTime;
  48. int newcontinuousLimitCount = continuousLimit is null ? 1 : continuousLimit.count + 1;
  49. dynamic newContinuousLimit = new
  50. {
  51. count = newcontinuousLimitCount,
  52. endTime = expiration
  53. };
  54. await redis.Set(continuousLimitKey, newContinuousLimit, expiration);
  55. // 查看发送结果
  56. var obj = JsonConvert.DeserializeObject<JuheResponseModel1<JuheMobileAddressResultDetails>>(res);
  57. if (obj.error_code != 0)
  58. {
  59. LoggerManager.Logger.Error($"调用聚合发送验证码短信API失败:" + JsonConvert.SerializeObject(obj));
  60. throw new LogicalException("发送短信失败,请稍后再试[" + res + "]", ErrorCodes.Exception);
  61. }
  62. }
  63. }
  64. public class JuheMobileAddressResultDetails
  65. {
  66. public string sid { get; set; }
  67. public int count { get; set; }
  68. public int fee { get; set; }
  69. }
  70. }