4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块
ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册、登录作铺垫。
阿里云短信服务
首先需要在阿里云开通短信服务,连接地址
开通后,在签名管理中添加一个签名

在模板管理中添加一个模板,如下图所示

最后需要使用阿里云提供的.NET发送短信类库,下面可以直接下载我上传的类库,也可以去官方下载,然后提取我所说的2个类库(aliyun-net-sdk-core.dll、aliyun-net-sdk-dysmsapi.dll)
直接下载文件:https://files.cnblogs.com/files/shensigzs/aliyun-net-sdk.zip (里面包含2个类库,把这2个类库引用到Core项目)
.NET发送短信SDK:https://help.aliyun.com/document_detail/59836.html?spm=5176.doc55284.6.573.GaNxg6
安装类库
如下图所示
使用的模块是Abp.Net.Sms,源码地址:https://github.com/berkaroad/Abp.Net.Sms

Core项目添加实现
添加AliDayuSmsSender类,实现2个方法(一个同步、一个异步)
文件路径:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\Authorization\Users\AliDayuSmsSender.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Net.Sms;
using Abp.UI;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
using Castle.Core.Logging; namespace MyCompanyName.AbpZeroTemplate.Authorization.Users
{
public class AliDayuSmsSender : SmsSenderBase, ITransientDependency
{
private IClientProfile profile = null;
public ILogger Logger { get; set; }
public AliDayuSmsSender(ISmsSenderConfiguration configuration) : base(configuration)
{
Logger = NullLogger.Instance;
profile = DefaultProfile.GetProfile("cn-hangzhou", configuration.GetAppKey(), configuration.GetAppSecret());
} protected override void SendSms(SmsMessage sms)
{ DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
try
{
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = sms.To;
//必填:短信签名-可在短信控制台中找到
request.SignName = sms.FreeSignName;
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = string.IsNullOrEmpty(sms.TemplateCode)
? _configuration.GetDefaultSmsTemplateCode()
: sms.TemplateCode;
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.TemplateParam = sms.TemplateParams;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.OutId = "yourOutId";
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
Logger.Info("发送返回:" + sendSmsResponse.Message);
}
catch (ServerException e)
{
throw new UserFriendlyException("短信发送失败",
new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
sms.To,
e.ErrorCode,
e.Message)));
}
catch (ClientException e)
{
throw new UserFriendlyException("短信发送失败",
new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
sms.To,
e.ErrorCode,
e.Message)));
} } protected override Task SendSmsAsync(SmsMessage sms)
{
DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
var task = new Task(() =>
{
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
try
{
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = sms.To;
//必填:短信签名-可在短信控制台中找到
request.SignName = sms.FreeSignName;
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = string.IsNullOrEmpty(sms.TemplateCode)
? _configuration.GetDefaultSmsTemplateCode()
: sms.TemplateCode;
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.TemplateParam = sms.TemplateParams;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.OutId = "yourOutId";
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
Logger.Info("发送返回:" + sendSmsResponse.Message);
}
catch (ServerException e)
{
throw new UserFriendlyException("短信发送失败",
new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
sms.To,
e.ErrorCode,
e.Message)));
}
catch (ClientException e)
{
throw new UserFriendlyException("短信发送失败",
new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
sms.To,
e.ErrorCode,
e.Message)));
}
}); task.Start();
return task;
}
}
}
修改AppSettingProvider.cs,在return new[]里面添加如下代码
文件路径:D:\abpweb\PddSellerAssistant\PddSellerAssistant.Core\Configuration\AppSettingProvider.cs
return new[]
{
// Sms config
new SettingDefinition(SmsSettingNames.ServiceUrl,
ConfigurationManager.AppSettings[SmsSettingNames.ServiceUrl] ?? ""),
new SettingDefinition(SmsSettingNames.AppKey,
ConfigurationManager.AppSettings[SmsSettingNames.AppKey] ?? ""),
new SettingDefinition(SmsSettingNames.AppSecret,
ConfigurationManager.AppSettings[SmsSettingNames.AppSecret] ?? ""),
new SettingDefinition(SmsSettingNames.DefaultFreeSignName,
ConfigurationManager.AppSettings[SmsSettingNames.DefaultFreeSignName] ?? ""),
new SettingDefinition(SmsSettingNames.DefaultSmsTemplateCode,
ConfigurationManager.AppSettings[SmsSettingNames.DefaultSmsTemplateCode] ?? ""),
//Host settings
修改web.config,添加如下配置节点
<!-- 短信api配置开始-->
<add key="Abp.Net.Sms.AppKey" value="" />
<add key="Abp.Net.Sms.AppSecret" value="" />
<add key="Abp.Net.Sms.DefaultFreeSignName" value="填写签名名称" />
<add key="Abp.Net.Sms.DefaultSmsTemplateCode" value="填写模板ID" />
<add key="Abp.Net.Sms.ServiceUrl" value="" />
<!-- 短信api配置结束-->
AppKey、AppSecret都可以在阿里云后台获取
修改AbpZeroTemplateCoreModule,代码修改如下
文件路径:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\AbpZeroTemplateCoreModule.cs
if (DebugHelper.IsDebug)
{
//调试模式禁用邮件发送
//IocManager.Register<IEmailSender, NullEmailSender>(DependencyLifeStyle.Transient);
//调试模式禁用手机短信发送
//IocManager.Register<ISmsSender, NullSmsSender>(DependencyLifeStyle.Transient);
}
可以看到我都备注掉,因为我就是要在调试模式下测试邮件、短信是否能够发送。
[DependsOn(typeof(AbpZeroCoreModule),
typeof(AbpZeroLdapModule),
typeof(AbpAutoMapperModule),
typeof(AbpNetSmsModule)
)]
此处是添加短信模块依赖
Application项目
添加文件ISmsMessageService.cs
文件路径:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Application\Authorization\Users\ISmsMessageService.cs
public interface ISmsMessageService : IApplicationService
{
void Send(string to, string templateCode, string templateParams);
Task SendAsync(string to, string templateCode, string templateParams);
}
再添加实现文件SmsMessageService.cs
文件路径:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Application\Authorization\Users\SmsMessageService.cs
public class SmsMessageService: ISmsMessageService
{
private readonly ISmsSender _smsSender; public SmsMessageService(ISmsSender smsSender)
{
_smsSender = smsSender;
} public void Send(string to, string templateCode, string templateParams)
{
_smsSender.Send(to, templateCode, templateParams);
} public async Task SendAsync(string to, string templateCode, string templateParams)
{
await _smsSender.SendAsync(to, templateCode, templateParams);
}
}
测试短信发送
最后,生成项目
浏览器打开:http://localhost:8088/swagger/ui/index(8088是IIS配置的端口)
找到app_smsMessageService服务进行测试


同步、异常都测试通过,至此手机短信发送模块集成完成。
4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块的更多相关文章
- 14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块
说是模块,其实在MVC中就是区域,新建一个区域专门管理整个微信功能. Web项目新建区域 在Web项目Areas目录下新建一个区域,名称为“Weixin",如下图: 接着打开web.conf ...
- 1、ABPZero系列教程之拼多多卖家工具 前言
此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...
- 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...
- 10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现
上篇文章已经封装好了类库,现在继续实现功能,在ABPZero框架的基础上来实现一个完整的功能. Redis缓存 编写功能前先在本机安装好Redis,需要用到Redis做缓存,以下分享2个Windows ...
- 9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装
本篇开始正式做功能,我在开发拼团提醒之前,拼多多并没有放出拼团人数不足就提醒卖家的功能. 有这个想法主要来源于朋友的抱怨,我想这应该是大部分卖家的心声吧. 经过分析,拿到了几个api,不要问我api怎 ...
- 11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现
上一篇讲解了拼团提醒逻辑功能实现,现在继续实现页面功能. Core项目 打开AbpZeroTemplate-zh-CN.xml语言文件,在末尾添加如下代码: 文件路径:D:\abp version\a ...
- 2、ABPZero系列教程之拼多多卖家工具 更改数据库为Mysql
因为要部署项目到云服务器,不想在服务器上装SqlServer,所以需要把项目改为Mysql. 项目初始化 1.下载项目压缩包,前面文章已经说到,可以加群到群文件里下载.解压缩下载的项目源码,使用VS2 ...
- 7、ABPZero系列教程之拼多多卖家工具 修改注册功能
本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备.前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码. 注册页面 修改Register.cshtml,备注如下代码: 文件路径: ...
- 13、ABPZero系列教程之拼多多卖家工具 微信公众号开发前的准备
因为是开发阶段,我需要在本地调试,而微信开发需要配置域名,这样natapp.cn就有了用武之地,应该说natapp就是为此而生的. natapp.cn是什么 这是一个内网映射的网站,支持微信公众号.小 ...
随机推荐
- EularProject 43: 带条件约束的排列组合挑选问题
Sub-string divisibility Problem 43 The number, 1406357289, is a 0 to 9 pandigital number because it ...
- One-Based Arithmetic
One-Based Arithmetic time limit per test 0.5 seconds memory limit per test 256 megabytes input stand ...
- canvas雪花
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【SqlServer系列】表达式(expression)
1 概述 本篇这文章主要概述SqlServer表达式. 2 具体内容 2.1 使用范围 SQL Server(2008开始) :Azure SQL数据库:Azure SQL数据仓库:并行数 ...
- 询问Spring Bott和高并发框架两个问题
这里我问两个问题,请大神告诉我. 第一个问题,如果我想用Spring Boot开发企业级的微服务,我该看哪些资料?比如数据库该如何配置?消息中间件该怎么设置?等等.或者可以推荐给我几本这方面的书. 第 ...
- 二、springcloud Netflix 注册中心
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- attr设置checked,disabled等属性失效的问题,jquery的attr和prop的区别
最近做项目遇到一个问题,radio设置了默认checked值,attr("checked",true)切换checked值失效 最后发现是jquery1.6版本之后,attr和pr ...
- 前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)
一.Vue的实例 1.1.创建一个 Vue 的实例 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 虽然没有完全遵循 ...
- 对Java中堆栈的解析
Java把内存分为两种:一种是栈内存,一种是堆内存 栈内存:在函数中定义的一些基本类型的变量和对象的引用变量,当超过变量的作用域之后,Java自动释放该变量内存 堆内存:存放new创建的对象和数组,由 ...
- SPARQL查询语言
SPARQL的查询是基于结构化知识的,变无序数据为有序知识,让计算机理解Web信息,即语义Web.现如今,语义网适用于各个领域,包括语义出版.语义知识库等.SPARQL是针对以RDF框架进行存储的知识 ...