阿里云短信服务官方指导教程:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.n6Pa55
步骤:
1、注册阿里云账号通过实名认证
2、开通短信服务(开通免费)
开通后可在控制台短信服务栏中查看
3、创建Access Key,获取Access Key ID 和 Access Key Secret(具体看阿里云官方教程)
Access Key用于在程序中调用阿里云的服务API,个人理解相当于账号密码,用于认证个人信息的(程序中会用到)。可以创建多个Access Key,但Access Key具体内容只能在创建初期查看,之后是无法查看的,因此需要及时下载到本地。
4、创建短信签名和短信模板
短信签名一般用于标记公司名或者是具体的业务,它会以下的形式出现在短信中:
[短信签名] 短信内容....
短信模板描述了短信的具体内容,可以提供变量来替代具体的数据,程序中会以JSON的形式向短信模板提供变量。
注意:短信签名和短信模板创建后都需要通过审核,审核一般在几个小时内就能完成。
短信模板中的"模板CODE"在程序中会被使用到,通过模板CODE来明确使用哪一个模板。
5、Maven项目中引入阿里云短信服务依赖
pom.xml
<!--短信sdk start-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<!--短信sdk end-->
smsUtil
/**
* 阿里云短信工具类
*/
public class SmsUtils {
// 产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
// 产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
static final String accessKeyId = "**********"; // TODO 改这里
static final String accessKeySecret = "**************"; // TODO 改这里
public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(telephone);
// 必填:短信签名-可在短信控制台中找到
request.setSignName("**"); // TODO 改这里
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode("*****"); // TODO 改这里
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"code\":\"" + code + "\"}");
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.setOutId("yourOutId");
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
System.out.println("短信发送成功!");
}else {
System.out.println("短信发送失败!");
}
return sendSmsResponse;
}
}
sendCode
@Component
public class SendCode {
@Resource(name = "redisDaoImpl")
private RedisDao redisDaoImpl;
private static SendCode sendCode;
@PostConstruct
public void init() {
sendCode = this;
sendCode.redisDaoImpl = this.redisDaoImpl;
}
/**
*发送验证码
*@param keyPre 生成验证码存入redis 的key前缀 ,PHONE 生成redis 的key后缀 , des 操作的描述信息(如登录,注册)
*
*/
public static ResBean sendCode(String keyPre,String PHONE,String des) throws ClientException {
ResBean resultBean = new ResBean();
//3.发送验证码步骤,(1)先判断是否已经发送过验证码,发送过一分钟不能重复发送,过了一分钟后才发送(2)如果没有发送过验证码,则发送验证码
int random = Tools.getRandomNum();//生成6为随机验证码
String code = Integer.toString(random);//将验证码转成字符串
long curtime = System.currentTimeMillis(); //获取当前时间戳,用于下面比较获取时间是否在一分钟内
String lastSmsTime_Code = Long.toString(curtime)+"_"+code; //将当前时间和验证码拼接成字符串,保存到redis的key中
String curkey = keyPre+PHONE;//生成redis的key:keyPre+PHONE(用户名)
//先判断redis的key为"keyPre_"+USERNAME(用户名)是否存在
if(sendCode.redisDaoImpl.hasKey(curkey)){
//取出上次发送验证码的时间戳
long lastSmsTime = Long.parseLong(sendCode.redisDaoImpl.get(curkey).substring(0,sendCode.redisDaoImpl.get(curkey).length()-7));
//当前时间与上次发送验证码的时间戳之差
long differSecond = (curtime- lastSmsTime)/1000;
//判断时间差小于60,则不能发送
if(differSecond<60){
//一分钟之内不能重复发送
resultBean.setCode(1020);
resultBean.setMsg("请于1分钟后发送");
resultBean.setData(60-differSecond);//返回倒计时秒数
}else{
//获取验证码成功
resultBean.setCode(1);
resultBean.setMsg("验证码已发送,请注意查收!");
//resultBean.setData(code);
//String content = "【聚盟】您"+des+"的验证码是:"+code;
//SMSUtils.sendSms(PHONE,content);
SmsUtils.sendSms(PHONE,code);
sendCode.redisDaoImpl.eidt(curkey,lastSmsTime_Code);
sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
}
}else{
//获取验证码成功
resultBean.setCode(1);
resultBean.setMsg("验证码已发送,请注意查收!");
//resultBean.setData(code);
//String content = "【易生健康】您"+des+"的验证码是:"+code;
//SMSUtils.sendSms(PHONE,content);
SmsUtils.sendSms(PHONE,code);
sendCode.redisDaoImpl.addString(curkey,lastSmsTime_Code);
sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
}
return resultBean;
}
public static boolean identifyingCode(String key,String vCode){
//判断key值存在,进入下一步,比较验证码是否存在
if(sendCode.redisDaoImpl.hasKey(key)){
//取出redis存的验证码(生成规则,查看登录发送验证码接口)
String code =sendCode.redisDaoImpl.get(key).substring(sendCode.redisDaoImpl.get(key).length()-6);
//判断前台传来的验证码与redis 的是否一致,一致返回信息,不一致返回请输入正确的验证码
if(code.equals(vCode)){
return true;
}else{
return false;
}
}
else {
return false;
}
}
}