SpringBoot集成阿里云短信实现发送短信验证码
- 一、准备工作
- 1、注册账号
- 2、申请资质
- 3、申请签名
- 4、创建模板
- 二、springboot集成发送短信
- 1、引入依赖
- 2、编写短信配置文件
- 3、编写短信发送工具类
一、准备工作
在使用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: # 填你的accesskeyidaccessKeySecret: # 填 accesskeySecretsignName: # 填写签名名称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/Dysmsapiconfig.endpoint = "dysmsapi.aliyuncs.com";return new com.aliyun.dysmsapi20170525.Client(config);}@Overridepublic 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.htmlcom.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) {// 错误 messageSystem.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);// 错误 messageSystem.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中的几位作为验证码)。