Jave Web阿里雲簡訊服務傳送驗證碼

先生何許人也_發表於2019-04-20

首先得在阿里雲根據流程開通簡訊服務,申請簽名和模版,具體看文件

Jave Web阿里雲簡訊服務傳送驗證碼

因為這是個web專案,用到了thymeleaf模板,所以在pom.xml中加入如下依賴

		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-core</artifactId>
			<version>4.4.0</version>
		</dependency>
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
			<version>1.1.0</version>
		</dependency>
		
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

複製程式碼

verifyCodeGenerator.java是生成驗證碼的工具類

public class verifyCodeGenerator {
//    生成驗證碼
public static String getVerifyCode()
{
    Random random=new Random();
StringBuffer stringBuffer=new StringBuffer();
for (int i=0;i<6;i++)
{
    stringBuffer.append(String.valueOf(random.nextInt(10)));
}
    System.out.println(stringBuffer.toString());
    return  stringBuffer.toString();
}
}
複製程式碼

MsUtil .java是傳送驗證碼的工具類

public class MsUtil {
//    傳送驗證碼及返回驗證碼字串
    public static String send(String mobile)
    {
        //設定超時時間-可自行調整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的幾個引數
        final String product = "Dysmsapi";//簡訊API產品名稱(簡訊產品名固定,無需修改)
        final String domain = "dysmsapi.aliyuncs.com";//簡訊API產品域名(介面地址固定,無需修改)
//替換成你的AK
        final String accessKeyId = "yourAccessKeyId";//你的accessKeyId,參考本文件步驟2
        final String accessKeySecret = "yourAccessKeySecret";//你的accessKeySecret,參考本文件步驟2
//初始化ascClient,暫時不支援多region(請勿修改)
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
                accessKeySecret);
        try {
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        } catch (ClientException e) {
            e.printStackTrace();
        }

        IAcsClient acsClient = new DefaultAcsClient(profile);
        //組裝請求物件
        SendSmsRequest request = new SendSmsRequest();
        //使用post提交
//        request.setMethod(MethodType.POST);//過期了
        request.setSysMethod(MethodType.POST);
        //必填:待傳送手機號。支援以逗號分隔的形式進行批量呼叫,批量上限為1000個手機號碼,批量呼叫相對於單條呼叫及時性稍有延遲,驗證碼型別的簡訊推薦使用單條呼叫的方式;傳送國際/港澳臺訊息時,接收號碼格式為國際區號+號碼,如“85200000000”
        request.setPhoneNumbers(mobile);
        //必填:簡訊簽名-可在簡訊控制檯中找到
        request.setSignName("小生不才");
        //必填:簡訊模板-可在簡訊控制檯中找到,傳送國際/港澳臺訊息時,請使用國際/港澳臺簡訊模版
        request.setTemplateCode("SMS_162732775");
        //可選:模板中的變數替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
        //友情提示:如果JSON中需要帶換行符,請參照標準的JSON協議對換行符的要求,比如簡訊內容中包含\r\n的情況在JSON中需要表示成\\r\\n,否則會導致JSON在服務端解析失敗
        String verifyCode=verifyCodeGenerator.getVerifyCode();
        request.setTemplateParam("{\"code\":" + verifyCode + "}");
        //可選-上行簡訊擴充套件碼(擴充套件碼欄位控制在7位或以下,無特殊需求使用者請忽略此欄位)
        //request.setSmsUpExtendCode("90997");
        //可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
        request.setOutId("yourOutId");
//請求失敗這裡會拋ClientException異常
        try {
            SendSmsResponse acsResponse = acsClient.getAcsResponse(request);
        } catch (ClientException e) {
           e.printStackTrace();
        }
//        if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//            return verifyCode;
////請求成功
//        }
     return  verifyCode;
    }
}
複製程式碼

application.properties的配置

#關閉thymeleaf快取
spring.thymeleaf.cache=false
#ָ埠
server.port=8888
#模板的路徑
spring.freemarker.template-loader-path=classpath:/templates
#設定模板的字元編碼
spring.freemarker.charset=utf-8
        
複製程式碼

thymeleaf模板頁面

sign_in.html 是傳送和輸入驗證碼頁面
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="matchCode" method="post">
    <!--<input type="text" placeholder="請輸入手機號碼"/>-->
    <input type="text" placeholder="請輸入驗證碼" name="yourCode">
    <input type="submit" value="確定">
</form>
<div th:text="${code}"></div>
</body>
</html>		
複製程式碼
test.html 是驗證結果頁面
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div th:text="${result}"></div>
</body>
</html>
複製程式碼

UserController .java

@Controller
public class UserController {
    @Autowired
    private HttpServletRequest request; //自動注入request

@GetMapping(value = "/")
public String sign(Model model)
{
    String code= MsUtil.send("你接收驗證碼的手機號");
//    String verifyCode = verifyCodeGenerator.getVerifyCode();
    model.addAttribute("code","驗證碼是"+code);

    request.getSession().setAttribute("code",code);
//    attr.addFlashAttribute("code",code);
    return "sign_in.html";
}
//匹配輸入的驗證碼和傳送的驗證碼是否一致
    @PostMapping(value = "matchCode")
    public String matchCode(@RequestParam String yourCode,Model model) {
        String code =(String) request.getSession().getAttribute("code");
        System.out.println("code===="+code);
        if (yourCode.equals(code)){
            System.out.println("成功");
           model.addAttribute("result","成功");
        }else {
            System.out.println("失敗");
            model.addAttribute("result","失敗");
        }
        return "test";
    }
}
複製程式碼

執行結果

Jave Web阿里雲簡訊服務傳送驗證碼
Jave Web阿里雲簡訊服務傳送驗證碼

參考文件

個人網站

相關文章