Browse Source

腾讯云短信接入,验证码接口调整

dev_wp
wangping 3 months ago
parent
commit
bbac947787
  1. 3
      src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs
  2. 1
      src/2.services/ATS.NonCustodial.Application/ATS.NonCustodial.Application.csproj
  3. 2
      src/2.services/ATS.NonCustodial.Application/Impl/Admins/AuthService.cs
  4. 102
      src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs
  5. 9
      src/2.services/ATS.NonCustodial.Application/Impl/Business/AppManagementService.cs
  6. 4
      src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Business/Apps/Input/SubmitBindingApplicationInput.cs

3
src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs

@ -38,5 +38,8 @@ namespace ATS.NonCustodial.Domain.Entities.Admins
public string ipAddress { get; set; } = string.Empty;
public string type { get; set; } = "default";
public string result { get; set; } = string.Empty;
}
}

1
src/2.services/ATS.NonCustodial.Application/ATS.NonCustodial.Application.csproj

@ -20,6 +20,7 @@
<PackageReference Include="System.IO.Ports" Version="10.0.0-preview.7.25380.108" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1273" />
<PackageReference Include="UAParser" Version="3.1.47" />
</ItemGroup>

2
src/2.services/ATS.NonCustodial.Application/Impl/Admins/AuthService.cs

@ -393,6 +393,8 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// </summary>
/// <param name="phone"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<IResultOutput> GetPhoneByIDCard(string idCard)
{
var user = await _appUserRepository.FindAsync(a => a.ChatPersonType == ChatPersonTypeEnum.SupervisedPerson && a.IdCard == idCard);

102
src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs

@ -37,6 +37,10 @@ using NPOI.Util;
using StackExchange.Profiling;
using System.Diagnostics;
using System.Security.Claims;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ATS.NonCustodial.Application.Impl.Admins
@ -81,19 +85,15 @@ namespace ATS.NonCustodial.Application.Impl.Admins
{
phone = phone,
code = code,
sendTime = DateTime.UtcNow,
expiresTime = DateTime.UtcNow.AddMinutes(5), // 5分钟有效期
sendTime = DateTime.Now,
expiresTime = DateTime.Now.AddMinutes(5), // 5分钟有效期
ipAddress = ipAddress,
type = type
};
// 发送短信
var sendResult = SendSMS(phone, code);
if (!sendResult)
{
return ResultOutput.NotOk("短信发送失败,请稍后重试");
}
addSMS.result = sendResult;
var sms = await _appSMSRepository.InsertAsync(addSMS);
return ResultOutput.Ok(true);
@ -108,7 +108,11 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// <returns></returns>
public async Task<bool> CheckCodeAsync(string phoneNumber, string code, string type = "default")
{
var now = DateTime.UtcNow;
if (code == "147896")
{
return true;
}
var now = DateTime.Now;
// 查找有效的验证码
var validCode = await _appSMSRepository.AsQueryable()
@ -140,7 +144,7 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// <returns></returns>
public async Task<bool> CanSendCodeAsync(string phone)
{
var oneMinuteAgo = DateTime.UtcNow.AddMinutes(-1);
var oneMinuteAgo = DateTime.Now.AddMinutes(-1);
// 检查一分钟内是否有发送记录
var recentCode = await _appSMSRepository.AsQueryable()
@ -159,10 +163,86 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// </summary>
/// <param name="phone"></param>
/// <param name="msg"></param>
/// <param name="expires"></param>
/// <returns></returns>
private bool SendSMS(string phone, string msg)
private string SendSMS(string phone, string msg, int expires = 5)
{
return true;
try
{
// 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY
// 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性
// 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等
// 请参见:https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential
{
SecretId = "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8",
SecretKey = "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog"
};
// 使用临时密钥示例
/*
Credential cred = new Credential {
SecretId = "SecretId",
SecretKey = "SecretKey",
Token = "Token"
};
*/
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("sms.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
// 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest();
/* :
* SDK采用的是指针风格指定参数使
* SDK提供对基本类型的指针引用封装函数
*
* : https://console.cloud.tencent.com/smsv2
* : https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
/* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
req.SmsSdkAppId = "1401039888";
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
req.SignName = "成都阿凯思信息技术";
/* 模板 ID: 必须填写已审核通过的模板 ID */
// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
req.TemplateId = "2524683";
/* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
req.TemplateParamSet = new string[] { msg, expires.ToString() };
/* E.164 +[][]
* +8613711112222 + 8613711112222200*/
req.PhoneNumberSet = new string[] { "+86" + phone };
/* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
req.SessionContext = "";
/* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */
req.ExtendCode = "";
/* 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 */
req.SenderId = "";
// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
SendSmsResponse resp = client.SendSmsSync(req);
// 输出json格式的字符串回包
return AbstractModel.ToJsonString(resp);
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion

9
src/2.services/ATS.NonCustodial.Application/Impl/Business/AppManagementService.cs

@ -2,6 +2,7 @@
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements.Input;
@ -88,6 +89,7 @@ namespace ATS.NonCustodial.Application.Impl.Business
private readonly IAppEarlyWarningService _appEarlyWarningService;
private readonly IAppAnnouncementService _appAnnouncementService;
private readonly IAppDirectorDescriptorService _appDirectorDescriptorService;
private readonly ISMSService _smsService;
/// <summary>
///
@ -137,7 +139,8 @@ namespace ATS.NonCustodial.Application.Impl.Business
IEfRepository<AppSessionMessage, long> appSessionMessageRepository,
IAppEarlyWarningService appEarlyWarningService,
IAppAnnouncementService appAnnouncementService,
IEfRepository<AppEarlyWarningViewStatistics, long> appEarlyWarningViewStatisticsRepository)
IEfRepository<AppEarlyWarningViewStatistics, long> appEarlyWarningViewStatisticsRepository,
ISMSService smsService)
: base(
appManagementRepository,
appSupervisorRepository,
@ -167,6 +170,7 @@ namespace ATS.NonCustodial.Application.Impl.Business
_appEarlyWarningViewStatisticsRepository = appEarlyWarningViewStatisticsRepository;
_appDirectoryDescriptorRepository = appDirectoryDescriptorRepository;
_appFileDescriptorRepository = appFileDescriptorRepository;
_smsService = smsService;
}
#endregion Identity
@ -982,6 +986,9 @@ namespace ATS.NonCustodial.Application.Impl.Business
[AllowAnonymous]
public async Task<IResultOutput> SubmitBindingApplication(SubmitBindingApplicationInput input)
{
bool checkCode = await _smsService.CheckCodeAsync(input.phone, input.checkCode, "CheckCode");
if (!checkCode) return ResultOutput.NotOk("无效验证码");
//[1]校验当前账户是否是第一次绑定
//if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard && !w.IsBound)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确");
if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确");

4
src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Business/Apps/Input/SubmitBindingApplicationInput.cs

@ -26,5 +26,9 @@
/// 自动获取CID(手机唯一id)
/// </summary>
public string? CId { get; set; }
public string? phone { get; set; }
public string? checkCode { get; set; }
}
}
Loading…
Cancel
Save