using Aliyun.OSS.Model;
using CSRedis;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using Wicture.DbRESTFul;
using Wicture.DbRESTFul.Cache;
namespace JiaZhiQuan.Common.JuheAPI.SendSms
{
///
/// 发送短信服务
/// 1分钟两次,每天最多10次
///
public static class JuheSendSmsUtils
{
const string JUHE_SMS_KEY = "d753412f9bf62957f872b4e0a12d3122";
const int JUHE_SMS_TPL_ID = 266760;
///
/// 发送验证码短信
///
/// 手机号
///
///
public static async Task SendCodeSms(string mobile, string code, RedisCacheProvider redis, HttpClient client)
{
string dayLimitKey = CacheKeys.MobileDayLimit(mobile),
continuousLimitKey = CacheKeys.ContinuousLimit(mobile);
int dayLimitCount = await redis.Get(dayLimitKey);
dynamic continuousLimit = await redis.Get(continuousLimitKey);
if (dayLimitCount >= 10)
{
throw new LogicalException("您当日发送短信太频繁,请明天再试", ErrorCodes.SMSendDayLimitError);
}
if (continuousLimit != null && continuousLimit.count >= 2)
{
throw new LogicalException("您发送短信太频繁,请稍后再试", ErrorCodes.SMSendBusinessLimitError);
}
// 发送短信
string sendParams = HttpUtility.UrlEncode($"#code#={code}");
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}");
// 设置今天的发送次数
int newDayLimitCount = dayLimitCount + 1;
await redis.Set(dayLimitKey, newDayLimitCount, DateTime.Now.Date.AddDays(1));
// 设置连续发送的次数
DateTime expiration = continuousLimit is null ? DateTime.Now.AddMinutes(1) : continuousLimit.endTime;
int newcontinuousLimitCount = continuousLimit is null ? 1 : continuousLimit.count + 1;
dynamic newContinuousLimit = new
{
count = newcontinuousLimitCount,
endTime = expiration
};
await redis.Set(continuousLimitKey, newContinuousLimit, expiration);
// 查看发送结果
var obj = JsonConvert.DeserializeObject>(res);
if (obj.error_code != 0)
{
LoggerManager.Logger.Error($"调用聚合发送验证码短信API失败:" + JsonConvert.SerializeObject(obj));
throw new LogicalException("发送短信失败,请稍后再试[" + res + "]", ErrorCodes.Exception);
}
}
}
public class JuheMobileAddressResultDetails
{
public string sid { get; set; }
public int count { get; set; }
public int fee { get; set; }
}
}