|
|
|
@ -1,14 +1,11 @@ |
|
|
|
using Aliyun.Acs.Core; |
|
|
|
using Aliyun.Acs.Core.Exceptions; |
|
|
|
using Aliyun.Acs.Core.Http; |
|
|
|
using LINGYUN.Abp.Aliyun; |
|
|
|
using AlibabaCloud.SDK.Dypnsapi20170525.Models; |
|
|
|
using AlibabaCloud.SDK.Dysmsapi20170525.Models; |
|
|
|
using LINGYUN.Abp.Aliyun.Features; |
|
|
|
using LINGYUN.Abp.Aliyun.Settings; |
|
|
|
using LINGYUN.Abp.Features.LimitValidation; |
|
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
using System; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Volo.Abp; |
|
|
|
using Volo.Abp.DependencyInjection; |
|
|
|
@ -30,17 +27,20 @@ public class AliyunSmsSender : ISmsSender, IAliyunSmsVerifyCodeSender |
|
|
|
protected IJsonSerializer JsonSerializer { get; } |
|
|
|
protected ISettingProvider SettingProvider { get; } |
|
|
|
protected IServiceProvider ServiceProvider { get; } |
|
|
|
protected IAcsClientFactory AcsClientFactory { get; } |
|
|
|
protected IDypnsClientFactory DypnsClientFactory { get; } |
|
|
|
protected IDysmsClientFactory DysmsClientFactory { get; } |
|
|
|
public AliyunSmsSender( |
|
|
|
IJsonSerializer jsonSerializer, |
|
|
|
ISettingProvider settingProvider, |
|
|
|
IServiceProvider serviceProvider, |
|
|
|
IAcsClientFactory acsClientFactory) |
|
|
|
IDypnsClientFactory dypnsClientFactory, |
|
|
|
IDysmsClientFactory dysmsClientFactory) |
|
|
|
{ |
|
|
|
JsonSerializer = jsonSerializer; |
|
|
|
SettingProvider = settingProvider; |
|
|
|
ServiceProvider = serviceProvider; |
|
|
|
AcsClientFactory = acsClientFactory; |
|
|
|
DypnsClientFactory = dypnsClientFactory; |
|
|
|
DysmsClientFactory = dysmsClientFactory; |
|
|
|
} |
|
|
|
|
|
|
|
[RequiresLimitFeature( |
|
|
|
@ -74,41 +74,23 @@ public class AliyunSmsSender : ISmsSender, IAliyunSmsVerifyCodeSender |
|
|
|
Check.NotNullOrWhiteSpace(action, AliyunSettingNames.Sms.ActionName); |
|
|
|
Check.NotNullOrWhiteSpace(version, AliyunSettingNames.Sms.Version); |
|
|
|
|
|
|
|
var request = new CommonRequest |
|
|
|
{ |
|
|
|
Method = MethodType.POST, |
|
|
|
Domain = domain, |
|
|
|
Action = action, |
|
|
|
Version = version |
|
|
|
}; |
|
|
|
var request = new SendSmsRequest(); |
|
|
|
|
|
|
|
await TryAddTemplateCodeAsync(request, smsMessage); |
|
|
|
await TryAddSignNameAsync(request, smsMessage); |
|
|
|
await TryAddSendPhoneAsync(request, smsMessage); |
|
|
|
|
|
|
|
TryAddTemplateParam(request, smsMessage); |
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
var dysmsClient = await DysmsClientFactory.CreateAsync(); |
|
|
|
var response = await dysmsClient.SendSmsAsync(request); |
|
|
|
if (!string.Equals(response.Body.Code, "OK", StringComparison.CurrentCultureIgnoreCase)) |
|
|
|
{ |
|
|
|
var client = await AcsClientFactory.CreateAsync(); |
|
|
|
var response = client.GetCommonResponse(request); |
|
|
|
var responseContent = Encoding.Default.GetString(response.HttpResponse.Content); |
|
|
|
var aliyunResponse = JsonSerializer.Deserialize<AliyunSmsResponse>(responseContent); |
|
|
|
if (!aliyunResponse.IsSuccess()) |
|
|
|
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Sms.VisableErrorToClient)) |
|
|
|
{ |
|
|
|
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Sms.VisableErrorToClient)) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException(aliyunResponse.Code, aliyunResponse.Message); |
|
|
|
} |
|
|
|
throw new AliyunSmsException(aliyunResponse.Code, $"Text message sending failed, code:{aliyunResponse.Code}, message:{aliyunResponse.Message}!"); |
|
|
|
throw new UserFriendlyException(response.Body.Code, response.Body.Message); |
|
|
|
} |
|
|
|
} |
|
|
|
catch(ServerException se) |
|
|
|
{ |
|
|
|
throw new AliyunSmsException(se.ErrorCode, $"Sending text messages to aliyun server is abnormal,type: {se.ErrorType}, error: {se.ErrorMessage}"); |
|
|
|
} |
|
|
|
catch(ClientException ce) |
|
|
|
{ |
|
|
|
throw new AliyunSmsException(ce.ErrorCode, $"A client exception occurred in sending SMS messages,type: {ce.ErrorType}, error: {ce.ErrorMessage}"); |
|
|
|
throw new AliyunSmsException(response.Body.Code, $"Text message sending failed, code:{response.Body.Code}, message:{response.Body.Message}!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -132,75 +114,58 @@ public class AliyunSmsSender : ISmsSender, IAliyunSmsVerifyCodeSender |
|
|
|
Check.NotNullOrWhiteSpace(signName, AliyunSettingNames.SmsVerifyCode.DefaultSignName); |
|
|
|
Check.NotNullOrWhiteSpace(templateCode, AliyunSettingNames.SmsVerifyCode.DefaultTemplateCode); |
|
|
|
|
|
|
|
var request = new CommonRequest |
|
|
|
var dypnsClient = await DypnsClientFactory.CreateAsync(); |
|
|
|
|
|
|
|
var request = new SendSmsVerifyCodeRequest |
|
|
|
{ |
|
|
|
Domain = domain, |
|
|
|
Version = version, |
|
|
|
Product = "Dypnsapi", |
|
|
|
Method = MethodType.POST, |
|
|
|
Action = "SendSmsVerifyCode", |
|
|
|
PhoneNumber = message.PhoneNumber, |
|
|
|
SignName = signName, |
|
|
|
TemplateCode = templateCode, |
|
|
|
TemplateParam = JsonSerializer.Serialize(message.TemplateParam), |
|
|
|
}; |
|
|
|
request.AddBodyParameters("PhoneNumber", message.PhoneNumber); |
|
|
|
request.AddBodyParameters("SignName", signName); |
|
|
|
request.AddBodyParameters("TemplateCode", templateCode); |
|
|
|
request.AddBodyParameters("TemplateParam", JsonSerializer.Serialize(message.TemplateParam)); |
|
|
|
|
|
|
|
try |
|
|
|
var response = await dypnsClient.SendSmsVerifyCodeAsync(request); |
|
|
|
if (response.Body.Success == false) |
|
|
|
{ |
|
|
|
var client = await AcsClientFactory.CreateAsync(); |
|
|
|
var response = client.GetCommonResponse(request); |
|
|
|
var responseContent = Encoding.Default.GetString(response.HttpResponse.Content); |
|
|
|
var aliyunResponse = JsonSerializer.Deserialize<AliyunSmsVerifyCodeResponse>(responseContent); |
|
|
|
if (!aliyunResponse.Success) |
|
|
|
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Sms.VisableErrorToClient)) |
|
|
|
{ |
|
|
|
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Sms.VisableErrorToClient)) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException(aliyunResponse.Code, aliyunResponse.Message); |
|
|
|
} |
|
|
|
throw new AliyunSmsException(aliyunResponse.Code, $"Text message sending failed, code:{aliyunResponse.Code}, message:{aliyunResponse.Message}!"); |
|
|
|
throw new UserFriendlyException(response.Body.Code, response.Body.Message); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (ServerException se) |
|
|
|
{ |
|
|
|
throw new AliyunSmsException(se.ErrorCode, $"Sending text messages to aliyun server is abnormal,type: {se.ErrorType}, error: {se.ErrorMessage}"); |
|
|
|
} |
|
|
|
catch (ClientException ce) |
|
|
|
{ |
|
|
|
throw new AliyunSmsException(ce.ErrorCode, $"A client exception occurred in sending SMS messages,type: {ce.ErrorType}, error: {ce.ErrorMessage}"); |
|
|
|
throw new AliyunSmsException(response.Body.Code, $"Text message sending failed, code:{response.Body.Code}, message:{response.Body.Message}!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task TryAddTemplateCodeAsync(CommonRequest request, SmsMessage smsMessage) |
|
|
|
private async Task TryAddTemplateCodeAsync(SendSmsRequest request, SmsMessage smsMessage) |
|
|
|
{ |
|
|
|
if (smsMessage.Properties.TryGetValue("TemplateCode", out object template) && template != null) |
|
|
|
if (smsMessage.Properties.TryGetValue("TemplateCode", out var template) && template != null) |
|
|
|
{ |
|
|
|
request.AddQueryParameters("TemplateCode", template.ToString()); |
|
|
|
request.TemplateCode = template.ToString(); |
|
|
|
smsMessage.Properties.Remove("TemplateCode"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var defaultTemplateCode = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Sms.DefaultTemplateCode); |
|
|
|
Check.NotNullOrWhiteSpace(defaultTemplateCode, "TemplateCode"); |
|
|
|
request.AddQueryParameters("TemplateCode", defaultTemplateCode); |
|
|
|
request.TemplateCode = defaultTemplateCode; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task TryAddSignNameAsync(CommonRequest request, SmsMessage smsMessage) |
|
|
|
private async Task TryAddSignNameAsync(SendSmsRequest request, SmsMessage smsMessage) |
|
|
|
{ |
|
|
|
if (smsMessage.Properties.TryGetValue("SignName", out object signName) && signName != null) |
|
|
|
if (smsMessage.Properties.TryGetValue("SignName", out var signName) && signName != null) |
|
|
|
{ |
|
|
|
request.AddQueryParameters("SignName", signName.ToString()); |
|
|
|
request.SignName = signName.ToString(); |
|
|
|
smsMessage.Properties.Remove("SignName"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var defaultSignName = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Sms.DefaultSignName); |
|
|
|
Check.NotNullOrWhiteSpace(defaultSignName, "SignName"); |
|
|
|
request.AddQueryParameters("SignName", defaultSignName); |
|
|
|
request.SignName = defaultSignName; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task TryAddSendPhoneAsync(CommonRequest request, SmsMessage smsMessage) |
|
|
|
private async Task TryAddSendPhoneAsync(SendSmsRequest request, SmsMessage smsMessage) |
|
|
|
{ |
|
|
|
if (smsMessage.PhoneNumber.IsNullOrWhiteSpace()) |
|
|
|
{ |
|
|
|
@ -210,20 +175,20 @@ public class AliyunSmsSender : ISmsSender, IAliyunSmsVerifyCodeSender |
|
|
|
defaultPhoneNumber, |
|
|
|
AliyunSettingNames.Sms.DefaultPhoneNumber, |
|
|
|
maxLength: 11, minLength: 11); |
|
|
|
request.AddQueryParameters("PhoneNumbers", defaultPhoneNumber); |
|
|
|
request.PhoneNumbers = defaultPhoneNumber; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
request.AddQueryParameters("PhoneNumbers", smsMessage.PhoneNumber); |
|
|
|
request.PhoneNumbers = smsMessage.PhoneNumber; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void TryAddTemplateParam(CommonRequest request, SmsMessage smsMessage) |
|
|
|
private void TryAddTemplateParam(SendSmsRequest request, SmsMessage smsMessage) |
|
|
|
{ |
|
|
|
if (smsMessage.Properties.Any()) |
|
|
|
{ |
|
|
|
var queryParamJson = JsonSerializer.Serialize(smsMessage.Properties); |
|
|
|
request.AddQueryParameters("TemplateParam", queryParamJson); |
|
|
|
request.TemplateParam = queryParamJson; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|