ABP中有短信发送接口ISmsSender

 public interface ISmsSender
{
  Task<string> SendAsync(string number, string message);
}

使用阿里云短信服务实现这个接口,使得能够通过阿里云短信服务发送通知短信

ISmsSender一般是在Core项目中,所以实现类也放一起

首先是实现一个ISmsSender

 using Abp.Dependency;
using Castle.Core.Logging;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Globalization;
using System.Net.Http;
using Newtonsoft.Json;
using Microsoft.Extensions.Configuration;
using MyCompany.MyProject.Configuration;
using Microsoft.AspNetCore.Hosting; namespace MyCompany.MyProject.Identity
{
public class AliyunSmsSender : ISmsSender, ITransientDependency
{
public ILogger Logger { get; set; }
string appkey ;
string secret;
string serverUrl = "dysmsapi.aliyuncs.com";
string signName;
string TemplateCode;
private Dictionary<string, string> smsDict = new Dictionary<string, string>
{
{ "RegionId", "cn-hangzhou" },
{ "Action", "SendSms" },
{ "Version", "2017-05-25" },
};
private readonly IConfigurationRoot configuration; public AliyunSmsSender(ILogger Logger, IHostingEnvironment env)
{
configuration = env.GetAppConfiguration();
appkey = configuration["SmsConfiguration:AliSms:appkey"];
secret = configuration["SmsConfiguration:AliSms:secret"];
signName = configuration["SmsConfiguration:AliSms:SignName"];
TemplateCode = configuration["SmsConfiguration:AliSms:TemplateCode"]; smsDict.Add("SignName", signName);//签名
smsDict.Add("TemplateCode", TemplateCode);//模板
smsDict.Add("TemplateParam", "");//参数内容
smsDict.Add("PhoneNumbers", "");//发送到的手机号 }
public async Task<string> SendAsync(string number, string message)
{
try
{
smsDict["PhoneNumbers"] = number;
smsDict["TemplateParam"] = JsonConvert.SerializeObject(new { code = message });
var signatiure = new SignatureHelper();
string res = await signatiure.Request(appkey, secret, serverUrl, smsDict, logger: Logger);
Logger.Info("验证短信发送返回:" + res);
return res;
}
catch (Exception e)
{
Logger.Error(e.Message);
throw;
}
} /// <summary>
/// 签名助手
/// https://help.aliyun.com/document_detail/30079.html?spm=5176.7739992.2.3.HM7WTG
/// </summary>
public class SignatureHelper
{
private const string ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private const string ENCODING_UTF8 = "UTF-8";
public static string PercentEncode(String value)
{
StringBuilder stringBuilder = new StringBuilder();
string text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
byte[] bytes = Encoding.GetEncoding(ENCODING_UTF8).GetBytes(value);
foreach (char c in bytes)
{
if (text.IndexOf(c) >= )
{
stringBuilder.Append(c);
}
else
{
stringBuilder.Append("%").Append(
string.Format(CultureInfo.InvariantCulture, "{0:X2}", (int)c));
}
}
return stringBuilder.ToString();
}
public static string FormatIso8601Date(DateTime date)
{
return date.ToUniversalTime().ToString(ISO8601_DATE_FORMAT, CultureInfo.CreateSpecificCulture("en-US"));
} private static IDictionary<string, string> SortDictionary(Dictionary<string, string> dic)
{
IDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>(dic, StringComparer.Ordinal);
return sortedDictionary;
} public static string SignString(string source, string accessSecret)
{
using (var algorithm = new HMACSHA1())
{
algorithm.Key = Encoding.UTF8.GetBytes(accessSecret.ToCharArray());
return Convert.ToBase64String(algorithm.ComputeHash(Encoding.UTF8.GetBytes(source.ToCharArray())));
}
} public async Task<string> HttpGetAsync(string url, ILogger logger)
{
string responseBody = string.Empty;
using (var http = new HttpClient())
{
try
{
http.DefaultRequestHeaders.Add("x-sdk-client", "Net/2.0.0");
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
responseBody = await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException !");
Console.WriteLine("Message :{0} ", e.Message);
throw;
}
}
return responseBody; } public async Task<string> Request(string accessKeyId, string accessKeySecret, string domain, Dictionary<string, string> paramsDict, ILogger logger, bool security = false)
{
var apiParams = new Dictionary<string, string>
{
{ "SignatureMethod", "HMAC-SHA1" },
{ "SignatureNonce", Guid.NewGuid().ToString() },
{ "SignatureVersion", "1.0" },
{ "AccessKeyId", accessKeyId },
{ "Timestamp", FormatIso8601Date(DateTime.Now) },
{ "Format", "JSON" },
}; foreach (var param in paramsDict)
{
if (!apiParams.ContainsKey(param.Key))
{
apiParams.Add(param.Key, param.Value);
}
}
var sortedDictionary = SortDictionary(apiParams);
string sortedQueryStringTmp = "";
foreach (var param in sortedDictionary)
{
sortedQueryStringTmp += "&" + PercentEncode(param.Key) + "=" + PercentEncode(param.Value);
} string stringToSign = "GET&%2F&" + PercentEncode(sortedQueryStringTmp.Substring());
string sign = SignString(stringToSign, accessKeySecret + "&");
string signature = PercentEncode(sign);
string url = (security ? "https" : "http") + $"://{domain}/?Signature={signature}{sortedQueryStringTmp}";
string result;
try
{
result = await HttpGetAsync(url, logger);
}
catch (Exception)
{ throw;
}
return result; }
}
}
}

然后在core项目的Mudule中配置注入关系

最后在配置文件中加上配置节点即可

"SmsConfiguration": {
"AliSms": {
"appkey": "",
"secret": "",
"SignName": "",
"TemplateCode": ""
}
}

对应上appkey secret,签名,模板code

最后在需要调用的地方注入ISmsSender, 调用其SendAsync方法,传入手机号和内容即可。

Abp 添加阿里云短信发送的更多相关文章

  1. 2018阿里云短信发送DEMO接入简单实例

    以下更新2018-04-2309:57:54 后续不再更新, 基本类: app/SignatureHelper.php <?php namespace aliyun_mns; /** * 签名助 ...

  2. spring boot集成阿里云短信发送接收短信回复功能

    1.集成阿里云通信发送短信: 在pom.xml文件里添加依赖 <!--阿里短信服务--> <dependency> <groupId>com.aliyun</ ...

  3. 阿里云短信发送服务SDK-Python3

    本文提供阿里云的短信发送服务SDK,使用Python3实现. # -*- coding: utf-8 -*- # pip install requests import requests import ...

  4. .net core 使用阿里云短信发送SMS

    阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...

  5. tp5阿里云短信发送

    到阿里云下载php版demo,下完整版的,不是轻量级的; 框架  :TP5 把下载下来的文件放到extend里面 文件名:alimsg 里面的文件 import('alimsg.api_demo.Sm ...

  6. java 阿里云短信发送

    记录自己的足迹,学习的路很长,一直在走着呢~ 第一步登录阿里云的控制台,找到此处: 点击之后就到此页面,如果发现账号有异常或者泄露什么,可以禁用或者删除  AccessKey: 此处方便测试,所以就新 ...

  7. ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成

    在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...

  8. 移动端获取短信验证码java实现——阿里云短信服务

    需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...

  9. 浏览器端获取短信验证码java实现——阿里云短信服务

    需求:浏览器端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短 ...

随机推荐

  1. Mybatis+Mysql 返回主键的值

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...

  2. 在VirtualBox中安装CentOS 7【转载】

    当初接触Linux的时候,因为条件限制,只能在VirtualBox虚拟机中安装Linux系统使用,由于是小白,爬了好多坑.于是决定写一篇关于在虚拟机中安装linux系统的文章.一是为了巩固自己的知识, ...

  3. sql 根据年份、月份查询数据

    CREATE TABLE [dbo].[T_UserAccess]( ,) NOT NULL, [UserId] [int] NULL, [UserType] [int] NULL, ) NULL, ...

  4. NW.js将网站打包成桌面应用

    需求:已有一个网站,因为浏览器兼容性等问题,想自己封装一个浏览器,打开时固定打开这个网站,通过这样的封装,将网站变成桌面应用程序. 1. 下载并安装NW.js的最新稳定版本(NW.js) 2. 创建一 ...

  5. Redis IRedisTypedClient

    IRedisTypedClient IRedisTypedClient类相当于IRedicClient的强类型版,其方法与属性大多数与IRedisClient类似. 它支持在Redis中使用Linq查 ...

  6. VC 绘图,使用双缓冲技术实现

    VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...

  7. .net关于应用程序缓存的一些疑惑

    疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥??? 首先是创建缓存的方法: /// <summary> /// 创建缓存项 ...

  8. 项目:条件查询 通过StringBulider和ArrayList(参数有序) 手动拼接sql

    条件查询的sql拼接 参数拼接 public List<Product> findAll(Product product) throws SQLException { //1.1 拼凑sq ...

  9. HTMLParser使用详解(2)- Node内容

    HTMLParser使用详解(2)- Node内容  2010-03-18 13:41 HTMLParser将解析过的信息留存为一个树的结构.Node是信息留存的数据类型基础.请看Node的界说:pu ...

  10. LSI SAS 3008 Web配置操作

    配置 LSI SAS 3008 介绍LSISAS3008的配置操作. 4.1 登录CU界面 介绍登录LSISAS3008的CU配置界面的方法. 4.2 创建RAID 介绍在LSISAS3008扣卡上创 ...