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服务进行测试

同步、异常都测试通过,至此手机短信发送模块集成完成。

返回总目录

摘要: 上篇文章已经封装好了类库,现在继续实现功能,在ABPZero框架的基础上来实现一个完整的功能。 Redis缓存 编写功能前先在本机安装好Redis,需要用到Redis做缓存,以下分享2个Windows安装Redis的教程 博客园:http://www.cnblogs.com/mzws/p/redis阅读全文
posted @ 2018-01-17 18:30李子深 阅读(105) |评论 (1)编辑
摘要: 本篇开始正式做功能,我在开发拼团提醒之前,拼多多并没有放出拼团人数不足就提醒卖家的功能。 有这个想法主要来源于朋友的抱怨,我想这应该是大部分卖家的心声吧。 经过分析,拿到了几个api,不要问我api怎么拿到的,这不是本系列的内容。 接口1:http://apiv4.yangkeduo.com/mal阅读全文
posted @ 2018-01-17 14:02李子深 阅读(27) |评论 (1)编辑
摘要: 现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤。 前面已经有一篇文章讲到集成短信发送模块:http://www.cnblogs.com/shensigzs/category/1147235.html阅读全文
posted @ 2018-01-15 20:11李子深 阅读(454) |评论 (8)编辑
摘要: 本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备。前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码。 注册页面 修改Register.cshtml,备注如下代码: 文件路径:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0阅读全文
posted @ 2018-01-15 19:29李子深 阅读(122) |评论 (0)编辑
摘要: 接着上篇文章,现在去修改注册登录逻辑代码还为时过早,我们还需要到后台去设置一些配置。 管理 设置 先配置好这2项设置,邮箱配置是为了验证注册时功能是否正常,下一篇文章需要用到。 注:邮箱配置中的密码并不是QQ密码,而是在QQ邮箱中生成的授权码,具体获取请登录QQ邮箱查看 语言翻译 进入后台可以看到圈阅读全文
posted @ 2018-01-14 21:12李子深 阅读(308) |评论 (2)编辑
摘要: 毕竟这个框架是外国人开发的,对于我们国人来说还是有些地方并不合适,就好比如注册时需要填写名字、姓氏一样,今天要说的就是如何去掉这2个字段。 先看如下修改完成的效果图 User表结构修改 修改User类,添加如下代码: 文件路径:D:\abp version\aspnet-zero-3.4.0\asp阅读全文
posted @ 2018-01-14 13:27李子深 阅读(133) |评论 (1)编辑
摘要: ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册、登录作铺垫。 阿里云短信服务 首先需要在阿里云开通短信服务,连接地址 开通后,在签名管理中添加一个签名 在模板管理中添加一个模板,如下图所示 最后需要使用阿里云提供的.NET发送短信类库,下面可以直接下载我上传的类库,也可以去官方阅读全文
posted @ 2018-01-13 21:11李子深 阅读(332) |评论 (2)编辑
摘要: 本篇内容杂而简单,不需要多租户、不需要多语言、使用MPA(多页面)、页面加载速度提升…… 刚登录系统会看到如下界面,这不是最终想要的效果,以下就一一来修改。 不需要多租户 AbpZeroTemplateConsts.cs代码修改如下 文件路径:D:\abp version\aspnet-zero-3阅读全文
posted @ 2018-01-13 17:11李子深 阅读(131) |评论 (4)编辑
摘要: 因为要部署项目到云服务器,不想在服务器上装SqlServer,所以需要把项目改为Mysql。 项目初始化 1、下载项目压缩包,前面文章已经说到,可以加群到群文件里下载。解压缩下载的项目源码,使用VS2015打开项目 这里需要还原包,选择解决方案 右键(还原NuGet包),现在还原NuGet包比之前快阅读全文
posted @ 2018-01-13 13:15李子深 阅读(129) |评论 (0)编辑
摘要: 此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录、手机注册、拼团提醒、微信公众号绑定帐号、有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号)。 学习此系列必备: 手机验证码:使用阿里云短信,可注册阿里云帐号订购(后续会介绍) 微信公众号:我所使用的是认证过的阅读全文

