盛世宏图 发表于 2024-6-13 22:07:55

阿里云短信验证码实战

一、创建阿里云短信权限用户

1、登岸阿里云之后我们点击头像,接着点击AccessKey:
https://img-blog.csdnimg.cn/3e1cb9c2bb5d44ebbd3c051cd0b7df73.png
2、选择开始使用子用户 :
https://img-blog.csdnimg.cn/2cf9415732654ea391f57aca1b83b6f8.png
3、我们先要创建一个用户组:
https://img-blog.csdnimg.cn/fef2474126e746b0b7c6a59d3134d772.png
4、依次点击新建的用户组——授权管理,给用户组授权,开通短信验证码服务:
https://img-blog.csdnimg.cn/fb5707bd26b44492a0536ed89fe3586e.png
5、接着我们新建一个用户(具体用来操纵的账号),肯定要勾选OpenAPI调用访问,如许我们才能通过代码访问:
https://img-blog.csdnimg.cn/dade43f9302e42e88d47d56f823b6a74.png
记得把AccessKey保存下来,以为背面会看不到:
https://img-blog.csdnimg.cn/016fd7a511514cb1b2ff8545e7b71e38.png
6、接着将这个用户添加到刚刚的用户组即可:
https://img-blog.csdnimg.cn/13b467dcf2af4a16bb016a86406a4bf0.png
二、开通阿里云短信服务

1、在搜索框搜索短信服务,点击加载之后,选择免费开通,即可开通短信服务。
2、我们开通短信服务之后,还要设置签名和模板:
https://img-blog.csdnimg.cn/2ebf507d6de64e76849b67d69f78bbea.png
签名就相当于公司名称,模板就是短信的模板,验证码短信分为几部分:
https://img-blog.csdnimg.cn/156eaeffa9754b6f8cc801f97003f2dc.png
默认会给我们设置一个模板,我们可以直接用这个模板(注意:模板肯定要和某个签名绑定,否则发送不了验证码):
https://img-blog.csdnimg.cn/66d21cd457ca4bbb9d0afb35c20b826f.png
但是没有默认的签名,我们需要本身添加,申请里有肯定要有理有据,比较正当,等待审核通过即可:
https://img-blog.csdnimg.cn/18eb50d8143d4cef9a176d8645d51fd0.png
可以在快速学习和测试模块,体验一下短信验证码的使用:
https://img-blog.csdnimg.cn/2c81e3d359b64aa3877a0c58dd890f75.png
这一块也会有实现短信验证码功能的代码:
https://img-blog.csdnimg.cn/95561ba9e66b42a794d5cf747ae4d105.png
三、编写测试代码

我们可以在资助文档中查看具体的使用步调:资助文档
1、首先在项目中导入Java SDK的依靠:
<!--阿里云短信验证码sdk-->
      <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.16</version>
      </dependency>

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
      </dependency>
                       
                        <!--springboot集成redis-->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
然后编写一个测试类来测试是否能正常发送验证码:
//连接阿里云
      DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "Your AccessKey ID", "Your AccessKey Secret");
      IAcsClient client = new DefaultAcsClient(profile);

      //构建请求,一般这里不用动
      CommonRequest request = new CommonRequest();
      request.setSysMethod(MethodType.POST);
      request.setSysDomain("dysmsapi.aliyuncs.com");
      request.setSysVersion("2017-05-25");
      request.setSysAction("SendSms");

      //设置发送相关的参数
      request.putQueryParameter("PhoneNumbers","xxxx"); //手机号
      request.putQueryParameter("SignName","xxxx"); //申请阿里云 签名名称
      request.putQueryParameter("TemplateCode","xxxxx"); //申请阿里云 模板code

      HashMap<String, Object> map = new HashMap<>();
      map.put("code", 123456);
      request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));//验证码数据,转换json数据传递

      try{
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
      } catch (ClientException e){
            e.printStackTrace();
      }
测试代码写完之后我们就可以实行这段代码举行测试了,结果成功!
四、封装发送短信接口

1、编写Service接口:
public interface SendSms {
    //手机号、模板代码、验证码
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code);
}
2、编写接口实现类:
@Service
public class SendSmsImpl implements SendSms {
    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
      //连接阿里云
      DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tMk6A312KwNVnxNuTno", "1MyEwE0uqfHYTFyFAcydutAFBZgGBj");
      IAcsClient client = new DefaultAcsClient(profile);

      //构建请求,一般这里不用动
      CommonRequest request = new CommonRequest();
      request.setSysMethod(MethodType.POST);
      request.setSysDomain("dysmsapi.aliyuncs.com");
      request.setSysVersion("2017-05-25");
      request.setSysAction("SendSms");

      //设置发送相关的参数
      request.putQueryParameter("PhoneNumbers",phoneNum); //手机号
      request.putQueryParameter("SignName","唐世华个人签名"); //申请阿里云 签名名称
      request.putQueryParameter("TemplateCode",templateCode); //申请阿里云 模板code


      request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));//验证码数据,转换json数据传递,这里要用map

      try{
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();//判断发送是否成功
      } catch (ClientException e){
            e.printStackTrace();
      }
      return false;
    }
}
3、编写Controller测试类:
@RestController
@CrossOrigin//跨域支持
public class SendSmsController {

    @Autowired
    private SendSms sendSms;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @GetMapping("/send/{phone}")
    public String code(@PathVariable("phone") String phone){
      //调用方法模拟真实业务
      //如果redis缓存中存在手机号的验证码,说明验证码还未过期,可继续使用
      String code = redisTemplate.opsForValue().get(phone);
      System.out.println(code);
      if(!StringUtils.isEmpty(code)){
            return phone + ":" + code + "已存在,还没有过期,可继续使用!";
      }

      //生成验证码并存储到redis中
      //生成验证码(包含数字和字母)
      //code = UUID.randomUUID().toString().substring(0, 4);

      //生成纯数字
      int uuid = UUID.randomUUID().toString().replaceAll("-","").hashCode();
      uuid = uuid < 0 ? -uuid : uuid;//String.hashCode() 值会为空
      code = String.valueOf(uuid).substring(0, 4);

      HashMap<String, Object> param = new HashMap<>();
      param.put("code", code);

      boolean isSend = sendSms.send(phone, "SMS_274310067", param);//发送验证码

      if(isSend){ //发送成功
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS);//将验证码存到redis,设置5分钟过期
            return phone + ":" + code + "发送成功!";
      }else {
            return "发送失败";
      }

    }

}
完结撒花!!

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