一、背景介绍
验证码发送背后的功能原理图:
想要在项目中实现上述发送验证码的功能,就需要了解以下步骤。
二、详细步骤
阿里云短信服务
一个短信一般分成成两部分:签名、模板(就是短信的内容)
2.1、申请资质
2.2、申请签名
2.3、申请模板
我们发送的短信内容就是模板,可以自定义模板,所以申请完签名需要申请模板。
2.4、申请accessKey秘钥对
申请完资质、签名、模板,我们就具备了发短信的基本条件,但是如果需要通过程序来调用阿里云发短信的接口,我们还需要准备一个发短信的账号:
用户创建成功之后,需要给其添加权限:
2.5、SDK的使用[!]
通过阿里云提供的SDK来发送短信。
2.5.1、项目中导入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.4</version>
</dependency>
2.5.2、发短信的工具类
package com.hzz.travel.utils;
import cn.hutool.core.util.RandomUtil;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import java.util.Map;
/**
* 发短信的工具类2.0
* @author NewBoy
* @since 2024-7-14
*/
public class SmsUtils {
/**
* accessKeyId和accessKeySecret 从CVS文件中获取
*/
private static String accessKeyId = "你的accessKeyId";
private static String accessKeySecret = "你的accessKeySecret";
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
/**
* 发送短信
* @param telephone 电话号码
* @param signName 签名
* @param templateCode 模板编号
* @param code 验证码
* @return 返回的状态码为OK,则发送成功
*/
public static String send(String telephone, String signName, String templateCode, String code) {
try {
Client client = SmsUtils.createClient(accessKeyId, accessKeySecret);
SendSmsRequest sendSmsRequest = new SendSmsRequest()
.setPhoneNumbers(telephone)
.setSignName(signName) //短信签名
.setTemplateCode(templateCode) //模板编号
.setTemplateParam("{\"code\":\"" + code + "\"}");
//发送短信,获取发送结果
SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
//将结果转成Map对象
Map<String, Object> map = sendSmsResponse.toMap();
System.out.println("[SmsUtils]"+map);
//获取主体部分
Map<String, String> body = (Map<String, String>) map.get("body");
System.out.println("[SmsUtils]"+body);
System.out.println("[SmsUtils]"+body.get("Code"));
return body.get("Code");
} catch (Exception e) {
e.printStackTrace();
}
//失败返回空
return null;
}
/**
* 调用方式
* @param args
*/
public static void main(String[] args) {
String numberCode = RandomUtil.randomNumbers(6);
String code = SmsUtils.send("手机号", "短信签名", "短信模板", "验证码");
System.out.println(code);
}
}