一、手机验证码的作用 举个例子:如果你开发了一个系统,那这个系统肯定会有登录功能对吧?那如果说你的密码忘记了呢?
这个时候我们的解决方式是:1、联系管理员;2、再注册一个(emmm,那我以前的资料就没了呀);3、对于管理员自己而言,手动修改数据库或者查看数据库(万一密码加密呢)
为了解决这么个事情,所以我们就引入了手机验证码的功能。
作用:
1、帮助用户直接通过手机号码进行登录,从而解决密码设置繁琐、忘记密码等问题,让账号的登录变得更加方便快捷。同时对于记不住自己的设定账号的用户,直接通过手机+手机验证码的方式登录,对于用户来说更加便利。
2、帮助用户进行交易的确认。比如网购、订购套餐等等,都可能会碰到需要接收手机验证码的操作。通过手机验证码,可以再次确认用户是否是处于自身的意愿去进行的交易,是否是本人进行的交易,是否对交易的内容有充分了解。
二、短信服务的选择 国内有一大堆短信认证的平台,就我所知道的。有腾讯短信服务、阿里短信服务(要求网站上线,或者是企业账号)、榛子云(可以个人体验)等。
三、我选择了榛子云 主要原因有三个:
1、操作简单,可方便快捷实现;
2、支持个人体验套餐
3、20块钱500条信息(还算能接受)
弊端:
个人使用的话,人工客服不理人,技术支持不理你。而且一个很重要很重要的点:在一年里面要用完他,不然就用不了,剩余短信不退款。可恶!!反正我是后面才知道的。但是呢,如果你要玩玩这个功能,也就只能权衡一下利弊。对吧,毕竟是开发者嘛,练练手还是没问题的。
四、注册、登录、充值 1、http://sms_developer.zhenzikj.com/zhenzisms_user/register.html 访问这个网址,至于注册的流程,我就不细说了,应该大家都会操作的。(略)
2、登录
如果你购买了,这里就会显示短信条数
文章图片
3、充值
这里最低充值是20块钱,充值完成,就可以看到上面那张图啦
文章图片
五、查看SDK 下载 点击进入这个榛子-云短信
文章图片
我们用的是spring boot框架进行集成开发,因此我们可以点击Maven,我们会得到下面这个依赖:
com.zhenzikj
zhenzisms
2.0.2
文档也给我们提供了一个js倒计时demo,我们也可以下载下来。解压缩后页面很简洁:
【maven|SpringBoot集成手机验证码业务(榛子云短信服务)】
文章图片
文章图片
六、开始搭建Spring Boot环境1、在idea里面
文章图片
这里面我使用的是jdk8,打包成war,你可以根据你的情况自行改动
文章图片
选择完成之后,点击finish。
2、添加依赖
文章图片
七、进行yaml文件配置 在main下的resource文件下,新建一个application.yaml (温馨提示:记得key-value之间 :有空格)
sms:
apiUrl: https://sms_developer.zhenzikj.com
appId: appId(你的appid)
appSecret: 你的应用签名
timeOut: 3
codeLength: 6
那appId和appSecret在哪里获取呢?
http://sms_developer.zhenzikj.com/zhenzisms_user/index.html
文章图片
八、编写配置类:
新建一个main下创建一个config包:新建一个类ZhenziCodeConfig(随便命名)
package config;
import com.zhenzi.sms.ZhenziSmsClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@Configuration
public class zhenziCode {@Value("${sms.apiUrl}")
private String apiUrl;
@Value("${sms.appId}")
private String appId;
@Value("${sms.appSecret}")
private String appSecret;
public String printRandom(){
//取随机产生的验证码(4位数字)
Random rnd = new Random();
int randNum = rnd.nextInt(8999) + 1000;
//将整型数字转化成字符串
String randStr = String.valueOf(randNum);
return randStr;
}public String sendMessage(String randNum,String phoneNum) throws Exception {
ZhenziSmsClient client = new ZhenziSmsClient(apiUrl, appId, appSecret);
Map params = new HashMap();
params.put("number", phoneNum);
params.put("templateId","8345");
String[] templateParams = new String[2];
templateParams[0] = randNum;
templateParams[1] = "5分钟";
params.put("templateParams", templateParams);
String result = client.send(params);
return result;
}}
九、新建controller类 1、通过随机数生成验证码并且保存在session里面(可以用redis设置过期时间)
package cn.com.sise.book.controller;
import cn.com.sise.book.config.zhenziCode;
import cn.com.sise.book.domain.phone;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
@Controller
public class PhoneNumContoller {@Autowired
private zhenziCode zhenziCode;
/***
* 验证手机号码 并且发送验证码
* @param request
* @param phoneNum
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "https://www.it610.com/PhoneNumCode",method = RequestMethod.POST)
public String toCode(HttpServletRequest request, String phoneNum) throws Exception {
HttpSession session = request.getSession(true);
String random = zhenziCode.printRandom();
session.setAttribute("randStr",random);
System.out.println("sendCode:"+random);
System.out.println(phoneNum);
return zhenziCode.sendMessage(random,phoneNum);
}
}
2、新建一个跳转到index.html的试图控制器
@Controller
public class IndexController {
@RequestMapping("/")
public String toIndex(){
return "index";
}
}
十、将刚才下载的js代码复制到 resource 下面: 资源放在static,页面放在templates里面
文章图片
注意修改index.html的资源路径
文章图片
十一、编写index页面的请求地址
文章图片
$(function(){
$(".captchaBtn").on("click", function(){
let that = this;
let phone =$("#phoneNum").val();
if (phone==""||phone==null || phone.length<11 || phone.length>11){
return alert("请正确的电话号码")
}
$.post("/PhoneNumCode",{
"phoneNum": phone
},function (res){
res = JSON.parse(res)
if (res.code==0){
countdown(that);
return alert(res.data)
}
return alert(res.data);
})
})
});
文章图片
文章图片
至此,我们就已经完成了整个手机验证码的验证功能。下面附一张错误码
文章图片
哈哈,最后,你学会了吗?如果有问题可以评论去见哦!
如果你需要源码,可以进入我的主页去下载(免费)
推荐阅读
- JavaWeb|最棒的SpringBoot多模块应用开发教程
- springboot|SpringBoot 日志系列:(一)日志类型
- java|springboot日志打印
- springboot|SpringBoot 日志系列:(二)日志配置
- springboot|SpringBoot2.x系列(二)生产环境日志及预警
- SrpingBoot技术总结|构建SpringBoot实战项目 系列文章之日志配置
- SpringBoot|SpringBoot的参数校验器 - Validator
- 数据库|SpringBoot数据库连接池Druid的配置及log4j:WARN的解决
- 技术干货|SpringBoot 2.0 中 HikariCP 数据库连接池原理解析