上周接到一个需求,说要给登录做一个发送短信验证码功能。
思考实现思路:先校验用户名密码→用户名密码正确→判断当前设备是否为新设备(获取设备码和数据库中存的设备码做比较,怎么获取设备码这篇博客不讲,因为我暂时也不知道。等之后我了解了我再补上)→是新设备,发送验证码→......
现在写怎么发送验证码。
我用的阿里云短信服务。你也可以用腾讯云、百度云、随便什么云都OK,只是代码可能有点区别,但是大部分应该都会有文档吧。如果怕不会弄,那你就和我一样用阿里云,然后可以参考一下我的博客去了解短信业务。
废话不多说,现在开始。java语言
第一步:注册一个阿里云帐号(有帐号就进行下一步)
第二步:在产品服务里搜短信服务
第三步:查看短信服务产品页面
这里面有三个值得关注的地方:
①帮助文档,这里面有很多关于短信服务的介绍,包括错误代码的释义什么的。
②国内消息,这里面有几个配置参数是后面在短信代码里面会用到的,要在这里面配置参数。
③测试demo,在写代码之前你可以先去测试一下,当然,要一点点钱,0.045一条短信,你往里面充5毛钱就够你发好几条了。怎么充钱,去哪里充,你用测试代码测一下,它会告诉你余额不足,然后会甩给你一个链接,你点击那个链接充就行了。我听说有10块钱试用券,但是我没有找到,你们可以找找,找不到的话就先充5毛钱玩玩吧。
第三步:查看代码示例,可以直接点击第二步里面的“查看api demo”,然后就直接来到了第三步这里,测试demo也叫可视化调试。这张图里面最重要的几个地方已经框出来了
从左往右看
①第一个框里框出来的东西代表三种短信类型,是单个发还是批量发。验证码是单个发,所以我只用了sendsms
②第二个框里框出来的东西是一些参数,比如你的短信是发给谁的,签名是什么(后面会讲签名是什么),用哪个短信模板(就是一个短信模板,比如:您正在注册账号,您的验证码是xxxx。这就是一个模板,除了验证码会变,其他都一样。后面会讲怎么设置)。然后需不需要参数填templateParam?如果只是发商品推广信息什么的,没有校验功能的短信就不需要这个templateParam,有的话就要把参数以json的格式写在这,后续代码会取值赋值给它。
③你把第二个框框里你需要的参数填了以后,第三个框框里会自动给你生成代码。
测试一下,点击发起调用。(如果提示余额不足记得充个5毛钱什么的)
看一下效果:
OK,写到这,现在开始讲怎么开始写这个东西。在demo里我们可以看到,标*必填的参数有两个,另外还有两个在帮助文档里也有提到,就是AccessKey。具体怎么获取这个,看帮助文档。
第四步:现在,我假设你已经拿到AccessKey了。
然后我们去配置签名和短信模板。点开第二张图里说的“国内消息”
①签名配置
点击“添加签名”,可以看到,我之前已经添加了一次签名了。签名名称就是mangolb,也就是短息里面中括号【】里面显示的内容。
按照提示填好信息即可。
②短信模板配置
添加模板
常用模板库
模板库里面有很多模板。看我红色框框出来的就是验证码的赋值处。既然有验证码,那个templateParam就必须要填。
OK,假设AccessKey你也弄了,签名、模板也配置好了。那么就可以写代码了。其实可以直接copy示例代码里的代码,然后改一下就ok了。看看我的代码:
代码如下:
public class AliyunSendSmsUtil {
static final String domain="dysmsapi.aliyuncs.com";
static final String version="2017-05-25";
static final String action="SendSms";
static final String templateCode="你的templateCode";
static final String signName="你的签名";
//此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
static final String accessKeyId = "你的accessKeyId ";
static final String accessKeySecret = "你的accessKeySecret ";
public static Map<String,Object> sendSms(String phoneNumber) {
CommonResponse response=new CommonResponse();
Integer code=(int) ((Math.random() * 9 + 1) * 100000);
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
//request.setProtocol(ProtocolType.HTTPS);
request.setMethod(MethodType.POST);
request.setDomain(domain);
request.setVersion(version);
request.setAction(action);
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", phoneNumber);
request.putQueryParameter("SignName", signName);
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParam", "{\"code\":\""+code+"\"}");
try {
response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
Map<String,Object> map=new HashMap<>();
map.put("response",response.getData());
map.put("code",code);
return map;
}
}
OK,到此,这个方法就OK了,后续自己进行调用就行了。
然后还要考虑防刷。防止被人直接调你的接口然后刷光你的短信,也就是刷光你的钱。什么意思?请百度短信轰炸机。嘿嘿!
防刷的话,一般都是添加图片验证码那种,就12306那种你懂得吧。
嗯,大概就这样。
over!
也可以参考一下这篇博文: