一、短信发送
1.阿里云短信服务介绍:
在项目中,如果要实现短信发送功能,我们无需自己实现,也无需和运营商直接对接,只需要调用 第三方提供的短信服务即可。目前市面上有很多第三方提供的短信服务,这些第三方短信服务会和各个 运营商(移动、联通、电信)对接,我们只需要按照提供的开发文档进行调用就可 以发送短信。这些短信服务一般都是收费服务。
2.如何使用阿里云短信服务
- 需要先注册一个阿里云的账号
- 登陆后进入控制台,然后搜索短信服务,进入短信服务控制台,开通短信服务
- 进入短信服务管理界面,选择国内消息菜单
- 首先要添加一个资质认证,一般在1个小时左右就可以通过
- 资质认证后,需要申请短信签名,并添加,短信签名是短信发送者的署名,可以表示发送者的身份。
- 然后设置短信模板,在阿里云短信服务中也提供了很多的短信模板可以使用
3.设置AccessKey
AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限, 我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。 我们点击右上角的用户头像,选择"AccessKey管理",这时就可以进入到AccessKey的管理界面。
进入到AccessKey的管理界面之后, 提示两个选项 "继续使用AccessKey" 和 "开始使用子用户AccessKey",两个区别如下:
1.继续使用AccessKey 创建的是阿里云账号的AccessKey,是具有账户的完全权限,可以通过API调用阿里云的服务, 不仅是短信服务,其他服务(OSS,语音服务,内容安全服务,视频点播服务...等)也可以调用。 一旦AccessKey泄露,不太安全
2.开始使用子用户AccessKey 可以创建一个子用户,这个子用户我们可以分配比较低的权限,比如仅分配短信发送的权限, 不具备操作其他的服务的权限,即使这个AccessKey泄漏了,也不会影响其他的云服务, 相对安全。
在这里建议使用子用户Accesskey
如果在使用的过程中 AccessKey 不小心泄漏了,我们可以在阿里云控制台中, 禁用或者删除该AccessKey。 然后再创建一个新的AccessKey, 保存好AccessKeyId和AccessKeySecret(这里一定要保存好AccessKeyId和AccessKeySecret,如果删除该AccessKeyId,也需要AccessKeySecret进行验证)
二、代码开发
1.使用阿里云短信服务发送短信,可以参照官方提供的文档(官方文档:短信服务(SMS)-阿里云帮助中心 (aliyun.com))
2.根据官方文档的提示,引入相关依赖,然后再引入对应的java代码,就可以实现相应功能了。
三、代码
1.引入pom依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
2.将官方提供的main方法封装为一个工具类
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
/**
* 短信发送工具类
*/
public class SMSUtils {
/**
* 发送短信
* @param signName 签名
* @param templateCode 模板
* @param phoneNumbers 手机号
* @param param 参数
*/
public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
//注意将<accessId>和<accessKey secret>换成你自己的
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","<accessId>", "<accessKey secret>");
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setSysRegionId("cn-hangzhou");
request.setPhoneNumbers(phoneNumbers);
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setTemplateParam("{"code":""+param+""}");
try {
SendSmsResponse response = client.getAcsResponse(request);
System.out.println("短信发送成功");
}catch (ClientException e) {
e.printStackTrace();
}
}
}
3.验证码生成
/**
* 随机生成验证码工具类
*/
public class ValidateCodeUtils {
/**
* 随机生成验证码
* @param length 长度为4位或者6位
* @return
*/
public static Integer generateValidateCode(int length){
Integer code =null;
if(length == 4){
code = new Random().nextInt(9999);//生成随机数,最大为9999
if(code < 1000){
code = code + 1000;//保证随机数为4位数字
}
}else if(length == 6){
code = new Random().nextInt(999999);//生成随机数,最大为999999
if(code < 100000){
code = code + 100000;//保证随机数为6位数字
}
}else{
throw new RuntimeException("只能生成4位或6位数字验证码");
}
return code;
}
/**
* 随机生成指定长度字符串验证码
* @param length 长度
* @return
*/
public static String generateValidateCode4String(int length){
Random rdm = new Random();
String hash1 = Integer.toHexString(rdm.nextInt());
String capstr = hash1.substring(0, length);
return capstr;
}
}
四、简单示例,在一个类中实现
1.引入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.49</version>
</dependency>
<dependency>
package com.example.demomessage;
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;
import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Random;
@SpringBootTest
class DemoMessageApplicationTests {
//把这里的ACCESS_KEY_ID和ACCESS_KEY_SECRET 换成你自己的
private static final String REGION_ID = "cn-hangzhou";
private static final String ACCESS_KEY_ID = "<ACCESS_KEY_ID>";
private static final String ACCESS_KEY_SECRET = "<ACCESS_KEY_SECRET>";
private IAcsClient createClient() {
DefaultProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
return new DefaultAcsClient(profile);
}
// 生成随机验证码的方法
private String generateVerificationCode() {
Random random = new Random();
int code = 100000 + random.nextInt(900000); // 生成六位数验证码
return String.valueOf(code);
}
private void sendSms(String phoneNumber, String signName, String templateCode, HashMap<String, Object> templateParam) {
IAcsClient client = createClient();
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.putQueryParameter("PhoneNumbers", phoneNumber);
request.putQueryParameter("SignName", signName);
request.putQueryParameter("TemplateCode", templateCode);
// 生成随机验证码并放入模板参数
String verificationCode = generateVerificationCode();
templateParam.put("code", verificationCode);
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(templateParam));
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
System.err.println("Server Exception: " + e.getMessage());
} catch (ClientException e) {
e.printStackTrace();
System.err.println("Client Exception: " + e.getMessage());
}
}
@Test
void contextLoads() {
HashMap<String, Object> map = new HashMap<>();
// 调用sendSms方法发送带有随机验证码的短信
sendSms("你的电话", "签名", "模板code(SMS开头的)", map);
}
}