【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)

本文涉及的产品
数字短信套餐包(仅限零售电商行业),100条 12个月
国际/港澳台短信套餐包,全球plus 100条 6个月
短信服务,200条 3个月
简介: 阿里云短信服务提供API/SDK和控制台调用方式,支持验证码、通知、推广等短信类型。需先注册阿里云账号并实名认证,然后在短信服务控制台申请资质、签名和模板,并创建AccessKey。最后通过Maven引入依赖,使用工具类发送短信验证码。

一、阿里云短信服务介绍

短信服务(Short Message Service)是阿里云为广大企业用户或个人用户提供的通信服务。通过API/SDK、控制台调用短信发送能力,将指定信息发送至国内或境外手机号码。可以在不同场景发送不同类型的短信,例如验证码、通知短信、推广短信以及多媒体短信等。

在我们学习第三方服务调用的时候,最好是参考最新的官方文档进行学习使用,阿里云SMS短信服务官方帮助文档:https://help.aliyun.com/zh/sms/


二、服务开通准备工作

注册阿里云账户(注册完成后需要实名认证),注册完账号之后登录阿里云https://www.aliyun.com/

产品搜索短信服务,点击进入短信服务

如果是新用户(未开通过阿里云短信服务),可以免费使用:https://free.aliyun.com/product/cloudcommunication-free-trial

以前开通过短信服务的用户,如果只是个人测试使用,发送的短信不多,可以在个人账户中充1元,因为发送一条短信是¥0.045。

1、申请资质、签名和短信模板

短信服务控制台 中申请资质、测试签名、测试模板。

  1. 在资质管理中申请资质(个人或企业)

  1. 在签名管理中申请签名,适用场景根据自己的需求填写。

短信签名可申请次数请参见下表:

  1. 在模板管理中添加短信模板,根据自己的需求填写即可,这边使用了一个双变量模板。

注意:以上申请都需要审核时间,符合规范可以更快的通过。

2、创建并保存Accesskey

在阿里云网站上的个人中心配置Accesskey,查询AccessKeyld和AccesskeySecret。

点击继续使用AccessKey。

点击创建AccessKey。

注意:通过安全验证后可以看到生成的accessKeyld和accessKeySecret,大家下载csv文件或者复制下来,因为accessKeySecret只显示一次,点击确定后将不再显示!

3、配置访问凭证AK & SK(系统环境变量)

目前最新官方SDK要求将AccessKey ID和AccessKey Secret配置到系统环境变量,才能使用阿里云OSS服务。

去官网申请和配置好AK密钥对后,就可以使用下面的工具类发送阿里云短信啦~

  • 以Windows配置访问凭证为例(其他系统请参考官方文档)

管理员身份打开CMD命令行,执行如下命令,配置系统的环境变量。

set ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyId
set ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret

注意:将上述的ACCESS_KEY_ID 与 ACCESS_KEY_SECRET 的值要替换成自己的。

执行如下命令,让更改生效。

setx ALIBABA_CLOUD_ACCESS_KEY_ID "%ALIBABA_CLOUD_ACCESS_KEY_ID%"
setx ALIBABA_CLOUD_ACCESS_KEY_SECRET "%ALIBABA_CLOUD_ACCESS_KEY_SECRET%"

执行如下命令,验证环境变量是否生效。

echo %ALIBABA_CLOUD_ACCESS_KEY_ID%
echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%

注意:设置完环境变量需要重启IDEA,才能重新读取系统环境变量。


三、调用API发送短信验证码

1、导入Maven依赖坐标

<!-- 阿里云短信SMS -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>3.0.0</version>
</dependency>

2、阿里云短信验证码发送工具类

  • 阿里云短信验证码发送工具类SMSUtils(支持单双参数模板)
/**
 * 阿里云短信验证码发送工具类
 */
public class SMSUtils {
    /**
     * 发送短信(双参数模板)
     * <phoneNumbers>: 接收短信的手机号码,多个用英文逗号隔开
     * <signNameJson>: 短信签名名称,eg: "阿里云"
     * <templateCode>: 短信模板CODE
     * <templateParamJson>: 短信模板变量对应的实际值,eg:{"code":"1234"}
     *
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param code 验证码
     * @param time 验证码有效期(单位:秒)
     */
    public static void sendMessage(String signName, String templateCode, String phoneNumbers, String code, int time) {
        // 初始化请求客户端
        Client client = null;
        try {
            client = SMSUtils.createClient();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 构造请求对象,请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setTemplateParam("{\"code\":\"" + code + "\",\"time\":\"" + time + "\"}");
        // 获取响应对象
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = client.sendSms(sendSmsRequest);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
        //System.out.println(sendSmsResponse.getBody());
    }
    private static Client createClient() throws Exception {
        Config config = new Config()
                // 配置 AccessKey ID,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 配置 AccessKey Secret,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 配置 Endpoint
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }
    /**
     * 发送短信(单参数模板)
     * <phoneNumbers>: 接收短信的手机号码,多个用英文逗号隔开
     * <signNameJson>: 短信签名名称,eg: "阿里云"
     * <templateCode>: 短信模板CODE
     * <templateParamJson>: 短信模板变量对应的实际值,eg:{"code":"1234"}
     *
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param code 验证码
     */
    public static void sendMessage(String signName, String templateCode, String phoneNumbers, String code) {
        // 初始化请求客户端
        Client client = null;
        try {
            client = SMSUtils.createClient();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 构造请求对象,请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setTemplateParam("{\"code\":\"" + code + "\"}");
        // 获取响应对象
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = client.sendSms(sendSmsRequest);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
    }
}

3、调用工具类发送短信

  • 下面给出一个发送验证码的示例
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 发送手机验证码并保存验证码到Session
     */
    @PostMapping("/code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        // 校验手机号格式是否有效
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 格式不符合,返回错误信息
            return Result.fail("手机号格式错误!");
        }
        // 格式有效,生成验证码
        String code = RandomUtil.randomNumbers(6);  // 随机6位数字
        // 保存验证码到session
        session.setAttribute(phone, code);
        // 发送验证码,有效期LOGIN_CODE_TTL分钟
        SMSUtils.sendMessage("签名signName", "SMS_474225xxx", phone, code, LOGIN_CODE_TTL);
        // 模拟发送短信验证码
        log.debug("向{}发送短信验证码成功,验证码:{}", phone, code);
        // 返回ok
        return Result.ok();
    }
}
  • 也可以直接在main()方法中调用SMSUtils.sendMessage()测试发送。
public static void main(String[] args) {
    sendMessage("XXX网站签名", "SMS_474225xxx", "13900010001", "6666", 5);
}

相关文章
|
1月前
|
API
阿里云短信服务文档与实际API不符
阿里云短信服务文档与实际API不符
|
2月前
|
数据采集 监控 安全
阿里云短信服务+图形认证,有效降低验证码盗刷概率
阿里云短信服务+图形认证服务,有效降低验证码盗刷概率。
243 3
阿里云短信服务+图形认证,有效降低验证码盗刷概率
|
1月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
1月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
1月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
287 6
|
4月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
361 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
317 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
168 2
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka Streams的集成
Spring Boot与Apache Kafka Streams的集成