ABP集成短信发送模块的更多相关文章

  1. 4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块

    ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册.登录作铺垫. 阿里云短信服务 首先需要在阿里云开通短信服务,连接地址 开通后,在签名管理中添加一个签名 在模板管理中添加一个模板, ...

  2. Abp 添加阿里云短信发送

    ABP中有短信发送接口ISmsSender public interface ISmsSender { Task<string> SendAsync(string number, stri ...

  3. Laravel SMS 短信发送包

    Laravel Sms Laravel 贴合实际需求同时满足多种通道的短信发送组件 我们基于业务需求在 overtrue/easy-sms 基础进行扩展开发,主要实现如下目标: 支持短信验证码直接在 ...

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

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

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

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

  6. 轻松集成腾讯云短信服务实现短信发送(Java实现)

    不论是阿里云还是腾讯云,要想在网站上实现短信发送功能,首先得保证你的网站域名是通过备案的,因为短信签名是需要用到备案过的域名截图,所以域名通过了,申请很快就会审批成功了. (说点题外话,备案的话,需要 ...

  7. Android短彩信源码解析-短信发送流程(三)

    3.短信pdu的压缩与封装 相关文章: ------------------------------------------------------------- 1.短信发送上层逻辑 2.短信发送f ...

  8. 短信发送接口被恶意访问的网络攻击事件(四)完结篇--搭建WAF清理战场

    前言 短信发送接口被恶意访问的网络攻击事件(一)紧张的遭遇战险胜 短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本 ...

  9. day102:MoFang:后端完成对短信验证码的校验&基于celery完成异步短信发送&flask_jwt_extended&用户登录的API接口

    目录 1.用户注册 1.后端完成对短信验证码的校验 2.基于celery实现短信异步发送 2.用户登录 1.jwt登录验证:flask_jwt_extended 2.服务端提供用户登录的API接口 1 ...

随机推荐

  1. node爬虫扒小说

    Step 1:  万年不变的初始化项目,安装依赖 cnpm i express cheerio superagent superagent-charset async -S express 就不用多说 ...

  2. DAG 模型 stacking boxes 动态规划

    题目:UVA 103 stacking boxes 题目大意: 给你两个数,一个是盒子的个数,一个是每一个盒子的维数.将一个个盒子互相装起来,让你求最多可以装多少个,要求字典序最小. 解析:这个就是盒 ...

  3. Java:传值还是传引用?

    这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作 ...

  4. Java中的HashMap源码记录以及并发环境的几个问题

    HashMap源码简单分析: 1 一切需要从HashMap属性字段说起: /** The default initial capacity - MUST be a power of two. 初始容量 ...

  5. DataX的使用

    简介 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.HDFS.Hive.OceanBase.HBase.OTS.ODPS 等各种异构数据源之间高效 ...

  6. Ubuntu下更改Python版本

    https://www.jianshu.com/p/9d3033d1b26f 有些命令运行失败,是因为权限不够,前面加上 sudo 首先查看Python默认版本: ubuntu@user~$:pyth ...

  7. 关于MySQL卸载重新安装的问题

    大体上一共分为3步,那么我们就美其名曰——三步走搞定MySQL安装 为什么说3步呢,如果你非要计较说我一次就重新安装成功了,就当我没说,这些是说给那些经常安装失败的同学看的! 切记,如若不想再以后My ...

  8. Spring @Scheduled定时任务的fixedRate,fixedDelay,cron执行差异

    import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.sp ...

  9. Fragment+FragmentActivity出现The specified child already has a parent. You must call removeView() on the child's parent first.

    这个异常是出现在Fragment中的onCreateView方法中初始化布局时发生的. View view = inflater.inflate(R.layout.fragment3_layout, ...

  10. [08] AOP基本概念和使用

    1.什么是AOP AOP = Aspect Oriental Programing,即面向切面编程.什么概念,我们看如下的图片: 三个方法中,重复使用了代码A和代码B,典型的场景比如"开启事 ...