SpringBoot集成阿里云短信实现发送短信验证码
一、准备工作
在使用springboot集成短信服务之前,需要先注册阿里云的账号(实名认证),然后申请短信资质、签名以及短信模板。
1、注册账号
点击阿里云注册账号,如下所示
两种注册方式任选即可,注册后需要实名认证(可以通过支付宝扫码认证),这里省略实名认证的过程。
实名认证之后,直接在搜索框搜索短信服务即可,然后申请资质和签名以及模板
2、申请资质
- 点击新增资质
- 填写信息
用途根据自己需要选择,我这里是自用,然后输入资质命名,并按照要求上传身份证照片。
申请签名的时候需要用到资质。
3、申请签名
点击新建签名,然后根据下图填写信息
4、创建模板
点击创建模板,然后根据下面的信息填写,也可以去网上查找相应的模板
之后等待申请通过即可。等申请通过后就可以购买短信,然后通过调用api进行发送短信。一般新用户可以试用100条短信
二、springboot集成发送短信
1、引入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
2、编写短信配置文件
# 阿里云短信服务配置
aliyun:
sms:
accessKeyId: # 填你的accesskeyid
accessKeySecret: # 填 accesskeySecret
signName: # 填写签名名称
templateCode: # 填写模板的code
这里需要先在阿里云控制台获取上面的四项配置,如下所示:
- 获取accessKeyId和accessKeySecret,如下所示,点击Accesskey管理
- 如下所示,如果想要使用子用户的话,需要创建一个子用户,跟着操作和提示创建即可。也可以选择继续使用accesskey,最终获取的方式差不多。
- 我这里没有创建子用户,直接使用的accesskey,如下所示,直接点击创建accesskey,然后任选一种验证方式即可
- 然后将创建的accessKeyId,accessKeySecret分别粘贴到对应的配置文件的位置中即可。
- 然后复制签名的名称,粘贴到配置文件中的相应位置如下所示:
- 然后点击模板管理,粘贴你对应的模板的code即可,如下所示
这里配置文件的配置就结束了。
3、编写短信发送工具类
然后编写发短信的工具类,如下所示:
@Service
@slf4j
public class AliSmsUtils{
@Value("${aliyun.sms.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.sms.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.sms.signName}")
private String signName;
//模板代码
@Value("${aliyuan.sms.templateCode}")
private String templateCode;
private String templateParam;
/**
* 使用AK&SK初始化账号Client
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
@Override
public boolean sendSms(String phone, String code) throws Exception {
log.info("发送短信验证码: " + code);
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
com.aliyun.dysmsapi20170525.Client client = SmsServiceImpl.createClient(accessKeyId, accessKeySecret);
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phone)
.setTemplateCode(templateCode)
.setTemplateParam(code)
.setSignName(signName);
try {
// 复制代码运行请自行打印 API 的返回值
client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return true;
}
}
说明:
- 上面的的代码是我直接在Service中以方法的方式实现的,所以可以根据自己需要进行修改
- 而且上面的方式是根据官网的demo进行修改的,想要进一步了解如何使用则可以在官网查看。
- 上面的是直接通过@Value注解获取配置文件中的内容,你也可以通过@ConfigurationProperties注解实现,或者结合nacos配置中心实现获取远程配置中的值。
调用上面的方法需要两个参数,一个是手机号,一个是验证码,所以对于该业务需要注意手机号的格式验证(使用正则表达式),和随机验证码的生成(可以使用hutool中的随机数生成,也可以采用获取UUID中的几位作为验证码)。