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 confignew 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服务进行测试
同步、异常都测试通过,至此手机短信发送模块集成完成。
返回总目录
转载于:https://www.cnblogs.com/shensigzs/p/8280542.html
4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块相关推荐
- ABPZero系列教程之拼多多卖家工具
此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...
- 1、ABPZero系列教程之拼多多卖家工具 前言
此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...
- php weixin provider,14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块
说是模块,其实在MVC中就是区域,新建一个区域专门管理整个微信功能. Web项目新建区域 在Web项目Areas目录下新建一个区域,名称为"Weixin",如下图: 接着打开web ...
- 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...
- 拼多多后台x4.0监控mysql_11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现...
上一篇讲解了拼团提醒逻辑功能实现,现在继续实现页面功能. Core项目 打开AbpZeroTemplate-zh-CN.xml语言文件,在末尾添加如下代码: 文件路径:D:\abp version\a ...
- 7、ABPZero系列教程之拼多多卖家工具 修改注册功能
本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备.前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码. 注册页面 修改Register.cshtml,备注如下代码: 文件路径: ...
- abp zero mysql_2、ABPZero系列教程之拼多多卖家工具 更改数据库为Mysql
因为要部署项目到云服务器,不想在服务器上装SqlServer,所以需要把项目改为Mysql. 项目初始化 1.下载项目压缩包,前面文章已经说到,可以加群到群文件里下载.解压缩下载的项目源码,使用VS2 ...
- 5、ABPZero系列教程之拼多多卖家工具 修改User表结构
毕竟这个框架是外国人开发的,对于我们国人来说还是有些地方并不合适,就好比如注册时需要填写名字.姓氏一样,今天要说的就是如何去掉这2个字段. 先看如下修改完成的效果图 User表结构修改 修改User类 ...
- 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能
现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...
最新文章
- 【EMC】电磁兼容性相关名词解释、基础知识
- 别和 Python 说再见了!!
- 深度学习(二十)基于Overfeat的物体检测-2014 ICLR-未完待续
- Class Activation Mapping(CAM)
- 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...
- linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
- Linux 两台服务器之间传输文件
- 初探 vue 插件开发
- javascript基础-函数
- Linux signal 那些事儿 (3)
- LoadRunner教程(20)-LoadRunner 导出分析报告
- ip地址与交换机工作原理
- php cms下载地址,让PHPCMS下载内容页显示链接真实地址
- 用VC++6.0制作简易浏览器(转)
- OneDrive教育版注册和登录
- 相对地址,绝对地址,本地地址
- 三种平摊分析的方法分别为_关于平摊分析、表的扩增、势能分析初步理解
- for(;;)和while(true)都是无条件循环
- 异常处理·MSSQL·在将nvarchar值‘XXX‘转换成数据类型int时失败
- 【机器人基础】机器人的运动学控制和动力学控制
热门文章
- HEVC代码学习39:decodeCtu和xDecodeCU函数
- Sketchup模型与ArcGIS进行数据交互的方法
- 爬山搜索法c语言代码,模拟退火算法和爬山算法 – 算法大全
- Unity+Photon自制多人TPS游戏
- tp6 redis 排行榜
- django项目如何部署到阿里云服务器
- sqllite日期操作
- pyecharts可视化:爱情公寓==爱情公墓?
- python分析《爱情公寓》电影评分为何2.7, 电影界的“拼多多”!(转)
- 另类数据的崛起——CnOpenData在行动(下)