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();
    }
}

最后我们来测试一下

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

总结

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

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

相关推荐
袁煦丞19 分钟前
【局域网秒传神器】LocalSend:cpolar内网穿透实验室第418个成功挑战
前端·程序员·远程工作
江城开朗的豌豆20 分钟前
Vuex数据突然消失?六招教你轻松找回来!
前端·javascript·vue.js
喷火龙8号26 分钟前
MSC中的Model层:数据模型与数据访问层设计
后端·架构
好奇心笔记30 分钟前
ai写代码随机拉大的,所以我准备给AI出一个设计规范
前端·javascript
5ycode30 分钟前
dify项目结构说明与win11本地部署
后端·开源
江城开朗的豌豆30 分钟前
Vue状态管理进阶:数据到底是怎么"跑"的?
前端·javascript·vue.js
用户214118326360231 分钟前
dify案例分享-Dify v1.6.0 重磅升级:双向 MCP 协议引爆 AI 生态互联革命
前端
程序员海军32 分钟前
AI领域又新增协议: AG-UI
前端·openai·agent
我想说一句34 分钟前
React待办事项开发记:Hook魔法与组件间的悄悄话
前端·javascript·前端框架
真夜35 分钟前
CommonJS与ESM
前端·javascript