阿里云服务器+springboot

1.阿里云前期准备(多图步骤⚠)

登录阿里云账号



创建完用户组之后,给用户组添加短信服务权限


之后在对应的用户组中创建用户,以及给用户添加权限。这里需要注意的是在创建用户的时候,阿里云给的accessKeyId和## 标题accessKeySecret,记得把这两个保存下来,特别是accessKeySecret只在你创建用户的时候显示,忘了的话只能删除accessKeyId再新建一个了。(我第一次踩了这个坑)

2.开通阿里云服务

1.搜索框搜索短信服务

2.如何是国内消息,在国内消息中添加自己的签名和模板

3.编写测试代码

1.导入相关依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 阿里云短信依赖 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!--fastjson,用来解析json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.4.5</version>
        </dependency>
    </dependencies>

2.yml配置

server:
  port: 8080
#redis 相关的配置
spring:
  redis:
    host: 127.0.0.1
    port: 6379

3.service层

public interface SendSms {

    /**
     * 发送短信验证码
     * @param phoneNum  手机号
     * @param templateCode  模板号
     * @param code   验证码
     * @return
     */
    public Boolean send(String phoneNum, String templateCode, Map<String,Object> code);
}

@Service
public class SendSmsImpl implements SendSms {
    /**
     * 发送短信验证码
     * @param phoneNum  手机号
     * @param templateCode  模板号
     * @param code   验证码
     * @return
     */
    @Override
    public Boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
            // 连接阿里云
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "请替换为你的accessKeyId", "请替换为你的accessKeySecret");
            IAcsClient client = new DefaultAcsClient(profile);

            // 构建请求
            CommonRequest request = new CommonRequest();

            request.setMethod(MethodType.POST);

            // 这些内容不要动,是人家阿里爸爸弄出来的,咱不用管
            request.setDomain("dysmsapi.aliyuncs.com");
            request.setVersion("2017-05-25");

            // 自己的内容,此处 SendSms 为发送验证码
            request.setAction("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 (ClientException e) {
                e.printStackTrace();
            }

            return false;
        }
}

4.console层

@RestController
@CrossOrigin    //跨域支持
public class SmsController {
    @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);
        if (!StringUtils.isEmpty(code)) {
            return phone + ":" + code + "已存在,还没有过期";
        }
        // 生成验证码并且存储到 redis 中
        code = UUID.randomUUID().toString().substring(0, 5);
        HashMap<String, Object> param = new HashMap<>();
        param.put("code", code);

        boolean isSend = sendSms.send(phone, "SMS_218565322", param);

        if (isSend) {
            redisTemplate.opsForValue().set(phone, code, 300, TimeUnit.SECONDS);
            return phone + ":" + code + "发送成功!";
        } else {
            retn "发送失败!";
        }
    }
}

小白一名,欢迎宝贝们批评指错。

posted @ 2021-06-24 17:53  admian  阅读(71)  评论(0编辑  收藏  举报