6 changed files with 378 additions and 3 deletions
			
			
		- 
					93src/Shentun.ColumnReferencePlugIns/Sms/CreateSmsTaskDto.cs
 - 
					194src/Shentun.ColumnReferencePlugIns/Sms/SmsPlugIns.cs
 - 
					84src/Shentun.Peis.Application/TransToWebPeis/TransToWebPeisAppService.cs
 - 
					3src/Shentun.Peis.Domain.Shared/Enums/ThirdInterfaceTypeFlag.cs
 - 
					2src/Shentun.Peis.Domain/Shentun.Peis.Domain.csproj
 - 
					5src/Shentun.Peis.HttpApi.Host/appsettings.json
 
@ -0,0 +1,93 @@ | 
			
		|||||
 | 
				using System; | 
			
		||||
 | 
				using System.Collections.Generic; | 
			
		||||
 | 
				using System.Linq; | 
			
		||||
 | 
				using System.Text; | 
			
		||||
 | 
				using System.Threading.Tasks; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace Shentun.Peis.PlugIns.Sms | 
			
		||||
 | 
				{ | 
			
		||||
 | 
				    public class CreateSmsTaskDto | 
			
		||||
 | 
				    { | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 短信类别ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public Guid SmsTypeId { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 人员ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string PersonId { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 姓名
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string PersonName { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 手机号国家代码
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string CountryCode { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 手机号
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string MobileTelephone { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 短信内容
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string Content { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 应用ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public Guid SmsAppId { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 第三方系统唯一ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string? ThirdId { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 任务周期类别
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public char TaskCycleType { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 任务表达式
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string? TaskCorn { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 停止执行时间
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string? StopTime { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        ///// <summary>
 | 
			
		||||
 | 
				        ///// 是否启用
 | 
			
		||||
 | 
				        ///// </summary>
 | 
			
		||||
 | 
				        //public char IsActive { get; set; } = 'Y';
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 发送者用户ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string? SenderId { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 发送者用户名
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string? SenderName { get; set; } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        /// <summary>
 | 
			
		||||
 | 
				        /// 短信模板ID
 | 
			
		||||
 | 
				        /// </summary>
 | 
			
		||||
 | 
				        public string TemplateId { get; set; } | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
@ -0,0 +1,194 @@ | 
			
		|||||
 | 
				using Newtonsoft.Json.Converters; | 
			
		||||
 | 
				using Newtonsoft.Json; | 
			
		||||
 | 
				using System; | 
			
		||||
 | 
				using System.Collections.Generic; | 
			
		||||
 | 
				using System.IdentityModel.Tokens.Jwt; | 
			
		||||
 | 
				using System.Linq; | 
			
		||||
 | 
				using System.Net.Http.Headers; | 
			
		||||
 | 
				using System.Text; | 
			
		||||
 | 
				using System.Threading.Tasks; | 
			
		||||
 | 
				using Microsoft.Extensions.Configuration; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace Shentun.Peis.PlugIns.Sms | 
			
		||||
 | 
				{ | 
			
		||||
 | 
				    public class SmsPlugIns : ThirdPlugInsBase | 
			
		||||
 | 
				    { | 
			
		||||
 | 
				        private string _smsUser; | 
			
		||||
 | 
				        private string _smsPassword; | 
			
		||||
 | 
				        private string _smsBaseAddress; | 
			
		||||
 | 
				        private static string _smsToken; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        public SmsPlugIns(Guid thirdInterfaceId) : base(thirdInterfaceId) | 
			
		||||
 | 
				        { | 
			
		||||
 | 
				            var configurationBuilder = new ConfigurationBuilder() | 
			
		||||
 | 
				       .AddJsonStream(new MemoryStream(Encoding.UTF8.GetBytes(_thirdInterfaceDto.ParmValue))); | 
			
		||||
 | 
				            InterfaceConfig = configurationBuilder.Build(); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            _smsUser = InterfaceConfig.GetSection("Interface").GetSection("User").Value; | 
			
		||||
 | 
				            _smsPassword = InterfaceConfig.GetSection("Interface").GetSection("Password").Value; | 
			
		||||
 | 
				            _smsBaseAddress = InterfaceConfig.GetSection("Interface").GetSection("BaseAddress").Value; | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        public async Task<TOut> CallSmsAppServiceAsync<TInput, TOut>(string url, TInput data, string method = "post") | 
			
		||||
 | 
				        { | 
			
		||||
 | 
				            //if (string.IsNullOrWhiteSpace(_webPeisBaseAddress))
 | 
			
		||||
 | 
				            //{
 | 
			
		||||
 | 
				            //    throw new Exception("_webPeisBaseAddress不能为空");
 | 
			
		||||
 | 
				            //}
 | 
			
		||||
 | 
				            string baseAddress = _smsBaseAddress; | 
			
		||||
 | 
				            await CheckSmsLoginAsync(); | 
			
		||||
 | 
				            using (var httpClientHandler = new HttpClientHandler()) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                using (var httpClient = new HttpClient(httpClientHandler)) | 
			
		||||
 | 
				                { | 
			
		||||
 | 
				                    httpClient.BaseAddress = new Uri(baseAddress); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                    httpClient.DefaultRequestHeaders.Accept.Add( | 
			
		||||
 | 
				                      new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
 | 
			
		||||
 | 
				                    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _smsToken); | 
			
		||||
 | 
				                    IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); | 
			
		||||
 | 
				                    timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; | 
			
		||||
 | 
				                    var sendData = JsonConvert.SerializeObject(data, Formatting.Indented, timeFormat); | 
			
		||||
 | 
				                    using (HttpContent httpContent = new StringContent(sendData)) | 
			
		||||
 | 
				                    { | 
			
		||||
 | 
				                        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); | 
			
		||||
 | 
				                        HttpResponseMessage response = null; | 
			
		||||
 | 
				                        if (method == "post") | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            response = await httpClient.PostAsync(url, httpContent); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        else | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            response = await httpClient.GetAsync(url); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                        string result; | 
			
		||||
 | 
				                        if (!response.IsSuccessStatusCode) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            result = response.Content.ReadAsStringAsync().Result; | 
			
		||||
 | 
				                            throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        result = await response.Content.ReadAsStringAsync(); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                        var resultDto = JsonConvert.DeserializeObject<WebApiOutDto<TOut>>(result); | 
			
		||||
 | 
				                        if (resultDto != null) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            if (resultDto.Code == -1) | 
			
		||||
 | 
				                            { | 
			
		||||
 | 
				                                throw new Exception($"调用WebApi失败,返回-1,消息:" + resultDto.Message); | 
			
		||||
 | 
				                            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                            return resultDto.Data; | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        return resultDto.Data; | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        private async Task CheckSmsLoginAsync() | 
			
		||||
 | 
				        { | 
			
		||||
 | 
				            if (string.IsNullOrWhiteSpace(_smsToken)) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                await LoginSmsAsync(); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				            else | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                var handler = new JwtSecurityTokenHandler(); | 
			
		||||
 | 
				                var payload = handler.ReadJwtToken(_smsToken).Payload; | 
			
		||||
 | 
				                var claims = payload.Claims; | 
			
		||||
 | 
				                var exp = claims.First(claim => claim.Type == "exp").Value; | 
			
		||||
 | 
				                if (exp == null) | 
			
		||||
 | 
				                { | 
			
		||||
 | 
				                    await LoginSmsAsync(); | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				                else | 
			
		||||
 | 
				                { | 
			
		||||
 | 
				                    if (long.TryParse(exp, out var expires)) | 
			
		||||
 | 
				                    { | 
			
		||||
 | 
				                        var expireTime = DateTimeOffset.FromUnixTimeSeconds(expires).LocalDateTime; | 
			
		||||
 | 
				                        if (expireTime <= DateTime.Now) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            await LoginSmsAsync(); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				                    else | 
			
		||||
 | 
				                    { | 
			
		||||
 | 
				                        await LoginSmsAsync(); | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        private async Task<WebApiOutDto<LoginOutDataDto>> LoginSmsAsync() | 
			
		||||
 | 
				        { | 
			
		||||
 | 
				            if (string.IsNullOrWhiteSpace(_smsUser)) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                throw new Exception("WebPeisUser不能为空"); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				            if (string.IsNullOrWhiteSpace(_smsPassword)) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                throw new Exception("WebPeisPassword不能为空"); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				            var relult = await LoginSmsAsync(_smsUser, _smsPassword); | 
			
		||||
 | 
				            return relult; | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        private async Task<WebApiOutDto<LoginOutDataDto>> LoginSmsAsync(string userId, string password) | 
			
		||||
 | 
				        { | 
			
		||||
 | 
				            if (string.IsNullOrWhiteSpace(userId)) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                throw new Exception("用户ID不能为空"); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				            if (string.IsNullOrWhiteSpace(password)) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                throw new Exception("密码不能为空"); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				            using (var httpClientHandler = new HttpClientHandler()) | 
			
		||||
 | 
				            { | 
			
		||||
 | 
				                using (var httpClient = new HttpClient(httpClientHandler)) | 
			
		||||
 | 
				                { | 
			
		||||
 | 
				                    httpClient.BaseAddress = new Uri(_smsBaseAddress); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                    httpClient.DefaultRequestHeaders.Accept.Add( | 
			
		||||
 | 
				                      new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
 | 
			
		||||
 | 
				                    var url = "api/app/CustomerUser/UserLogin"; | 
			
		||||
 | 
				                    var loginUser = new LoginInputDto() | 
			
		||||
 | 
				                    { | 
			
		||||
 | 
				                        UserName = userId, | 
			
		||||
 | 
				                        Password = password | 
			
		||||
 | 
				                    }; | 
			
		||||
 | 
				                    var sendData = JsonConvert.SerializeObject(loginUser); | 
			
		||||
 | 
				                    using (HttpContent httpContent = new StringContent(sendData)) | 
			
		||||
 | 
				                    { | 
			
		||||
 | 
				                        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); | 
			
		||||
 | 
				                        HttpResponseMessage response = await httpClient.PostAsync(url, httpContent); | 
			
		||||
 | 
				                        string result; | 
			
		||||
 | 
				                        if (!response.IsSuccessStatusCode) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            result = response.Content.ReadAsStringAsync().Result; | 
			
		||||
 | 
				                            throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        result = await response.Content.ReadAsStringAsync(); | 
			
		||||
 | 
				                        var restultDto = JsonConvert.DeserializeObject<WebApiOutDto<LoginOutDataDto>>(result); | 
			
		||||
 | 
				                        if (restultDto == null) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            throw new Exception("返回结果是空"); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        if (restultDto.Code != 1) | 
			
		||||
 | 
				                        { | 
			
		||||
 | 
				                            throw new Exception($"登录失败{restultDto.Message}"); | 
			
		||||
 | 
				                        } | 
			
		||||
 | 
				                        _smsToken = restultDto.Data.access_token; | 
			
		||||
 | 
				                        return restultDto; | 
			
		||||
 | 
				                    } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                } | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue