阿里云短信验证笔记

news2024/9/21 11:03:40

1.了解阿里云的权限操作

进入AccessKey管理

选择子用户

创建用户组和用户

先创建用户组,建好再进行权限分配

添加短信管理权限

创建用户

创建好后的id和密码在此处下载可以得到

2.开通阿里云短信服务

进行申请,配置短信模板

阿里云短信API文档

短信服务API概览及参考_短信服务(SMS)-阿里云帮助中心

3.测试编码

3.1创建springboot项目导入依赖

        <!--阿里云sdk-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

dome测试代码

package com.yang.sms_dome;

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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;

@SpringBootTest
class SmsDomeApplicationTests {

    @Test
    void contextLoads() {
        // 连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","自己的keyid", "自己的密钥");
        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", "手机号");
        request.putQueryParameter("SignName", "阿里云短信测试");//阿里云专用短信测试签名
        request.putQueryParameter("TemplateCode", "SMS_154950909");//阿里云专用短信测试模板

        //构建短信验证码
        HashMap<String,Object> map=new HashMap<>();
        map.put("code",1877);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));


        try {
            CommonResponse response = client.getCommonResponse(request);
            // 在控制台上打印出返回信息
            System.out.println(response.getData());
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }

}

controller类

package com.yang.sms_dome.controller;

import com.aliyuncs.utils.StringUtils;
import com.yang.sms_dome.service.SendSmsService;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin    //跨域
public class SendSmsController {

    @Autowired
    private SendSmsService sendSmsService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @GetMapping("/send/{phone}")
    public String code(@PathVariable("phone") String phone){
        String code = redisTemplate.opsForValue().get(phone);
        if (StringUtils.isNotEmpty(code)){
            return phone+code+"已存在,未过期";
        }
        //生成验证码并且存储到redis中
         code = generateVerificationCode(4);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",code);

        boolean flag = sendSmsService.sendSms(phone, "SMS_154950909", map);

        if (flag){
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return phone+":"+code+"发送成功!";
        }
        return "发送失败";
    }
    public static String generateVerificationCode(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < length; i++) {
            int digit = random.nextInt(10); // 生成 0 到 9 之间的随机数字
            sb.append(digit);
        }

        return sb.toString();
    }
}

service层

package com.yang.sms_dome.service;


import java.util.Map;

public interface SendSmsService {

    boolean sendSms(String phoneNum, String templateCode, Map<String,Object> code);
}

serviceImpl层

package com.yang.sms_dome.serviceImpl;

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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.yang.sms_dome.service.SendSmsService;
import org.springframework.stereotype.Service;

import java.util.Map;
@Service
public class SendSmsServiceImpl implements SendSmsService {
    @Override
    public boolean sendSms(String phoneNum, String templateCode, Map<String, Object> code) {
        // 连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","自己的keyid", "自己的密钥");
        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;
    }
}

yaml配置文件

server:
  port: 8080

spring:
  redis:
    host: 127.0.0.1
    port: 6379

参考视频:【狂神说】通俗易懂的阿里云短信业务实战教程_哔哩哔哩_bilibili

代码仓库(私有):https://gitee.com/yzh-ch/sms_test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝牙协议栈】【蓝牙分析工具】Ellisys 分析HCI Log和btsnoop Log

