ABP集成短信发送模块
阅读原文时间:2020年09月21日阅读:1

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,添加如下配置节点







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(DependencyLifeStyle.Transient);
//调试模式禁用手机短信发送
//IocManager.Register(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服务进行测试

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

返回总目录

10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现

摘要: 上篇文章已经封装好了类库,现在继续实现功能,在ABPZero框架的基础上来实现一个完整的功能。 Redis缓存 编写功能前先在本机安装好Redis,需要用到Redis做缓存,以下分享2个Windows安装Redis的教程 博客园:http://www.cnblogs.com/mzws/p/redis href="http://www.cnblogs.com/shensigzs/p/8304039.html">阅读全文

posted @ 2018-01-17 18:30李子深 阅读(105) |评论 (1)编辑

9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装

摘要: 本篇开始正式做功能,我在开发拼团提醒之前,拼多多并没有放出拼团人数不足就提醒卖家的功能。 有这个想法主要来源于朋友的抱怨,我想这应该是大部分卖家的心声吧。 经过分析,拿到了几个api,不要问我api怎么拿到的,这不是本系列的内容。 接口1:http://apiv4.yangkeduo.com/mal href="http://www.cnblogs.com/shensigzs/p/8302521.html">阅读全文

posted @ 2018-01-17 14:02李子深 阅读(27) |评论 (1)编辑

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

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

posted @ 2018-01-15 20:11李子深 阅读(454) |评论 (8)编辑

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

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

posted @ 2018-01-15 19:29李子深 阅读(122) |评论 (0)编辑

6、ABPZero系列教程之拼多多卖家工具 框架后台的设置

摘要: 接着上篇文章,现在去修改注册登录逻辑代码还为时过早,我们还需要到后台去设置一些配置。 管理 设置 先配置好这2项设置,邮箱配置是为了验证注册时功能是否正常,下一篇文章需要用到。 注:邮箱配置中的密码并不是QQ密码,而是在QQ邮箱中生成的授权码,具体获取请登录QQ邮箱查看 语言翻译 进入后台可以看到圈阅读全文

posted @ 2018-01-14 21:12李子深 阅读(308) |评论 (2)编辑

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

摘要: 毕竟这个框架是外国人开发的,对于我们国人来说还是有些地方并不合适,就好比如注册时需要填写名字、姓氏一样,今天要说的就是如何去掉这2个字段。 先看如下修改完成的效果图 User表结构修改 修改User类,添加如下代码: 文件路径:D:\abp version\aspnet-zero-3.4.0\asp阅读全文

posted @ 2018-01-14 13:27李子深 阅读(133) |评论 (1)编辑

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

摘要: ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册、登录作铺垫。 阿里云短信服务 首先需要在阿里云开通短信服务,连接地址 开通后,在签名管理中添加一个签名 在模板管理中添加一个模板,如下图所示 最后需要使用阿里云提供的.NET发送短信类库,下面可以直接下载我上传的类库,也可以去官方阅读全文

posted @ 2018-01-13 21:11李子深 阅读(332) |评论 (2)编辑

3、ABPZero系列教程之拼多多卖家工具 项目修改及优化

摘要: 本篇内容杂而简单,不需要多租户、不需要多语言、使用MPA(多页面)、页面加载速度提升…… 刚登录系统会看到如下界面,这不是最终想要的效果,以下就一一来修改。 不需要多租户 AbpZeroTemplateConsts.cs代码修改如下 文件路径:D:\abp version\aspnet-zero-3阅读全文

posted @ 2018-01-13 17:11李子深 阅读(131) |评论 (4)编辑

2、ABPZero系列教程之拼多多卖家工具 更改数据库为Mysql

摘要: 因为要部署项目到云服务器,不想在服务器上装SqlServer,所以需要把项目改为Mysql。 项目初始化 1、下载项目压缩包,前面文章已经说到,可以加群到群文件里下载。解压缩下载的项目源码,使用VS2015打开项目 这里需要还原包,选择解决方案 右键(还原NuGet包),现在还原NuGet包比之前快阅读全文

posted @ 2018-01-13 13:15李子深 阅读(129) |评论 (0)编辑

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

摘要: 此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录、手机注册、拼团提醒、微信公众号绑定帐号、有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号)。 学习此系列必备: 手机验证码:使用阿里云短信,可注册阿里云帐号订购(后续会介绍) 微信公众号:我所使用的是认证过的阅读全文