SpringBoot工程下的短信验证

注册部分

打开阿里云官网:https://www.aliyun.com/

点击左上角的登录,用手机支付宝扫码登录,第一次登录需要注册一个阿里云用户

登录上去之后点击左上角个人信息的头像
在这里插入图片描述
点击AccessKey 管理
在这里插入图片描述
点击开始使用子用户AccessKey
在这里插入图片描述
点击左边的用户组,在创建一个用户组
在这里插入图片描述
在点击创建好的用户组点击权限管理,添加一个权限
在这里插入图片描述
选择这个管理短信服务(SMS)的权限点击确定

在这里插入图片描述
再选择用户,创建一个用户,和创建用户组差不多

在这里插入图片描述
记得勾选编程访问

之后回到用户组,点击添加成员,讲刚刚创建好的用户添加进去

点击用户,来到这个页面
在这里插入图片描述
点击创建AccessKey,我创建好了,所以这里是灰色的,这个需要手机短信验证一下就能创建好

创建好之后,记得将弹出的提示框里面的两个重要的AccessKey ID和AccessKey Secret保存下来

需要在代码用到这两个

再去中间最上面的搜索框搜索短信服务

在这里插入图片描述
进去之后点击左边的国内消息

在这里插入图片描述
左边有一个添加签名
在这里插入图片描述
这里选择验证码,因为我已经注册过了,里面的签名名称就写xxx学习网站什么的都可以,申请理由需谨慎填写,因为是人工审核,可以写,我们公司需要借助短信服务来做注册模块的验证,填写好确定之后,等待5分钟到2小时就差不多可以审核完毕,通过之后状态会显示

在这里插入图片描述
再点击模块管理

在这里插入图片描述
左边有一个添加模板
在这里插入图片描述

申请说明也是一样的,不要瞎填,时间跟上面一样的都是人工审核

在这里插入图片描述
申请通过之后,这个模板CODE记得保存一下,写代码需要用到

到这里前面的东西就弄完了,审核通过之后就写代码了

代码部分

导入依赖

		<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.41</version>
        </dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

编写配置信息

spring:
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xiaomi?serverTimezone=UTC
    username: root
    password: 128106
    # redis配置
  redis:
    host: 127.0.0.1
    port: 6379

编写service

package com.myh.service;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author: Myh
 * @date: 2020/12/8 20:53
 */
@Service
public class SendSms {

    public boolean send(String phoneNum, String templateCode, Map<String,Object> code){
        //accessKeyId和密码 在阿里云注册用户时保存下来即可
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        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);//验证码模板
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

编写Controller接口来接收请求

package com.myh.controller;

import com.myh.service.SendSms;
import com.myh.utils.ResponseMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author: Myh
 * @date: 2020/12/8 20:53
 */
@RestController
@CrossOrigin
public class SmsApiController {

    @Autowired
    private SendSms sendSms;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @GetMapping("/send/{phone}")
    public ResponseMessage code(@PathVariable("phone") String phone, HttpSession session) {
        //调用发送方法(使用redis)
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)) {
            return ResponseMessage.error().addObject("time",code+"已存在,还未过期!");
        }
        //生成验证码并存储到redis中
        code = UUID.randomUUID().toString().substring(0, 4);
        session.setAttribute("numCode",code);
        Map<String, Object> param = new HashMap<>();
        param.put("code", code);
        boolean result = sendSms.send(phone, "模板CODE", param);
        if (result) {
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS);
            return ResponseMessage.success();
        }else {
            return ResponseMessage.error();
        }
    }
}

通过postman测试也行,接口上面放的get请求,可以自己通过打开浏览器进行测试,实际业务中,使用post即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值