1.Ellisys 介绍 Ellisys 的 air log sniffer设备要二三十万,一般不是专业开发蓝牙的估计不会选择使用这个工具,但是即使我们不买这个设备,安装了 Ellisys 的工具也可以看 btsnoop 的,下面我就一步一步教你通过 Ellisys 来打开 btsnoop。 1.1 首先打开 APP(Ellisys 不能直…

零基础学编程,中文编程工具之进度标尺构件的编程用法

零基础学编程&#xff0c;中文编程工具之进度标尺构件的编程用法 一、前言 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——…

Mybatis | Mybatis的核心配置

目录: Mybatis的核心配置 :一、MyBatis的 “核心对象”1.1 SqlSessionFactory1.2 SqlSession :SqlSession对象中的操作数据库的方法 :\<T> T selectOne ( String statement )\<T> T selectOne( String statement , Object parameter )\<E> List\<E> se…

Stable Diffusion 3突然发布!与Sora同架构,一切都更逼真了

文字终于不乱码了&#xff01; 足足酝酿一年之多&#xff0c;相比上一代一共进化了三大能力。 来&#xff0c;直接上效果&#xff01; 首先&#xff0c;是开挂的文字渲染能力。 且看这黑板上的粉笔字&#xff1a; Go Big or Go Home &#xff08;不成功便成仁&#xff09;&…

2023中国PostgreSQL数据库生态大会:洞察前沿趋势,探索无限可能(附核心PPT资料下载)

随着数字化浪潮的推进&#xff0c;数据库技术已成为支撑各行各业数字化转型的核心力量。2023中国PostgreSQL数据库生态大会的召开&#xff0c;无疑为业界提供了一个深入交流、共同探索PostgreSQL数据库技术未来发展趋势的平台。本文将带您走进这场盛会&#xff0c;解析大会的亮…

xsslabs第六关

看一下源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01;…

云呐智能运维包含哪些内容?运维未来的发展方向是什么?

智能运维&#xff08;AIOps&#xff09;是一种使用人工智能应用程序来调节IT操作和维护的实践方式。它结合了大数据和机器学习技术&#xff0c;旨在自动化和改进IT操作和维护任务&#xff0c;如故障检测、因果分析和自动故障修复。以下是智能操作和维护的具体内容、挑战和解决方…

无人售货机管理系统,让零售更智能,更高效

无人自动售货系统强大技术核心优势打造智能售货机系统&#xff0c;其引入物联网、大数据、 云计算等新一代信息技术与自动售货机完美融合&#xff0c;实现传统售货机向智能售货机转型升级。 1.市场前景 据前瞻产业研究院报告显示&#xff0c;中国无人零售行业市场规模自2017年…

Windows的Docker-Desktop安装与问题总结

目录 Docker-Desktop安装步骤 环境配置 Docker-Desktop安装问题总结 问题1&#xff1a;docker-desktop setting界面一直加载转圈 问题2&#xff1a;docker镜像的存储位置变更&#xff08;防止C盘空间不足&#xff09; 参考文献&#xff1a; Docker-Desktop安装步骤 环境…

基YOLOV5实现的AI智能盒子

基于yolov5实现的AI智能盒子框架 开发背景技术实现产品效果源码预览功能介绍 2021-2023是沉淀的几年&#xff0c;经济不景气&#xff0c;各行各业都不太好混&#xff0c;所以这几年也没有太多心思花在csdn上为各大网友写一些技术文章&#xff0c;2024年初&#xff0c;也算是给自…

Entry First Day 入职恩孚第一天

入职第一天&#xff0c;电脑还没配置好就去了工厂。 熟悉了一下设备&#xff0c;切了几个小玩意&#xff0c; hello world 一下。 了解了串行端口的Nodejs的库 https://github.com/serialport/node-serialport&#xff0c;以后要用这个东西和硬件通讯&#xff0c;安装&#…

Linux上搭建并使用ffmpeg(Java)

关于MacOs和Windows系统上使用ffmpeg就不多说了&#xff0c;有很多相关文章&#xff0c;今天给大家分享一个在Linux环境下使用Java语言来使用ffmpeg 一、首先去官网下载一个Linux对应的ffmpeg包 1、进入ffmpeg官网&#xff1a;官网 2、点击左侧导航栏Download 3、选择Linux对…

自动生成多个有规律的python列表

问大家一些问题&#xff0c;平常在我们练习时如果在没有给定数据的情况下&#xff0c;手敲这样一个DataFrame 对象是不是很麻烦&#xff0c;而且容易出错&#xff0c;我想了一个办法让其自动生成&#xff0c;这样就省事省力。 首先这些数据都是有规则的依次递增的例如&#xf…

本届挑战赛冠军方案:基于LLM的多场景智能运维

本文介绍本届挑战赛冠军得主SRE-Copilot团队的参赛方案&#xff1a;基于LLM的多场景智能运维。 基础架构-SRE&#xff0c;负责字节跳动基础架构部门所有组件的SRE工作&#xff0c;沿着成本、稳定性、效率、服务四条主线&#xff0c;致力于打造高扩展、高可用的生产系统。基础架…

林浩然与杨凌芸的Swing组件奇遇记:从按钮到滚动条的UI大冒险

林浩然与杨凌芸的Swing组件奇遇记&#xff1a;从按钮到滚动条的UI大冒险 The Swing Component Odyssey of Lin Haoran and Yang Lingyun: A UI Adventure from Buttons to Scrollbars 在Java王国的一隅&#xff0c;程序员才子林浩然和智慧女神杨凌芸正在进行一场别开生面的UI设…

MySQL 事务原理分析

事务 前提&#xff1a;有并发连接。定义&#xff1a;事务是用户定义的一系列操作&#xff0c;这些操作要么都做&#xff0c;要么都不做&#xff0c;是一个不可分割的单位。目的&#xff1a;事务将数据库从一种一致性状态转换为另一种一致性状态&#xff0c;保证系统始终处于一…

Vue2:路由的两种模式history模式和hash模式

一、情景说明 之前我们写的项目启动后&#xff0c;浏览器访问时&#xff0c;路径中会有个#/&#xff0c;会导致不够美观 因为一般的访问地址都是http://123.123.123.123/aaa/bbb这种形式 这一篇&#xff0c;就来解决这个问题 二、案例 1、hash模式 特点&#xff1a;#/后的…

QMessageBox用法及技巧

一&#xff0e;QMessageBox是什么&#xff1f; QMessageBox类为用户提供了主要的警告信息&#xff0c;用户可以根据需求选择需要的响应&#xff1b; QMessageBox 还提供了一些常用的按钮&#xff0c;例如"确定"、"取消"、"是"、"否"…

redis 面试题

1 redis 如何扩容 Redis 的扩容主要分为两种场景&#xff0c;一种是单实例的内存扩容&#xff08;垂直扩容&#xff09;&#xff0c;另一种是Redis集群的扩容&#xff08;水平扩容&#xff09;。 单实例Redis内存扩容&#xff08;垂直扩容&#xff09; 硬件升级&#xff1a; 垂…

Spring MVC 和 Spring Cloud Gateway不兼容性问题

当启动SpringCloudGateway网关服务的时候&#xff0c;没注意好依赖问题&#xff0c;出现了这个问题&#xff1a; Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway. 解决办法就是&#xff1a;删除SpringMVC的依赖&#xff0c;即下列依赖。 &…