为了实现在手机注册和登录时获取手机验证码,我使用了阿里的短信服务,下面就来介绍一下具体如何实现。将介绍代码层面如何使用的,去阿里开通该服务,以及如何获得你的accessKeyId和accessKeySecret等。
一、在pom.xml中引入阿里的短信服务依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.0</version> </dependency>
二、在util工具包下新建一个发送短信类SmsService
1、对里面的一些参数进行介绍:
(1)TemplateCode是阿里>短信服务>国内消息>模板管理中的对应消息的模板CODE值。
(2)accessKeyid和accessKeySecret需要登录阿里云网站>点击头像>accessKeys,到里面新建用户拿到。拿到以后我们需要在权限管理处给该用户授权管理短信服务的权限,没有的话会报错。这两个属性只会在新建的时候出现一次,注意保存。
(3)SignName必须设置,是你的短信签名,在签名管理中找签名名称。
(4)TemplateParam给短信模板中设置的参数赋值,有几个参数名赋几个参数,键和你赋的值对应。
(5)其他的基本都好理解了,也不需要改动。
public class SmsService { public static void send(String phone,String key){ //第二个参数为自己独有的accessKeyid,第三个参数为自己独有的accessKeySecret DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI1hYCS9XTEacVqo","0ynfa4RQlbrDpvSz3jZpszcik6aLAAM"); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest();//组装请求对象 //request.setProtocol(ProtocolType.HTTPS); request.setMethod(MethodType.POST);//设置post提交 request.setDomain("dysmsapi.aliyuncs.com");//短信API产品域名(接口地址固定,无需修改) request.setVersion("2017-05-25"); request.setAction("SendSms"); request.putQueryParameter("RegionId", "cn-hangzhou"); request.putQueryParameter("PhoneNumbers", phone); request.putQueryParameter("SignName", "健康教育");//短信签名 request.putQueryParameter("TemplateCode", "SMS_162731312"); request.putQueryParameter("TemplateParam", "{code:"+key+"}"); try { CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
2、为了测试一下,是否配置成功,我们可以在该类中写一个main方法传参进去,运行项目看看收到没,代码如下:成功以后,把这个类中的main方法删除即可。
public static void main(String []args){ SmsService.send("18438595560","1100"); }
三、我们在业务中调用这个类就可以发送短信验证了。
1、简单举个controller类中我调用的的例子。
(1)我们通过前台用户点击获取验证码,使用ajax技术把用户的手机号传过来,session中保存我后台生成的code,为了将来拿出来与用户提交的进行比较。拿到验证码和手机号调用SmsService类发送过去。可以借鉴一下:
/** * 后台获得验证码 */ @RequestMapping("/getcode") @ResponseBody public int getcode(String phone) { long l=System.currentTimeMillis(); int k1=(int) (l%10000); String code=String.valueOf(k1); //session中保存我后台生成的code,为了将来拿出来与用户提交的进行比较。 Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); session.setAttribute("autocode",code); //成功返回0,失败返回1 if(phone!=null){ //把后台生成的code和所发送的手机号传进发送消息类,调用执行。 SmsService.send(phone,code); return 0; }else{ return 1; } }
(2)当用户在前台验证码框输入验证码后,离开表单时,通过ajax把输入的验证码传到后台与后台生成的验证码进行比较,根据比较结果返回不同的响应。通过这种方式进行验证码正确性比较,显而易见,在用户提交表单之前我们就进行了正确性比较,不对的话用户会收到提示,根本不会提交表单成功!
/** *判断验证码的正确性 */ @RequestMapping("/comparecode") @ResponseBody public int authorization(String preauthcode) { Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); String autocode= (String) session.getAttribute("autocode"); //验证码不为空时,到后台进行比较,返回响应码,为1,提示请先获得验证码 //为2,提示验证码错误 //为3,验证码正确,无提示 if(autocode==null){ return 1; }else if(autocode.equals(preauthcode)){ return 3; }else{ return 2; } }
四、以上就是使用阿里短信服务实现手机验证码的过程,思路比较简单,只具体阐释了发送短信类的参数,以及后台验证的具体实现,前台代码就很简单了,使用表单和写一些ajax代码。