首先得在阿里雲根據流程開通簡訊服務,申請簽名和模版,具體看文件
因為這是個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";
}
}
複製程式碼