花瓣小跑 发表于 2024-9-25 08:42:39

短信验证码的实现(阿里云)

前言

背景:如今在许多项目中都出现使用短信验证码来实现注册、登录、购买、付出、转账等功能,发短信功能几乎已经成为项目中不可或缺的技能之一。
一、短信验证码的基本步骤


[*]选择一个合适的编程语言,例如Python、Java或PHP等。
[*]探求可以或许发送短信的API,例如Twilio、阿里云短信等。
[*]注册并获取API的账号和认证信息(如API密钥或令牌)。
[*]根据API文档中所述,构建发送短信验证码的哀求。通常需要设置接收者手机的手机号码和短信内容等参数。
[*]调用API发送哀求,并解析API返回的相应结果,以检查短信是否发送乐成。
写代码时需要特别留意短信验证码的安全性,例如防止短信轰炸、重复发送或被恶意使用等问题。
二、阿里云短信验证

   1.注册阿里云账号
https://i-blog.csdnimg.cn/blog_migrate/a58d24ba53284604f4d5793879e724e0.png
   2.点击右上角的控制台后,搜索短信服务
https://i-blog.csdnimg.cn/blog_migrate/78e056f328d999d347bd5d5937f9c884.png
   3.申请签名
https://i-blog.csdnimg.cn/blog_migrate/93a66075b51dbf0234b3a18bfd702953.png
添加签名:
https://i-blog.csdnimg.cn/blog_migrate/ebe69054c0058f05766f98147f9d7d79.png
   4.申请模板
短信模板包含短信发送内容、场景、变量信息
https://i-blog.csdnimg.cn/blog_migrate/ddcb36fee0cd7bc8bb15ae0782fee1b6.png
添加模板:
https://i-blog.csdnimg.cn/blog_migrate/f05190a26e25ac15a9f1ab4b546ec9db.png
申请后的模板详情:
https://i-blog.csdnimg.cn/blog_migrate/c46b89e4e09b35d9e07cf05bff2dc666.png
申请签名和申请模板都需要人工审核的,一样寻常1到2个工作日,其实照旧挺快的。
   5.设置AccessKey
相当于用户名的密码(自己记住和使用)
将鼠标移到右上角的头像,就会弹出以下对话框:
https://i-blog.csdnimg.cn/blog_migrate/3134edf6c8a52b5648cc88e48478c480.png
妥善保管好自己的AccessKey的密码,一旦泄漏出去,别人使用你的短信验证,耗费自己的费用。
https://i-blog.csdnimg.cn/blog_migrate/f02d58ddd771d36487b78002460fbeef.png
创建自己的用户
https://i-blog.csdnimg.cn/blog_migrate/cab321c522161a2f5fa6cdffa6872d48.png
勾选openApI调用,相当于使用编程访问
创建好后,体现AccessKeyID和AccessKey Secrect,将密码生存到自己找的到的地方,方便后续使用。
官方提示:若开通 OpenAPI 调用访问,请实时生存 AccessKey 信息,页面关闭后将无法再次获取信息。
https://i-blog.csdnimg.cn/blog_migrate/3017f57b3a6fb6b6f3602d2a78ab5213.png
设置权限:
https://i-blog.csdnimg.cn/blog_migrate/c272a4c43713a3f8d27c8ccd41cac171.png
点击新增授权
https://i-blog.csdnimg.cn/blog_migrate/328431b69ccaa974f6a55a06670bdd36.png
这两个权限是如果你的AccessKey泄漏出去了,别人也只能调用你短信验证的功能,不能使用其他的功能。
如果你不使用了,或者泄漏出去了,你也可以把AccessKey禁用或者删除。
三、导入依赖坐标

<dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.6.3</version>
</dependency>
<dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
        <version>2.2.1</version>
</dependency>
四、调用API

可以在文档资助中央找相应语言的SDK,可以将代码改造一下,通过Api就可以调用短信验证服务了。
https://i-blog.csdnimg.cn/blog_migrate/9f6a305f76549f4fb1b871516e14be8f.png
/**
* 短信发送工具类
*/
public class SMSUtils {

        /**
       * 发送短信
       * @param signName 签名
       * @param templateCode 模板
       * @param phoneNumbers 手机号
       * @param param 参数
       */
public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
        //getProfile(地域编码,AccessKeyId,AccessKeySecret)
        IAcsClient client = new DefaultAcsClient(profile);

        SendSmsRequest request = new SendSmsRequest();
        request.setSysRegionId("cn-hangzhou");//设置地域编码
        request.setPhoneNumbers(phoneNumbers);
        request.setSignName(signName);
        request.setTemplateCode(templateCode);
        request.setTemplateParam("{\"code\":\""+param+"\"}");
        try {
       SendSmsResponse response = client.getAcsResponse(request);
       System.out.println("短信发送成功");
        }catch (ClientException e) {
                e.printStackTrace();
           }
        }
}
五、随机生成验证码工具类

/**
* 随机生成验证码工具类
*/
public class ValidateCodeUtils {
    /**
   * 随机生成验证码
   * @param length 长度为4位或者6位
   * @return
   */
    public static Integer generateValidateCode(int length){
      Integer code =null;
      if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
      }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
      }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
      }
      return code;
    }

    /**
   * 随机生成指定长度字符串验证码
   * @param length 长度
   * @return
   */
    public static String generateValidateCode4String(int length){
      Random rdm = new Random();
      String hash1 = Integer.toHexString(rdm.nextInt());
      String capstr = hash1.substring(0, length);
      return capstr;
    }
}
六、发送哀求调用

@PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
      //获取手机号
      String phone = user.getPhone();
      if (StringUtils.isNotEmpty(phone)){
            //生成随机的4位验证码
         String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("code={}",code);
            //调用阿里云提供的短信服务api完成发送短信
//            SMSUtils.sendMessage("模板签名","模板id",phone,code);

            //需要将生成的验证码保存到Session
            session.setAttribute(phone,code);

            return R.success("手机短信验证码发送成功");
      }

      return R.error("短信发送失败");
    }

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 短信验证码的实现(阿里云)