springboot项目实现发送短信验证码接口

前期准备工作:

阿里云:

1)阿里云账户创建子用户,并给予相关权限:

2)创建AccessKey,我这里是因为一个子用户已经创建了两个AccessKey了,所以不能再在这个子用户下创建AccessKey了:

3)进入短信服务:

如果找不到,可以在控制台的搜索框内搜索

依次进行这三步,申请签名和模板

签名和模板申请审核通过后,购买套餐服务517通信节限时特惠 (aliyun.com):我这里开始的时候因为是测试,短信发送频率不是很高,所以购买了最低套餐的服务,3个月200条短信

购买后可以就在阿里云里面测试是否可以正常使用短信服务

后端代码:

1)安装Redis并启用(具体步骤已发布至其它文章)

2)创建springboot项目,pom.xml文件里安装相关依赖,版本号根据项目实际情况而定(注意:每次添加新依赖都需要刷新

然后刷新依赖

3)yml配置文件里配置访问端口,连接Redis(有密码填写密码,无则可不填)

4)进入阿里云的短信服务SDK示例,创建一个实现短信发送的类,复制SDK示例代码,更改相关参数(AccessKeyId,AccessKeySecret,phoneNumbers,SigneName,templateCode,templateParam)

SMStool.java代码:

// This file is auto-generated, don't edit it. Thanks.
package com.app.phonecaptcha.tool;

import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.*;

public class SMStool {

    /**
     * 使用AK&SK初始化账号Client
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
                .setAccessKeyId("LTAI5tSceHBM68CcNembTUe2")
                .setAccessKeySecret("n4Z2T6FmpK11ArRr5K2AuXZsW8kjbF");
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    public static void sendMessage(String phoneNumbers, String param) throws Exception {
//        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.dysmsapi20170525.Client client = SMStool.createClient();
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName("荆南别院")
                .setTemplateCode("SMS_465891419")
                .setTemplateParam("{\"code\":\"" + param + "\"}");
        try {
            // 复制代码运行请自行打印 API 的返回值
//            client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
            SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
            if ("OK".equals(response.getBody().getCode())) { // 假设"OK"表示成功
                System.out.println("短信发送成功!验证码为:" + param);
            } else {
                System.out.println("短信发送失败!");
            }
//            System.out.println("测试短信发送" + response.getBody());
        } 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);
        }
    }
}

5)创建一个controller的java类,用于处理http的请求,与前端进行通信

CaptchaController.java代码:

//用于处理http发送的请求,与前端进行通信
package com.app.phonecaptcha.controller;

import com.app.phonecaptcha.tool.SMStool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Random;
import java.util.concurrent.TimeUnit;
@RestController
@CrossOrigin("http://localhost:63342")
public class CaptchaController {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @GetMapping("/getCode")
    @ResponseBody
//    接收一个名为“targetPhone”的参数
    public String phone(@RequestParam("targetPhone") String targetPhone) {
        // 验证码的Redis键
        String codeKey = "captcha:" + targetPhone;
        // 从Redis中获取验证码,检查是否已经发送过验证码
        String code = (String) redisTemplate.opsForValue().get(codeKey);
//        如果相关键的Redis值为空,即验证码为空
        if (code == null){
            // 随机生成六位数的验证码
            int authNum = new Random().nextInt(899999) + 100000;
            String authCode = String.valueOf(authNum);
            try {
                // 发送验证码
                SMStool.sendMessage(targetPhone, authCode);
                // 将验证码存入Redis,并设置有效期
                redisTemplate.opsForValue().set(codeKey, authCode, 1, TimeUnit.MINUTES);
                return "验证码生成成功"+authCode;
            } catch (Exception e) {
                // 处理异常,例如打印堆栈跟踪或进行其他错误处理
                e.printStackTrace();
                return String.valueOf(new ResponseEntity<>("发送验证码失败", HttpStatus.INTERNAL_SERVER_ERROR));
            }
        }
        // 如果验证码已存在,返回提示信息
        return String.valueOf(new ResponseEntity<>("请勿重复发送验证码", HttpStatus.BAD_REQUEST));
    }
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值