本文以发送短信验证码为例
一、进入阿里云短信服务页面
二、购买短信套餐包
(必须购买,不能用免费赠送的,否则发布出去)
三、在短信服务控制台添加相关信息
资质管理
用途选择“自用”即可
签名管理
签名的格式为中文 + 英文
签名用途选择“自用”即可
资质信息选择审核通过的资质
模板管理
模板类型选择“验证码”
关联签名选择审核通过的签名
四、代码实现
相关maven依赖
<!--阿里云SDK核心库-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
<!--阿里云短信服务SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.2.1</version>
</dependency>
yml文件
# 配置阿里云短信服务的相关参数
alicloud:
sms:
# 阿里云访问密钥ID,用于身份验证
access-key-id:
# 阿里云访问密钥秘密,用于身份验证
access-key-secret:
# 阿里云短信服务所在的地域ID
region-id: cn-hangzhou
# 短信签名名称,发送短信时使用的签名
sign-name: 测试cs
# 短信模板代码,发送短信时使用的模板
template-code: SMS_4**********
SmsCofig
/**
* 存储访问阿里云API所需的凭证和配置信息
* 这些字段共同用于初始化阿里云客户端,以便发送短信验证码
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "alicloud.sms")
public class SmsCofig {
private String accessKeyId; // 阿里云账号的访问密钥ID,用于身份验证
private String accessKeySecret; // 阿里云账号的访问密钥,与accessKeyId配对使用,用于身份验证
private String regionId; // 阿里云短信服务的接入点标识符,标识服务所在的地域
private String signName; // 短信签名,发送短信时使用的签名名称,需在阿里云控制台预先配置
private String templateCode; // 短信模板代码,定义短信内容的模板,需在阿里云控制台预先配置
}
SmsService
@Service
@RequiredArgsConstructor
/**
* 提供短信服务,包括生成验证码和发送短信
*/
public class SmsService {
// 注入短信配置
private final SmsCofig smsCofig;
/**
* 生成6位随机验证码
*
* @return 随机生成的6位数字字符串
*/
public String generateCode() {
return String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
}
/**
* 发送短信验证码到指定电话号码
*
* @param phoneNum 接收短信的电话号码
* @param code 验证码
*/
public void sendSms(String phoneNum, String code) {
// 创建阿里云短信服务客户端配置
DefaultProfile profile = DefaultProfile.getProfile(
smsCofig.getRegionId(),
smsCofig.getAccessKeyId(),
smsCofig.getAccessKeySecret()
);
IAcsClient client = new com.aliyuncs.DefaultAcsClient(profile);
// 构建发送短信的请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", smsCofig.getRegionId());
request.putQueryParameter("PhoneNumbers", phoneNum);
request.putQueryParameter("SignName", smsCofig.getSignName());
request.putQueryParameter("TemplateCode",smsCofig.getTemplateCode());
request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");
// 发送短信并处理响应
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println("短信发送结果:" + response.getData());
} catch (ServerException e) {
// 阿里云服务异常
throw new RuntimeException("阿里云服务异常" + e.getMessage());
} catch (ClientException e) {
// 阿里云客户端异常
throw new RuntimeException("阿里云客户端异常" + e.getMessage());
}
}
}
SmsController
@RestController
@RequiredArgsConstructor
public class SmsController {
private final SmsService smsService;
@GetMapping("/sms")
public ResponseEntity<String> sendSms() {
//作为演示,这里把手机号写死
String phoneNumber = "1111111111";
String code = smsService.generateCode();
try {
smsService.sendSms(phoneNumber, code);
return ResponseEntity.ok("发送成功");
} catch (Exception e) {
return ResponseEntity.badRequest().body("发送失败");
}
}
}
五、相关异常处理
阿里云该账号下找不到对应签名
按图修改即可解决