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系列教程之拼多多卖家工具 集成短信发送模块相关推荐

  1. ABPZero系列教程之拼多多卖家工具

    此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...

  2. 1、ABPZero系列教程之拼多多卖家工具 前言

    此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...

  3. php weixin provider,14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块

    说是模块,其实在MVC中就是区域,新建一个区域专门管理整个微信功能. Web项目新建区域 在Web项目Areas目录下新建一个区域,名称为"Weixin",如下图: 接着打开web ...

  4. 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现

    上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...

  5. 拼多多后台x4.0监控mysql_11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现...

    上一篇讲解了拼团提醒逻辑功能实现,现在继续实现页面功能. Core项目 打开AbpZeroTemplate-zh-CN.xml语言文件,在末尾添加如下代码: 文件路径:D:\abp version\a ...

  6. 7、ABPZero系列教程之拼多多卖家工具 修改注册功能

    本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备.前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码. 注册页面 修改Register.cshtml,备注如下代码: 文件路径: ...

  7. abp zero mysql_2、ABPZero系列教程之拼多多卖家工具 更改数据库为Mysql

    因为要部署项目到云服务器,不想在服务器上装SqlServer,所以需要把项目改为Mysql. 项目初始化 1.下载项目压缩包,前面文章已经说到,可以加群到群文件里下载.解压缩下载的项目源码,使用VS2 ...

  8. 5、ABPZero系列教程之拼多多卖家工具 修改User表结构

    毕竟这个框架是外国人开发的,对于我们国人来说还是有些地方并不合适,就好比如注册时需要填写名字.姓氏一样,今天要说的就是如何去掉这2个字段. 先看如下修改完成的效果图 User表结构修改 修改User类 ...

  9. 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能

    现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...

最新文章

  1. 【EMC】电磁兼容性相关名词解释、基础知识
  2. 别和 Python 说再见了!!
  3. 深度学习(二十)基于Overfeat的物体检测-2014 ICLR-未完待续
  4. Class Activation Mapping(CAM)
  5. 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...
  6. linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
  7. Linux 两台服务器之间传输文件
  8. 初探 vue 插件开发
  9. javascript基础-函数
  10. Linux signal 那些事儿 (3)
  11. LoadRunner教程(20)-LoadRunner 导出分析报告
  12. ip地址与交换机工作原理
  13. php cms下载地址,让PHPCMS下载内容页显示链接真实地址
  14. 用VC++6.0制作简易浏览器(转)
  15. OneDrive教育版注册和登录
  16. 相对地址,绝对地址,本地地址
  17. 三种平摊分析的方法分别为_关于平摊分析、表的扩增、势能分析初步理解
  18. for(;;)和while(true)都是无条件循环
  19. 异常处理·MSSQL·在将nvarchar值‘XXX‘转换成数据类型int时失败
  20. 【机器人基础】机器人的运动学控制和动力学控制

热门文章

  1. HEVC代码学习39:decodeCtu和xDecodeCU函数
  2. Sketchup模型与ArcGIS进行数据交互的方法
  3. 爬山搜索法c语言代码,模拟退火算法和爬山算法 – 算法大全
  4. Unity+Photon自制多人TPS游戏
  5. tp6 redis 排行榜
  6. django项目如何部署到阿里云服务器
  7. sqllite日期操作
  8. pyecharts可视化:爱情公寓==爱情公墓?
  9. python分析《爱情公寓》电影评分为何2.7, 电影界的“拼多多”!(转)
  10. 另类数据的崛起——CnOpenData在行动(下)