1.首先在容联云平台注册一个账号,默认开通了短信,免费金额是8块,每条大概是0.06,一天上限是0.5
2.在平台绑定测试的手机号
3.获取平台这三个参数值ACCOUNT_SID、ACCOUNT_TOKEN、ACCOUNT_APPID
4.接着引入maven
<dependency>
<groupId>com.cloopen</groupId>
<artifactId>java-sms-sdk</artifactId>
<version>1.0.1</version>
</dependency>
5.工具类代码如下:
import com.cloopen.rest.sdk.BodyType;
import com.cloopen.rest.sdk.CCPRestSmsSDK;
import java.util.HashMap;
import java.util.Set;
public class SMS {
//主账号,登陆云通讯网站后,可在控制台首页看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKEN
public static final String ACCOUNT_SID = "";
public static final String ACCOUNT_TOKEN = "";
public static final String ACCOUNT_APPID = "";
public static void send(String code){
//生产环境请求地址:app.cloopen.com
String serverIp = "app.cloopen.com";
//请求端口
String serverPort = "8883";
//请使用管理控制台中已创建应用的APPID
//String appId = "appId";
CCPRestSmsSDK sdk = new CCPRestSmsSDK();
sdk.init(serverIp, serverPort);
sdk.setAccount(ACCOUNT_SID, ACCOUNT_TOKEN);
sdk.setAppId(ACCOUNT_APPID);
sdk.setBodyType(BodyType.Type_JSON);
String to = "159******"; //绑定的测试手机号
String templateId= "1"; //短信模板
String[] datas = {code,"2"}; //分钟参数
HashMap<String, Object> result = sdk.sendTemplateSMS(to,templateId,datas);
if("000000".equals(result.get("statusCode"))){
//正常返回输出data包体信息(map)
HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");
Set<String> keySet = data.keySet();
for(String key:keySet){
Object object = data.get(key);
System.out.println(key +" = "+object);
}
}else{
//异常返回输出错误码和错误信息
System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
}
}
public static void main(String[] args) {
//测试
String code = "123456";
send(code);
}
}
6.验证码工具类
public static String generate6BitDigital() {
return ("" + (Math.random() + 0.1) * 1000000).substring(0, 6);
}
7.redis工具类
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- <version>2.0.4.RELEASE</version>-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
8.代码中的实际应用
public Message sentCode(@RequestParam String phone) {
String code = CodeUtil.generate6BitDigital();
redisUtil.set(phone, code, 120);
System.out.println(code);
SMS.send(code);
return Message.success().extend("code",code);
}
9.判断短信是否过期
if (redisUtil.getExpire(phone) == -1){
return Message.fail().extend("reason","验证码已过期");
}