SpringBoot接入阿里云短信服务,实现登录验证功能

为了丰富博客功能,周末闲来无事做了个登录,目前已完成手机登录、github登录。

今天这篇文章先来整理下在springboot中接入阿里云短信服务的一个具体流程。

还请多多关注我的公众号:前端进阶攻城狮 每周固定更新技术分享

或者来到我的博客进行留言 Cc技术人生

获取AccessKey信息

首先让我们登录阿里云官网,然后在右上角进入AccessKey管理

AccessKey相当于一个身份验证,调用所有阿里云提供的服务时根据这个来进行一个收费。

这里根据实际创建自己的id与secret

签名与模板

接下来通过控制台进入短信服务

如果你和我一样真实项目中需要,这里请添加你的签名和模板

签名的名称还请严谨,最好是网站的备案名,否则你会像我一样被拒绝很多次

在签名审核成功后来添加你的模板,当然这也是需要人工审核的

如果你觉得以上审核流程太过于麻烦,也可以使用提供测试的签名与模板

来到这个页面添加你的测试手机号,选择专用签名/模板,这里是不要审核的

好了,做到这里你现在一共有四样信息在手上了

accessKeyId accessKeySecret signName templateCode

现在可以开始写代码了

进入你的Springboot

首先我们把刚才拿到的几样信息写在配置文件里

yml 复制代码
message:
  accessKeyId: LTAxxxxxxxxxxxxxxxxx2Ej
  accessKeySecret: GuyxxxxxxxxxxxxxxxxxxxXG
  signName: xxxx博客
  templateCode: SMS_xxxxxxxx

根据实际换成自己的

引入jar包

pom 复制代码
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>2.0.1</version>
</dependency>

编写发送短信工具函数

java 复制代码
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import lombok.Data;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Data
@Component
@ConfigurationProperties(prefix = "message")
public class SendCode {
    private String accessKeyId;
  
    private String accessKeySecret;

    private String signName;

    private String templateCode;



    @SneakyThrows
    public Client createClient(String accessKeyId, String accessKeySecret){
        Config config = new Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }


    /**
     * 发送短信
     *
     * @param phoneNumber 手机号
     * @return 返回结果
     */
    @SneakyThrows
    public SendSmsResponseBody sendMessage(String phoneNumber) {

        Client client = createClient(accessKeyId, accessKeySecret);
        String code = RandomUtil.buildCheckCode(4);
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setPhoneNumbers(phoneNumber)
                .setTemplateParam("{\"code\":\""+code+"\"}");
        RuntimeOptions runtime = new RuntimeOptions();
        // 复制代码运行请自行打印 API 的返回值
        SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, runtime);

        SendSmsResponseBody body = response.getBody();
//        return body;
        if(body.getCode().equals("OK")){
            return body;
        }else {
           throw new RuntimeException(body.getMessage());
        }
    }
}

编写生成随机数字的工具函数

java 复制代码
import java.util.Random;

public class RandomUtil {
    /**
     * 生成验证码
     * @param digit 位数
     * @return
     */
    public static String buildCheckCode(int digit){
        String str = "0123456789";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < digit; i++) {
            char ch = str.charAt(random.nextInt(str.length()));
            sb.append(ch);
        }
        return sb.toString();
    }
}

最后我们来测试一下

也是成功收到了测试短信。

总结

整体流程还是比较简单的,比较耽误时间的可能就是签名与模板的审核,大家可以提前去申请准备好以备不时之需。

如有不足之处还请评价留言交流,谢谢大家!

相关推荐
花间相见1 分钟前
【后端开发|网络编程】—— 五种实时通信方案全解析:短轮询、长轮询、SSE、MQTT、WebSocket
后端·网络协议
坤岭2 分钟前
LLM应用安全护栏实战
后端
程序猿阿越5 分钟前
containerd如何创建Pod
后端·kubernetes·源码阅读
名字还没想好☜7 分钟前
Python sqlite3 实战:事务提交、参数化防注入、WAL 并发与 row_factory 取字典
后端·python·编程语言
志尊宝8 分钟前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
花间相见9 分钟前
【AI应用开发|Agent记忆】—— Codex 与 Claude Code 持久化记忆对比:两条不用向量库的路线
后端·agent
葡萄城技术团队9 分钟前
GcExcel V9.2 新特性揭秘:公式对象的无损往返
后端
蜗牛互联网23 分钟前
Claude放宽生命科学限制:代价是验证、分级和30天留存
java·人工智能·后端
上进小菜猪27 分钟前
被 32 位整数卡了 30 年脖子:PostgreSQL 事务号困局与 V9 的 64 位解法
后端
aixingpan44 分钟前
aixingpan.cn API开发文档:api_docs_bichart_natalvssolar_return2接口指南
前端·php