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. Java常见设计模式之单例模式

         1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...

  2. Java中使用同步关键字synchronized需要注意的问题

    在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...

  3. Jenkins搭建Nodejs自动化测试

    一.安装Jenkins(Windows) 1. 在Jenkins官网(https://jenkins.io/)下载安装包,解压并安装 2. 安装完成后,会自动打开一个页面,根据提示在安装目录下找到随机 ...

  4. PopupWindow 从底部弹出窗体

    第一步  : 初始化PopupWindow private void initPop() { if (view == null) { // 照片 view = View.inflate(Registe ...

  5. [原创]Devexpress XtraReports 系列索引

    该系列已经完结...以后如果有高级功能,会再开一个新的系列,该系列是比较基础的报表应用..谢谢大家一直的支持. [原创]Devexpress XtraReports 系列 1 创建静态报表 Demo地 ...

  6. 实现hadoop中的机架感知

    hadoop中声明是有机架感知的功能,能够提高hadoop的性能.平时我们使用的hadoop集群,实际上是从来没有使用上这个功能的. hadoop中所说的 机架感知的实现实际上这样的: hadoop启 ...

  7. 32、Differential Gene Expression using RNA-Seq (Workflow)

    转载: https://github.com/twbattaglia/RNAseq-workflow Introduction RNAseq is becoming the one of the mo ...

  8. Entity Framework Code-First(9.3):DataAnnotations - ConcurrencyCheck Attribute

    ConcurrencyCheck Attribute: ConcurrencyCheck attribute can be applied to a property of a domain clas ...

  9. 11. CTF综合靶机渗透(四)

    运行环境 Virtualbox (二选一) Vnware Workstation player 通关提示 Enumeration is key Try Harder Look in front of ...

  10. Python短小精悍的Orator查询构造器

    查询构造器 介绍 这个数据库查询构造器,提供便利的接口可以创建和执行查询操作,可以在大多数数据库中使用. 查询select操作 查询表中所有的数据. users = db.table('users') ...