You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
12 KiB
293 lines
12 KiB
using Microsoft.Extensions.Configuration;
|
|
using Shentun.Utilities;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Linq;
|
|
using System.Net.Http.Headers;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Shentun.Sms.Client
|
|
{
|
|
public class SmsClientHelper
|
|
{
|
|
protected static IConfiguration? _appConfig;
|
|
private static string? _baseAddress;
|
|
private static string? _createSmsTaskUrl;
|
|
private static string? _accesToken;
|
|
private static string? _user;
|
|
private static string? _password;
|
|
private static string? _email;
|
|
static SmsClientHelper()
|
|
{
|
|
_appConfig = new ConfigurationBuilder()
|
|
.SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
|
|
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
|
|
.Build();
|
|
_baseAddress = _appConfig.GetSection("Sms")
|
|
.GetSection("BaseAddress").Value;
|
|
_createSmsTaskUrl = _appConfig.GetSection("Sms")
|
|
.GetSection("CreateSmsTaskUrl").Value;
|
|
_user = _appConfig.GetSection("Sms")
|
|
.GetSection("User").Value;
|
|
_password = _appConfig.GetSection("Sms")
|
|
.GetSection("Password").Value;
|
|
}
|
|
|
|
public async static Task CreateSmsTask(CreateSmsTaskDto createSmsTaskDto)
|
|
{
|
|
if (createSmsTaskDto == null)
|
|
{
|
|
throw new Exception("createSmsTaskDto参数不能为空");
|
|
}
|
|
|
|
if (createSmsTaskDto.MobileTelephone.Length != 11)
|
|
{
|
|
|
|
throw new Exception("手机号长度必须为11位");
|
|
}
|
|
if (string.IsNullOrWhiteSpace(createSmsTaskDto.PersonId))
|
|
{
|
|
throw new Exception("人员ID不能为空");
|
|
|
|
}
|
|
if (string.IsNullOrWhiteSpace(createSmsTaskDto.PersonName))
|
|
{
|
|
throw new Exception("姓名不能为空");
|
|
|
|
}
|
|
if (string.IsNullOrWhiteSpace(createSmsTaskDto.CountryCode))
|
|
{
|
|
throw new Exception("国家编码不能为空");
|
|
|
|
}
|
|
if (string.IsNullOrWhiteSpace(createSmsTaskDto.Content))
|
|
{
|
|
throw new Exception("短信内容不能为空");
|
|
|
|
}
|
|
if (createSmsTaskDto.SmsAppId == null || createSmsTaskDto.SmsAppId == Guid.Empty)
|
|
{
|
|
var smsAppIdStr = _appConfig.GetSection("Sms")
|
|
.GetSection("SmsAppId").Value;
|
|
if (!Guid.TryParse(smsAppIdStr, out var smsAppId))
|
|
{
|
|
throw new Exception("解析短信应用ID错误");
|
|
}
|
|
createSmsTaskDto.SmsAppId = smsAppId;
|
|
}
|
|
|
|
var reslut = await CallAppServiceAsync<CreateSmsTaskDto, object>(_createSmsTaskUrl, createSmsTaskDto);
|
|
}
|
|
|
|
public async static Task CreateVerifySmsTask(CreateSmsTaskDto smsDto)
|
|
{
|
|
var verifySmsTypeIdStr = _appConfig.GetSection("Sms")
|
|
.GetSection("VerifySmsTypeId").Value;
|
|
if (!Guid.TryParse(verifySmsTypeIdStr, out var verifySmsTypeId))
|
|
{
|
|
throw new Exception("解析校验短信类别ID错误");
|
|
}
|
|
|
|
smsDto.SmsTypeId = verifySmsTypeId;
|
|
await CreateSmsTask(smsDto);
|
|
}
|
|
|
|
|
|
public async static Task CreateAppointSmsTask(CreateSmsTaskDto smsDto)
|
|
{
|
|
|
|
var appointSmsTypeIdStr = _appConfig.GetSection("Sms")
|
|
.GetSection("AppointSmsTypeId").Value;
|
|
if (!Guid.TryParse(appointSmsTypeIdStr, out var appointSmsTypeId))
|
|
{
|
|
throw new Exception("解析预约成功短信类别ID错误");
|
|
}
|
|
|
|
var smsAppIdStr = _appConfig.GetSection("Sms")
|
|
.GetSection("SmsAppId").Value;
|
|
if (!Guid.TryParse(smsAppIdStr, out var smsAppId))
|
|
{
|
|
throw new Exception("解析短信应用ID错误");
|
|
}
|
|
|
|
|
|
string appointTemplateId = _appConfig.GetSection("Sms")
|
|
.GetSection("AppointTemplateId").Value;
|
|
|
|
smsDto.SmsAppId = smsAppId;
|
|
smsDto.SmsTypeId = appointSmsTypeId;
|
|
smsDto.TemplateId = appointTemplateId;
|
|
|
|
var result = await CallAppServiceAsync<CreateSmsTaskDto, object>(_createSmsTaskUrl, smsDto);
|
|
}
|
|
public async static Task<TOut> CallAppServiceAsync<TInput, TOut>(string url, TInput data, string method = "post")
|
|
{
|
|
if (string.IsNullOrWhiteSpace(_baseAddress))
|
|
{
|
|
throw new Exception("_baseAddress不能为空");
|
|
}
|
|
string baseAddress = _baseAddress;
|
|
await CheckLoginAsync();
|
|
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", _accesToken);
|
|
var jsonOptions = new JsonSerializerOptions
|
|
{
|
|
WriteIndented = true, // 设置为true以便于可读性更好的JSON输出
|
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
|
// 如果你想要对日期进行格式化,可以使用JsonConverter
|
|
Converters = { new JsonDateTimeConverter("yyyy-MM-dd HH:mm:ss") }
|
|
};
|
|
|
|
var sendData = System.Text.Json.JsonSerializer.Serialize(data, jsonOptions);
|
|
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 = System.Text.Json.JsonSerializer.Deserialize<SmsWebApiOutDto<TOut>>(result, jsonOptions);
|
|
if (resultDto.Code == -1)
|
|
{
|
|
throw new Exception($"调用WebApi失败,返回-1,消息:" + resultDto.Message);
|
|
}
|
|
return resultDto.Data;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
public async static Task<SmsWebApiOutDto<SmsLoginOutDataDto>> LoginAsync()
|
|
{
|
|
if (string.IsNullOrWhiteSpace(_user))
|
|
{
|
|
throw new Exception("SelfUser不能为空");
|
|
}
|
|
if (string.IsNullOrWhiteSpace(_password))
|
|
{
|
|
throw new Exception("SelfPassword不能为空");
|
|
}
|
|
var relult = await LoginAsync(_user, _password);
|
|
return relult;
|
|
}
|
|
public async static Task<SmsWebApiOutDto<SmsLoginOutDataDto>> LoginAsync(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(_baseAddress);
|
|
|
|
httpClient.DefaultRequestHeaders.Accept.Add(
|
|
new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
|
|
var url = "api/app/CustomerUser/UserLogin";
|
|
var jsonOptions = new JsonSerializerOptions
|
|
{
|
|
WriteIndented = true, // 设置为true以便于可读性更好的JSON输出
|
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
|
// 如果你想要对日期进行格式化,可以使用JsonConverter
|
|
Converters = { new JsonDateTimeConverter("yyyy-MM-dd HH:mm:ss") }
|
|
};
|
|
var loginUser = new SmsLoginInputDto()
|
|
{
|
|
UserName = userId,
|
|
Password = password
|
|
};
|
|
var sendData = System.Text.Json.JsonSerializer.Serialize(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 = System.Text.Json.JsonSerializer.Deserialize<SmsWebApiOutDto<SmsLoginOutDataDto>>(result, jsonOptions);
|
|
if (restultDto == null)
|
|
{
|
|
throw new Exception("返回结果是空");
|
|
}
|
|
if (restultDto.Code != 1)
|
|
{
|
|
throw new Exception($"短信登录失败{restultDto.Message}");
|
|
}
|
|
_accesToken = restultDto.Data.access_token;
|
|
return restultDto;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private async static Task CheckLoginAsync()
|
|
{
|
|
if (string.IsNullOrWhiteSpace(_accesToken))
|
|
{
|
|
await LoginAsync();
|
|
}
|
|
else
|
|
{
|
|
var handler = new JwtSecurityTokenHandler();
|
|
var payload = handler.ReadJwtToken(_accesToken).Payload;
|
|
var claims = payload.Claims;
|
|
var exp = claims.First(claim => claim.Type == "exp").Value;
|
|
if (exp == null)
|
|
{
|
|
await LoginAsync();
|
|
}
|
|
else
|
|
{
|
|
if (long.TryParse(exp, out var expires))
|
|
{
|
|
var expireTime = DateTimeOffset.FromUnixTimeSeconds(expires).LocalDateTime;
|
|
if (expireTime <= DateTime.Now)
|
|
{
|
|
await LoginAsync();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
await LoginAsync();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|