本人刚做java不久,入职一家小微企业,让我写个短信验证码的API,然后网上搜了搜,好多案例都很复杂,其实没那么麻烦,我后来用的官方文档的Demo写的。
访问密钥AccessKey(AK)相当于登录密码,只是使用场景不同。AccessKey用于程序方式调用短信服务API,而登录密码用于登录控制台。
AccessKey包括AccessKeyId和AccessKeySecret。官方创建AccessKe的链接
AccessKeyId用于标识用户。
AccessKeySecret是用来验证用户的密钥。AccessKeySecret必须保密
(AccessKeyId和AccessKeySecret,如果公司已经申请好了就直接拿来用,在下面的工具类中写死即可)
发送短信的工具类:
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
/**
* 发送短信的工具类
*/
public class SMSUtils {
/**
* 发送短信
* @param templateCode 短信模板code(已注册通过审核的code)
* @param phoneNumbers 前端传来的手机号
* @param param 模板变量值(这里就是随机生成的验证码)
* @throws ClientException
*/
public static void sendShortMessage(String templateCode,String phoneNumbers,String param) throws ClientException{
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AccessKeyId的值", "AccessKeySecret的值");
IAcsClient client = new DefaultAcsClient(profile);
// 创建API请求并设置参数
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendBatchSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumberJson", "[\""+phoneNumbers+"\"]");
//短信签名 必须是已添加并通过审核的短信签名(去找自己组的技术老大要)
request.putQueryParameter("SignNameJson", "[\"飞象物流\"]");
//短信模板CODE(去找自己组的技术老大要)
request.putQueryParameter("TemplateCode", templateCode);
//短信模板变量(验证码)
request.putQueryParameter("TemplateParamJson", "[{\"code\":\""+param+"\"}]");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println("输出的是:"+response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
控制层:
import com.aliyuncs.exceptions.ClientException;
@RestController
@RequestMapping("/api/auth")
public class AuthenticationController {
/**
* 发送短信验证码
* @param phone 前端传来的用户手机号
* @return
* @throws ClientException
*/
@PostMapping("/sendCode")
public String sendCode(@RequestParam String phone) throws ClientException {
if(phone.length() == 11){
//别人的一个得到6位数验证码的工具类,你们可以自己写个随机数
String code = CodeUtil.generateVerifyCode(6);
//发送短信的方法;SMS_181300443是我当时项目的短信模板CODE你们写自己的
SMSUtils.sendShortMessage("SMS_181300443",phone,code);
/*
这里可以处理验证码 比如讲验证码放入到Redis中
*/
return "短信发送成功";
}
return "手机号不正确";
}
}
生成随机数工具类:
package io.sage.utils;
import java.util.Random;
/**
* @Description: 生成6位的随机数工具类
* @Author: liu
* @Date: 2019/12/30/19:45
*/
public class CodeUtil {
//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
public static final String VERIFY_CODES = "1234567890";
/**
* 使用系统默认字符源生成验证码
* @param verifySize 验证码长度
* @return
*/
public static String generateVerifyCode(int verifySize){
return generateVerifyCode(verifySize, VERIFY_CODES);
}
/**
* 使用指定源生成验证码
* @param verifySize 验证码长度
* @param sources 验证码字符源
* @return
*/
public static String generateVerifyCode(int verifySize, String sources){
if(sources == null || sources.length() == 0){
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for(int i = 0; i < verifySize; i++){
verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));
}
return verifyCode.toString();
}
}
pom.xml引入:
<!-- 短信包-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
新人首发,欢迎各位指点!!!哈哈