/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2021/1/31 21:45:10 * Description: 暂无 ***********************************************************************/ using System; using System.Threading.Tasks; using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IRepository.UnitOfWork; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.ViewModels.Sms; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; namespace CoreCms.Net.Services { /// /// 短信发送日志 接口实现 /// public class CoreCmsSmsServices : BaseServices, ICoreCmsSmsServices { private readonly ICoreCmsSmsRepository _dal; private readonly ICoreCmsSettingServices _settingServices; private readonly IUnitOfWork _unitOfWork; private readonly IHttpContextAccessor _httpContextAccessor; public CoreCmsSmsServices(IUnitOfWork unitOfWork , ICoreCmsSmsRepository dal , IHttpContextAccessor httpContextAccessor, ICoreCmsSettingServices settingServices) { this._dal = dal; base.BaseDal = dal; _unitOfWork = unitOfWork; _httpContextAccessor = httpContextAccessor; _settingServices = settingServices; } #region 发送短信(验证码) /// /// 发送短信(验证码) /// /// /// /// public async Task DoSendSms(string type, string mobile) { var jm = new WebApiCallBack(); var smsOptions = await _settingServices.GetSmsOptions(); if (smsOptions.Enabled == false) { jm.msg = "短信功能未开启"; return jm; } Random rd = new Random(); int codeNumber = rd.Next(100000, 999999); //获取是否存在 var dt = DateTime.Now; var endDt = dt.AddMinutes(10); var oldLog = await _dal.QueryByClauseAsync(p => p.code == type && p.mobile == mobile && p.createTime > dt && p.createTime < endDt, p => p.id, OrderByType.Desc); if (oldLog == null) { oldLog = new CoreCmsSms(); oldLog.code = type; oldLog.createTime = DateTime.Now; oldLog.mobile = mobile; oldLog.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1"; oldLog.isUsed = false; var obj = new { code = codeNumber }; switch (type) { case "login": oldLog.contentBody = "您本次登陆的验证码是:" + codeNumber + ",请不要将验证码泄露给他人!"; oldLog.parameters = JsonConvert.SerializeObject(obj); break; default: oldLog.contentBody = "您验证码是:" + codeNumber + ",请不要将验证码泄露给他人!"; oldLog.parameters = JsonConvert.SerializeObject(obj); break; } await _dal.InsertAsync(oldLog); } var str = SendSms(oldLog.mobile, oldLog.contentBody, smsOptions); jm.status = true; jm.data = str; jm.msg = "短信发送成功"; return jm; } #endregion #region 校验短信验证码 /// /// 校验短信验证码 /// /// /// /// /// public async Task Check(string phone, string verCode, string code) { var smsInfo = await _dal.QueryByClauseAsync(p => p.mobile == phone && p.code == code && p.createTime < DateTime.Now && p.isUsed == false, p => p.createTime, OrderByType.Desc); if (smsInfo != null) { var parameters = JObject.Parse(smsInfo.parameters); if (parameters.ContainsKey("code")) { var dataCode = parameters["code"]?.ToString(); if (dataCode != verCode) return false; smsInfo.isUsed = true; await _dal.UpdateAsync(smsInfo); return true; } return false; } return false; } #endregion #region 接口通道发送短信 /// /// 接口通道发送短信 /// /// /// /// 配置文件 public string SendSms(string mobile, string contentBody, SMSOptions smsOptions) { if (smsOptions.Enabled) { string param = $@"action=send&userid={smsOptions.UserId}&account={smsOptions.Account}&password={smsOptions.Password}&content={"【" + smsOptions.Signature + "】" + contentBody}&mobile={mobile}"; var str = HttpHelper.PostSend(smsOptions.ApiUrl, param); return str; } else { return "短信接口未开启"; } } #endregion #region 发送短信统一方法 /// /// 发送短信统一方法 /// /// 接受者手机号码 /// 模板编码 /// 参数 /// public async Task Send(string mobile, string code, JObject parameters) { var jm = new WebApiCallBack(); var smsOptions = await _settingServices.GetSmsOptions(); if (smsOptions.Enabled == false) { jm.msg = "短信功能未开启"; return jm; } if (string.IsNullOrEmpty(mobile)) { jm.msg = GlobalErrorCodeVars.Code11051; return jm; } var isUsed = false; if (code == GlobalEnumVars.SmsMessageTypes.Reg.ToString() || code == GlobalEnumVars.SmsMessageTypes.Login.ToString() || code == GlobalEnumVars.SmsMessageTypes.Veri.ToString()) { var dt = DateTime.Now; var newCreateTime = DateTime.Now.AddSeconds(-60); var smsInfo = await _dal.QueryByClauseAsync(p => p.mobile == mobile && p.code == code && p.createTime < newCreateTime && p.isUsed == false); if (smsInfo != null) { var ts = dt - smsInfo.createTime; if (ts.Seconds < 60) { jm.msg = "两次发送时间间隔小于60秒"; return jm; } parameters = JObject.Parse(smsInfo.parameters); ; } else { Random rd = new Random(); int codeNumber = rd.Next(100000, 999999); if (parameters.ContainsKey("code")) { parameters.Remove("code"); } parameters.Add("code", codeNumber); } isUsed = false; } else { isUsed = true; } var str = string.Empty; var allConfigs = await _settingServices.GetConfigDictionaries(); if (code == GlobalEnumVars.SmsMessageTypes.Reg.ToString()) { // 账户注册 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForReg); if (!string.IsNullOrEmpty(msg)) { var sendCode = string.Empty; if (parameters.ContainsKey("code")) { sendCode = parameters["code"]?.ToString(); } str = msg.Replace("{code}", sendCode); } } else if (code == GlobalEnumVars.SmsMessageTypes.Login.ToString()) { // 账户登录 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForLogin); if (!string.IsNullOrEmpty(msg)) { var sendCode = string.Empty; if (parameters.ContainsKey("code")) { sendCode = parameters["code"]?.ToString(); } str = msg.Replace("{code}", sendCode); } } else if (code == GlobalEnumVars.SmsMessageTypes.Veri.ToString()) { // 验证验证码 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForVeri); if (!string.IsNullOrEmpty(msg)) { var sendCode = string.Empty; if (parameters.ContainsKey("code")) { sendCode = parameters["code"]?.ToString(); } str = msg.Replace("{code}", sendCode); } } else if (code == GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString()) { // 订单创建 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForCreateOrder); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString()) { // 订单支付通知买家 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForOrderPayed); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.RemindOrderPay.ToString()) { // 未支付催单 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForRemindOrderPay); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString()) { // 订单发货 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForDeliveryNotice); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.AfterSalesPass.ToString()) { // 售后审核通过 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForAfterSalesPass); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString()) { // 退款已处理 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForRefundSuccess); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString()) { // 订单支付通知卖家 var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForSellerOrderNotice); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } else if (code == GlobalEnumVars.PlatformMessageTypes.Common.ToString()) { //通用类型 var tpl = string.Empty; if (parameters.ContainsKey("tpl")) { tpl = parameters["tpl"]?.ToString(); } str = tpl; if (!string.IsNullOrEmpty(str)) { var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForCommon); str = !string.IsNullOrEmpty(msg) ? msg : string.Empty; } } if (string.IsNullOrEmpty(str)) { jm.msg = GlobalErrorCodeVars.Code10009; return jm; } var oldLog = new CoreCmsSms(); oldLog.mobile = mobile; oldLog.code = code; oldLog.parameters = JsonConvert.SerializeObject(parameters); oldLog.contentBody = str; oldLog.createTime = DateTime.Now; oldLog.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1"; oldLog.isUsed = isUsed; await _dal.InsertAsync(oldLog); var result = SendSms(oldLog.mobile, oldLog.contentBody, smsOptions); jm.status = true; jm.msg = "发送成功"; jm.data = result; return jm; } #endregion } }