@ -1,47 +1,19 @@
using ATS.NonCustodial.Application.Base ;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth ;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Input ;
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.Logs.LoginLog.Input ;
using ATS.NonCustodial.Domain.Entities.Admins ;
using ATS.NonCustodial.Domain.Entities.Business ;
using ATS.NonCustodial.Domain.Entities.Business.EarlyWarning ;
using ATS.NonCustodial.Domain.Shared.Enums ;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore ;
using ATS.NonCustodial.DynamicApi ;
using ATS.NonCustodial.DynamicApi.Attributes ;
using ATS.NonCustodial.Shared.Captcha.Dto ;
using ATS.NonCustodial.Shared.Common.Attributes ;
using ATS.NonCustodial.Shared.Common.Auth ;
using ATS.NonCustodial.Shared.Common.Constants ;
using ATS.NonCustodial.Shared.Common.Dtos ;
using ATS.NonCustodial.Shared.Common.Enums ;
using ATS.NonCustodial.Shared.Common.UnifiedResults ;
using ATS.NonCustodial.Shared.Configurations.Options ;
using ATS.NonCustodial.Shared.Extensions ;
using ATS.NonCustodial.Shared.Helpers ;
using ATS.NonCustodial.Shared.Helpers.Core.Hash ;
using ATS.NonCustodial.Shared.Helpers.Http ;
using ATS.NonCustodial.Shared.Tools.Captcha ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Cors ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.AspNetCore.Mvc.ModelBinding ;
using Microsoft.EntityFrameworkCore ;
using Microsoft.Extensions.Logging ;
using Newtonsoft.Json ;
using NPOI.SS.Formula.Functions ;
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
{
@ -92,29 +64,86 @@ namespace ATS.NonCustodial.Application.Impl.Admins
} ;
// 发送短信
var sendResult = SendSMS ( phone , code ) ;
var sendResult = SendSMS ( phone , new string [ ] { code , "5" } , "2524683" ) ;
addSMS . result = sendResult ;
var sms = await _ appSMSRepository . InsertAsync ( addSMS ) ;
return ResultOutput . Ok ( true ) ;
}
/// <summary>
/// 给指定电话 发送短信
/// 用于触发给指定人员 发送短信
/// </summary>
/// <param name="phone"></param>
/// <param name="msg"></param>
/// <param name="type"></param>
/// <param name="alert">短信通知类型</param>
/// <param name="supervisor">监管人姓名</param>
/// <param name="phone">需要通知的电话</param>
/// <param name="dateTime">发送的日期</param>
/// <param name="msg">触发的消息内容(小于等于6个字)</param>
/// <param name="ipAddress"></param>
/// <param name="supervisedPerson">被监管人姓名</param>
/// <returns></returns>
public async Task < IResultOutput > SendMessageSMS ( string phone , string msg = "" , string type = "CheckCode" )
public async Task < IResultOutput > SendMessageSMS ( MessageAlertTypeEnum alert , string supervisor , string phone , DateTime ? dateTime , string msg = "" , string ipAddress = "" , string supervisedPerson = " ")
{
// 检查是否可以发送(一分钟内只能发送一次)
if ( ! await CanSendCodeAsync ( phone ) )
{
return ResultOutput . NotOk ( "请求过于频繁,请稍后再试" ) ;
}
// 创建短信记录
var addSMS = new AppSMS
{
phone = phone ,
sendTime = DateTime . Now ,
expiresTime = DateTime . Now . AddMinutes ( 5 ) , // 5分钟有效期
ipAddress = ipAddress
} ;
string [ ] sendMessage ;
string templateId = string . Empty ;
string year , month , day ;
if ( dateTime . HasValue )
{
year = dateTime . Value . Year . ToString ( ) ;
month = dateTime . Value . Month . ToString ( ) ;
day = dateTime . Value . Day . ToString ( ) ;
}
else
{
year = DateTime . Now . Year . ToString ( ) ;
month = DateTime . Now . Month . ToString ( ) ;
day = DateTime . Now . Day . ToString ( ) ;
}
if ( alert = = MessageAlertTypeEnum . Alert )
{
//[预警处理提醒] {1}您好,您于{2}年{3}月{4}日触发的{5}预警需及时处理,请尽快核查并修正相关事项。
sendMessage = new string [ ] { supervisedPerson , year , month , day , msg } ;
templateId = "2534751" ;
addSMS . type = "Alert" ;
}
else if ( alert = = MessageAlertTypeEnum . Approved )
{
//[审批完成通知] {1}您好,您于{2}年{3}月{4}日提交的{5}申请已完成审批,请及时登录系统查看处理结果。
sendMessage = new string [ ] { supervisedPerson , year , month , day , msg } ;
templateId = "2535130" ;
addSMS . type = "Approved" ;
}
else if ( alert = = MessageAlertTypeEnum . ReviewNotification )
{
//[待审批提醒] {1}您好,{2}于{3}年{4}月{5}日提交的{6}申请待您审批,请及时处理。
sendMessage = new string [ ] { supervisor , supervisedPerson , year , month , day , msg } ;
templateId = "2535127" ;
addSMS . type = "ReviewNotification" ;
}
else
{
//[监管预警通知] {1}您好,被监管人{2}于{3}年{4}月{5}日已触发{6}预警,请尽快核查处理。
sendMessage = new string [ ] { supervisor , supervisedPerson , year , month , day , msg } ;
templateId = "2535150" ;
addSMS . type = "RegulatoryAlert" ;
}
// 发送短信
var sendResult = SendSMS ( phone , msg ) ;
var sendResult = SendSMS ( phone , sendMessage , templateId ) ;
addSMS . result = sendResult ;
//发送记录入库
var sms = await _ appSMSRepository . InsertAsync ( addSMS ) ;
return ResultOutput . Ok ( true ) ;
}
@ -181,15 +210,24 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// <summary>
/// 发送短信
///【审批完成通知】
//{0}您好,您于{1}提交的{2}申请已完成审批,请及时登录系统查看处理结果。
//【预警处理提醒】
//{0}您好,您于{1}触发的{2}预警需及时处理,请尽快核查并修正相关事项。
//【监管预警通知】
//{0}您好,被监管人{1}已触发{2}预警,请尽快核查处理。
//【待审批提醒】
//{0}您好,{1}于{2}提交的{3}申请待您审批,请及时处理。
/// </summary>
/// <param name="phone"></param>
/// <param name="msg"></param>
/// <param name="expires"></param>
/// <param name="phone">手机号 </param>
/// <param name="me ssa ges ">消息列表 </param>
/// <param name="templateId">模版编号 </param>
/// <returns></returns>
private string SendSMS ( string phone , string msg , int expires = 5 )
private string SendSMS ( string phone , string [ ] messages , string templateId )
{
try
{
var smsConfig = LazyGetRequiredService < SmsConfiguration > ( ) ;
// 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY
// 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性
// 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等
@ -197,8 +235,8 @@ namespace ATS.NonCustodial.Application.Impl.Admins
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential
{
SecretId = "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8" ,
SecretKey = "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog"
SecretId = smsConfig . SecretId , // "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8",
SecretKey = smsConfig . SecretKey // "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog"
} ;
// 使用临时密钥示例
/ *
@ -212,11 +250,13 @@ namespace ATS.NonCustodial.Application.Impl.Admins
ClientProfile clientProfile = new ClientProfile ( ) ;
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile ( ) ;
httpProfile . Endpoint = ( "sms.tencentcloudapi.com" ) ;
//"sms.tencentcloudapi.com"
httpProfile . Endpoint = ( smsConfig . Endpoint ) ;
clientProfile . HttpProfile = httpProfile ;
// 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient ( cred , "ap-guangzhou" , clientProfile ) ;
//Region = "ap-guangzhou"
SmsClient client = new SmsClient ( cred , smsConfig . Region , clientProfile ) ;
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest ( ) ;
@ -228,22 +268,22 @@ namespace ATS.NonCustodial.Application.Impl.Admins
* 腾 讯 云 短 信 小 助 手 : 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" ;
req . SmsSdkAppId = smsConfig . SmsSdkAppId ; // "1401039888" ;
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
req . SignName = "成都阿凯思信息技术" ;
req . SignName = smsConfig . SignName ; // "成都阿凯思信息技术" ;
/* 模板 ID: 必须填写已审核通过的模板 ID */
// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
req . TemplateId = "2524683" ;
req . TemplateId = templateId ; // "2524683" ;
/* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
req . TemplateParamSet = new string [ ] { msg , expires . ToString ( ) } ;
req . TemplateParamSet = messages ; // new string[] { msg, expires.ToString() } ;
/ * 下 发 手 机 号 码 , 采 用 E . 1 6 4 标 准 , + [ 国 家 或 地 区 码 ] [ 手 机 号 ]
* 示 例 如 : + 8 6 1 3 7 1 1 1 1 2 2 2 2 , 其 中 前 面 有 一 个 + 号 , 8 6 为 国 家 码 , 1 3 7 1 1 1 1 2 2 2 2 为 手 机 号 , 最 多 不 要 超 过 2 0 0 个 手 机 号 * /
req . PhoneNumberSet = new string [ ] { "+86" + phone } ;
req . PhoneNumberSet = new string [ ] { smsConfig . PhoneNumberSet + phone } ;
/* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
req . SessionContext = "" ;