作者:邵发
官网:http://afanihao.cn/java
本文介绍如何在Java项目添加短信支持,并演示以手机号进入用户注册的流程。在演示中,用户输入自己手机号进行注册,网站后台发送一个验证码到用户的手机进行验证。本文是Java学习指南系列教程的官方配套文档,配套示例代码或者视频讲解。
短信业务由电信运营商提供,可以直接与运营商商务联系,也可以使用第三方平台的接口。本文利用阿里云的短信接口进行短信功能的演示。类似的服务提供商和腾讯云、百度云、极光推送等。
在阿里云的后台搜索‘短信服务’,找到短信后台的管理界面。里面要做两个事,一个是短信签名,另一个叫短信模板。
以下图为例:
其中,
短信签名:[阿发你好],表示发送者的机构简称
短信模板:您的验证码${code},该验证码10分钟内有效,请勿泄漏于他人!
在阿里云后台,首先要创建一个短信签名,审核通过。然后再创建一个短信模板,审核通过。之后就可以调用它的短信接口来发送验证码短信了。
在它的管理后台,创建一个短信签名。以下截图仅为示意,具体以它的实际提示为准。
其中,如果你的一个已经备案的网站域名,建议你选择场景为‘通用’,这样发送的样式就更灵活一些。如果你没有自己的网站域名,就只能选择'验证码'。
在它的管理界面,创建一个短信模板。以下截图仅为示意,具体以实际界面提示为准。
在这里它分为几类短信,有验证码短信,还有一些通用格式的短信。如果你只能看到验证码类型的模板,是因为你上一步里选择的短信签名受限了。
下面,可以建一个Java项目来进行测试。可以是普通的Java项目,也可以是网站项目。在测试时需要使用阿里云提供的SDK包。分别为:
aliyun-java-sdk-core-3.3.1.jar
aliyun-java-sdk-dysmsapi-1.0.0.jar
把这两个JAR包加入到项目的lib目录下。
然后,在示例项目下找到 my.app.sms.VerifySMS这个类,里面有简单的测试。
在测试之前,需要替换4个变量参数的值:
static final String signName = "阿发你好";
static final String templateCode = "SMS_139212345";
static final String accessKeyId = "C7HXXXXXXXXX";
static final String accessKeySecret = "KMcXXXXXXXXXXXXXXXXX";
这4个参数,分别表示‘短信签名’,‘短信模板Code’, API Key 和 API Secret。在调用阿里云服务时总是传入API Key和 API Secret,这个可以在它的后台管理界面里找得到。下图仅为演示,具体以页面提示为准。
最简单的,直接创建一个测试,例如:
public static void main(String[] args)
{
VerifySMS.sendWithThread("18601012345", "9527");
System.out.println("Exit");
}
将会创建一个线程,在线程里调用阿里云的API来发送短信。
有了短信功能的支持,就可以在网站里加入手机号注册的功能了。让用户输入手机号,把验证码发到用户的手机进行验证就可以了。
为了方便演示,作了一个简单的手机号注册页面。
http://127.0.0.1:8080/demo/test
让用户输入自己手机号,点‘发送验证码’,用AJAX调用后台的 /sendVerify.do 接口,来发送一个验证码。
在my.app.controller.TestController里添加一个REST接口,示例代码如下。
@PostMapping("/sendVerify.do")
public Object sendVerify(@RequestBody JSONObject jreq
, HttpSession session) throws Exception
{
// 生成一个4位随机数作为验证码,放在Session里
int rand = new Random().nextInt(10000);
String verifyCode = String.format("%04d", rand);
session.setAttribute("verifyCode", verifyCode);
// 向此手机号发送一条短信
String phone = jreq.getString("phone");
VerifySMS.sendWithThread(phone, verifyCode);
session.setAttribute("phone", phone);
return new AfRestData("");
}
其中,生成一个4位随机数字作为验证码,并存入Session中。向用户提供的手机号发送一此验证码短信。
用户收到验证码短信后,将验证码填到注册页面中。示意图如下:
填写验证码,点‘注册’按钮,前端调用后台的 /register.do 接口进行注册
后台在my.app.controller.TestController里,添加一个REST接口: /register.do ,示意代码如下。
@PostMapping("/register.do")
public Object register(@RequestBody JSONObject jreq
, HttpSession session)throws Exception
{
// 比较验证码是否一致
String verifyCode = (String) session.getAttribute("verifyCode");
String verifyCode2 = jreq.getString("verifyCode");
if(!verifyCode2.equals(verifyCode))
return new AfRestError(-8, "错误的验证码");
// 从Session中取出Phone
String phone = (String) session.getAttribute("phone");
String phone2 = jreq.getString("phone");
if(!phone2.equals(phone))
return new AfRestError(-9, "更换了手机号,需重新验证!");
// TODO: 手机号验证通过... 写入数据库 ...
// 返回成功
return new AfRestData("");
}
后台需要对比用户提供的信息(手机号、验证码)和Session中的是否一致,如果一致,说明当前用户确实拥有这个手机号。于是允许他以此手机号进行注册。。。
至此,完成手机号的验证和注册功能,本文演示所用的项目源码可以在此获取。