阿里云--获取短信验证码
最近终于项目差不多告一段落了,最近刚好使用到了阿里云的短信业务。今天就总结一下阿里云短信业务的使用流程。之所以有本篇文章,主要还是由于若参照使用阿里云的文档调用API进行获取验证码文档不够详细容易耗费时间。本篇文章从零开始,新手完全可以按照本篇文章上手阿里云短信业务。
首先,进入阿里云短信业务:
首先,我们需要添加一个签名。签名是干嘛用的呢?其实就是我们每次收到短信验证码放在【】中的公司名称或者产品名称。接下来我们先添加一个签名来测试使用:
接着我们需要添加一个短信模板,可以直接使用常用模板库或者自己手动指定,设置成功会生成一个模板code:
接着我们可以对每天验证码发送总量进行限制,在国内消息设置中进行设置:
阿里云短信业务有两种使用方式:引入SDK直接使用或者调用API实现短信业务的功能。我这里直接调用API获取验证码。首先需要在控制台创建AccessKey,由于我创建过了,所以我直接贴上创建AccessKey的帮助文档:
https://help.aliyun.com/document_detail/53045.html?spm=a2c4g.11186623.2.7.65d62b76hM2JAR
首先创建一个项目,这里我使用express generator快速搭建一个express框架, 命令为:
expressmessage_info
下一步按照控制台要求进入项目并进行初始化,命令为:
cd message_info && npm install
接着在根目录创建config.js,用来存放基本的配置信息。首先在config.js中配置创建accessKey得到的key和secret:
我们调用API需要携带Signature参数。所以需要先加密生成签名,贴下文档链接
https://help.aliyun.com/document_detail/101343.html?spm=a2c4g.11186623.6.610.52da56e02WUmrt
生成签名需要两部分参数:公共请求参数和接口请求参数。我们先看看公共请求参数需要的参数列表:
然后接着我们看下获取验证码接口需要的请求参数:
阿里云短信业务的签名生成规则具体如下:
1.将所有需要参数拼接成一个json对象。
1.1 短信模板变量的值为json格式。
1.2 时间戳格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"。
2.将所有参数按照key的ASCII顺序排列组装成待签名字符串。
2.1 参数以key=value的格式拼接,参数之间以&链接。
2.2 key和value都需要进行urlEncode。
3.待签名字符串需要二次转义,加号(+)替换成%20、星号(*)替换成%2A、%7E替换回波浪号(~)。
4.将待签名字符串加上access得到的secret进行签名,签名采用HmacSHA1算法 + Base64,编码采用UTF-8。
5.将签名以同样方式进行urlEncoded。
接下来我们首先先把必须参数拼接成一个json对象:
接着开始第二步:将所有参数按照key的ASCII顺序排列组装成待签名字符串:
以上算法就可以实现将所有参数按照上面第二步操作进行拼接成待签名字符串。但是我们这样拼接最后多了一个&,所以我们需要先截取字符串把最后一个字符去掉,并且待签名字符串按照文档要求规则拼接指定字符串,拼接规则为:
HTTPMethod + '&' + UrlEncode('/') + '&' + UrlEncode(sortedQueryString)
由于接口是GET请求,所以就是先拼接GET&, 然后再拼接进行转义后的/,最后拼接我们排序后的待签名字符串:
var sortArrStr1 = 'GET&' + encodeURIComponent('/') + '&' + encodeURIComponent(sortArrStr.substring(0, sortArrStr.length - 1));
接着将待签名字符串加上创建accessKey获取的secret进行加密生成签名。这里有两点需要注意:
1.secret右边需要拼接一个 & 。
2.签名采用HmacSHA1算法 + Base64,编码采用UTF-8。
进行HmacSHA1加密需要使用crypto模块。我们现在项目安装crypto模块。命令为:
npm install --save-dev crypto
然后将待签名字符串进行HmacSHA1 + Base64加密,并且将加密后的sign进行转义:
obj.sign = encodeURIComponent(crypto.createHmac('sha1', secret).update(sortArrStr1).digest().toString('base64'));
最后拼接成我们要请求的url,url需要携带Signature以及所有必须参数:
var url = 'http://dysmsapi.aliyuncs.com/?Signature=' + obj.sign + '&' + sortArrStr;
url = url.substring(0, url.length - 1);
到这里我们得到了最终获取验证码的url了,接着我们需要发起GET请求,请求我们最终拼接的url。阿里云就会将我们模板变量设置的验证码是发送给用户。由于之前有介绍过封装request模块发起请求,我这里不重复贴代码了,我直接调用封装好的baseRequest( )请求url:
最后我们可以测试接口是否可成功将生成的随机验证码发送给用户:
可以看到阿里云短信业务返回OK,代表已经成功将验证码发送给用户:
到这里我们获取验证码大功告成,接下来我们要加逻辑对验证码进行业务逻辑验证。我这里采用的业务逻辑为:
1.申请验证码成功将验证码加上用户手机号存储到mysql数据库。
2.用户输入验证码进行验证,会判断验证码是否正确,正确则删除数据库对应的验证码数据。
3.如果连续验证失败5次,则删除数据库对应的验证码数据。
4.如果验证码超时未使用,则删除数据库对应的验证码数据。
首先验证验证码表中是否有获取验证码的账号的验证码数据:
创建ip表对访问ip进行处理,可以对ip进行限制。每次获取验证码需要判断验证码是否受限:
对获取验证码操作是否允许进行限制,比如一天获取上限只能获取5次,每2次获取验证码间隔至少为60S:
如果是从未创建过验证码的账号,则插入一条新数据:
用户输入验证码的时候需要匹配验证码是否正确,我们可以对验证码限制半小时有效期,验证码过期或者错误达到5次或者则删除数据库对应的验证码信息:
如果验证码验证成功则继续业务逻辑,比如注册登陆等逻辑。到这里阿里云短信业务获取验证码就讲解完了。
喜欢我的文章,欢迎关注我的个人公众号:周先生自留地。