191208_01 Java后台发送短信验证码

Java后台发送短信验证码

作者:邵发
官网:http://afanihao.cn/java

本文介绍如何在Java项目添加短信支持,并演示以手机号进入用户注册的流程。在演示中,用户输入自己手机号进行注册,网站后台发送一个验证码到用户的手机进行验证。本文是Java学习指南系列教程的官方配套文档,配套示例代码或者视频讲解。

 

1.  短信支持

短信业务由电信运营商提供,可以直接与运营商商务联系,也可以使用第三方平台的接口。本文利用阿里云的短信接口进行短信功能的演示。类似的服务提供商和腾讯云、百度云、极光推送等。

在阿里云的后台搜索‘短信服务’,找到短信后台的管理界面。里面要做两个事,一个是短信签名,另一个叫短信模板。

以下图为例:

其中,
短信签名:[阿发你好],表示发送者的机构简称
短信模板:您的验证码${code},该验证码10分钟内有效,请勿泄漏于他人!

在阿里云后台,首先要创建一个短信签名,审核通过。然后再创建一个短信模板,审核通过。之后就可以调用它的短信接口来发送验证码短信了。

1.1 创建短信签名

在它的管理后台,创建一个短信签名。以下截图仅为示意,具体以它的实际提示为准。

191208_01 Java后台发送短信验证码_第1张图片

其中,如果你的一个已经备案的网站域名,建议你选择场景为‘通用’,这样发送的样式就更灵活一些。如果你没有自己的网站域名,就只能选择'验证码'。

 

1.2 创建短信模板

在它的管理界面,创建一个短信模板。以下截图仅为示意,具体以实际界面提示为准。

191208_01 Java后台发送短信验证码_第2张图片

在这里它分为几类短信,有验证码短信,还有一些通用格式的短信。如果你只能看到验证码类型的模板,是因为你上一步里选择的短信签名受限了。

 

2. 短信发送测试

下面,可以建一个Java项目来进行测试。可以是普通的Java项目,也可以是网站项目。在测试时需要使用阿里云提供的SDK包。分别为:

aliyun-java-sdk-core-3.3.1.jar

aliyun-java-sdk-dysmsapi-1.0.0.jar

把这两个JAR包加入到项目的lib目录下。

 

2.1  API 参数

然后,在示例项目下找到 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,这个可以在它的后台管理界面里找得到。下图仅为演示,具体以页面提示为准。

191208_01 Java后台发送短信验证码_第3张图片

 

2.2 短信发送测试

最简单的,直接创建一个测试,例如:

public static void main(String[] args)
{
	VerifySMS.sendWithThread("18601012345", "9527");
	System.out.println("Exit");
}

将会创建一个线程,在线程里调用阿里云的API来发送短信。

 

3.  手机号注册流程

有了短信功能的支持,就可以在网站里加入手机号注册的功能了。让用户输入手机号,把验证码发到用户的手机进行验证就可以了。

3.1 前端演示界面

为了方便演示,作了一个简单的手机号注册页面。

http://127.0.0.1:8080/demo/test

191208_01 Java后台发送短信验证码_第4张图片

让用户输入自己手机号,点‘发送验证码’,用AJAX调用后台的 /sendVerify.do 接口,来发送一个验证码。

 

3.2 发送验证码短信

在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中。向用户提供的手机号发送一此验证码短信。

 

3.3 填写验证码

用户收到验证码短信后,将验证码填到注册页面中。示意图如下:

191208_01 Java后台发送短信验证码_第5张图片

填写验证码,点‘注册’按钮,前端调用后台的 /register.do 接口进行注册

 

3.4 验证并注册

后台在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中的是否一致,如果一致,说明当前用户确实拥有这个手机号。于是允许他以此手机号进行注册。。。

至此,完成手机号的验证和注册功能,本文演示所用的项目源码可以在此获取。

你可能感兴趣的:(Java)