191208_01 Java後臺發送短信驗證碼

Java後臺發送短信驗證碼

作者:邵發
官網:http://afanihao.cn/java

本文介紹如何在Java項目添加短信支持,並演示以手機號進入用戶註冊的流程。在演示中,用戶輸入自己手機號進行註冊,網站後臺發送一個驗證碼到用戶的手機進行驗證。本文是Java學習指南系列教程的官方配套文檔,配套示例代碼或者視頻講解。

 

1.  短信支持

短信業務由電信運營商提供,可以直接與運營商商務聯繫,也可以使用第三方平臺的接口。本文利用阿里雲的短信接口進行短信功能的演示。類似的服務提供商和騰訊雲、百度雲、極光推送等。

在阿里雲的後臺搜索‘短信服務’,找到短信後臺的管理界面。裏面要做兩個事,一個是短信簽名,另一個叫短信模板。

以下圖爲例:

其中,
短信簽名:[阿發你好],表示發送者的機構簡稱
短信模板:您的驗證碼${code},該驗證碼10分鐘內有效,請勿泄漏於他人!

在阿里雲後臺,首先要創建一個短信簽名,審覈通過。然後再創建一個短信模板,審覈通過。之後就可以調用它的短信接口來發送驗證碼短信了。

1.1 創建短信簽名

在它的管理後臺,創建一個短信簽名。以下截圖僅爲示意,具體以它的實際提示爲準。

其中,如果你的一個已經備案的網站域名,建議你選擇場景爲‘通用’,這樣發送的樣式就更靈活一些。如果你沒有自己的網站域名,就只能選擇'驗證碼'。

 

1.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,這個可以在它的後臺管理界面裏找得到。下圖僅爲演示,具體以頁面提示爲準。

 

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

讓用戶輸入自己手機號,點‘發送驗證碼’,用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 填寫驗證碼

用戶收到驗證碼短信後,將驗證碼填到註冊頁面中。示意圖如下:

填寫驗證碼,點‘註冊’按鈕,前端調用後臺的 /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中的是否一致,如果一致,說明當前用戶確實擁有這個手機號。於是允許他以此手機號進行註冊。。。

至此,完成手機號的驗證和註冊功能,本文演示所用的項目源碼可以在此獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章