**
用户登录任何软件都需要注册账号,有输入手机号发短信的,有获取手机权限获取手机号进行注册的,还有的扫码进行登陆然后关联手机号的,也有关联第三方的比如QQ,新浪微博,支付宝来登录的,无论哪种方式都是为了跟你手机绑定起来,避免一个手机号多个账号的情况
**
今天就随便写一下简单的注册登录代码,
注册的话,手机注册无非两个按钮,一个发送短信,一个注册
注册流程:
用户点击发送短信,后台收到前台传递过来的手机号,然后进行给该手机号发送短信,现在给手机号发送短信的第三方很多,比如阿里大于,科大讯飞,随便找个第三方即可,都是收费的,但是测试会有免费的几条,今天拿阿里大于做个例子
注册一个阿里账号,登录后申请秘钥,然后把SDK下载下来修改下,大概代码如下
先添加依赖,直接下载jar包也可以,基本公司都是用maven,直接引入依赖即可
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
然后写发送短信的方法
/**
* 发送短信
*
* @param phone
* 手机号
*/
public static String send(String phone, String rodom) {
// 第二个参数为自己独有的accessKeyid,第三个参数为自己独有的accessKeySecret
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AAAAA", "BBBBBB");
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:" + rodom + "}");
try {
CommonResponse response = client.getCommonResponse(request);
return response.getData();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return null;
}
然后写个生成6位随机数的方法
// 生成6位随机数
public static String createRodom() {
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++) {
result += random.nextInt(10);
}
return result;
}
后台接口两个应该够用了
/**
* 发送短信接口
*
* @param request
* @param number
* @return
*/
@RequestMapping("/sendSms")
@ResponseBody
public ReturnT<String> sendSms(HttpServletRequest request, String number) {
try {
// 生成6位验证码
String rodom = Sms.createRodom();
// 发送短信
// TODO
// Sms.send(number, rodom);
// 将认证码存入SESSION
request.getSession().setAttribute("verifyCode", rodom);
request.getSession().setAttribute("createTime", System.currentTimeMillis());
return ReturnT.SUCCESS;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 验证验证码是否正确
*
* @param request
* @param verifyCode
* @return
*/
@RequestMapping("/cheakSms")
@ResponseBody
public ReturnT<String> cheakSms(HttpServletRequest request, String phone, String password, String verifyCode) {
String code = (String) request.getSession().getAttribute("verifyCode");
long time = (long) request.getSession().getAttribute("createTime");
// 验证码不为空时,到后台进行比较,返回响应码,
// 为0,提示成功
// 为1,提示请先获得验证码
// 为2,提示验证码错误
// 为3,验证码超时
// 为4,该手机号已注册
if (verifyCode == null) {
return new ReturnT<String>(1, "请先获得验证码");
} else if (verifyCode.equals(code)) {
SysUser user = new SysUser();
user.setLoginName(phone);
ReturnT<SysUser> returnT = sysUserService.selectSysUser(user);
if (returnT == null && "".equals(returnT)) {
if (System.currentTimeMillis() - time > 600000) {
return new ReturnT<String>(3, "验证码超时");
} else {
// 注册成功,存储用户中心,salt默认为123456
String hex = DigestUtils.md5Hex(phone + password + "123456");
SysUser sysUser = new SysUser();
sysUser.setLoginName(phone);
sysUser.setPassword(hex);
sysUser.setSalt("123456");
sysUserService.save(sysUser);
return new ReturnT<String>(0, "注册成功");
}
} else {
return new ReturnT<String>(2, "验证码错误");
}
} else {
return new ReturnT<String>(4, "该手机号已注册");
}
}
注册一个放短信接口,一个检验前台输入的短信验证码,无非就几种情况,一一进行判断下就好了,要么验证码为空,要么不正确,要么已注册,要么已经超时,代码就这么多
接下来开始测试吧,由于短信发完了就手动看验证码