首页 > 其他分享 >十二天----->阿里云短信服务的整合:

十二天----->阿里云短信服务的整合:

时间:2022-11-18 22:23:04浏览次数:40  
标签:redis 短信 十二天 spring request param ----- return

开通短信服务的整合

一、新建短信微服务

整合阿里云短信服务,注册时候发送手机验证码
image

  1. 在service 创建子模块 service_msm
  2. 创建包的结构,创建controller 和 service 等结构
  3. 阿里云短信服务开通和使用 SMS_259450133
  4. 编写代码实现短息的发送
  • 在service-sms中引入依赖
短信服务模块添加的依赖
    <dependencies>
        <!--    这是一个json的转化工具    -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <!--    阿里云操作的核心的库    -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
        </dependency>
    </dependencies>
相关的配置application.properties
# 服务端口
server.port=8006
# 服务名
spring.application.name=service-msm
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/xiaofan_edu?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123

#Redis 的相关配置
spring.redis.host=192.168.149.128
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/xiaofan/msmservice/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

设置生成随机数的工具类
/**
 * 获取随机数的工具类
 */
public class RandomUtil {
    private static final Random random = new Random();
    private static final DecimalFormat fourdf = new DecimalFormat("0000");
    private static final DecimalFormat sixdf = new DecimalFormat("000000");
    public static String getFourBitRandom() {
        return fourdf.format(random.nextInt(10000));
    }
    public static String getSixBitRandom() {
        return sixdf.format(random.nextInt(1000000));
    }
    /**
     * 给定数组,抽取n个数据
     *
     * @param list
     * @param n
     * @return
     */
    public static ArrayList getRandom(List list, int n) {
        Random random = new Random();
        HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
        // 生成随机数字并存入HashMap
        for (int i = 0; i < list.size(); i++) {
            int number = random.nextInt(100) + 1;
            hashMap.put(number, i);
        }
        // 从HashMap导入数组
        Object[] robjs = hashMap.values().toArray();
        ArrayList r = new ArrayList();
        // 遍历数组并打印数据
        for (int i = 0; i < n; i++) {
            r.add(list.get((int) robjs[i]));
            System.out.print(list.get((int) robjs[i]) + "\t");
        }
        System.out.print("\n");
        return r;
    }
}

编写Controller部分,里面实现了使用redis设置有效时常
@RestController
@RequestMapping("/eduservice/chapter")
@CrossOrigin //解决跨越问题
public class MsmController {
    /*验证码在五分钟之内有效:怎么实现呢?
        Redis能够设置过期时间,因此可以使用redis来进行设置它的有效时间
        怎么做呢?
        1.注入:    private RedisTemplate<String,String> redisTemplate;
        2.从Redis中获取验证码,如果能够获取到直接返回
        3.如果获取不到,则进行阿里云短信发送
    */
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    private MsmService msmService;

    @GetMapping("send/{phone}")
    public R sendMsm(@PathVariable String phone) {
        //2.从Redis中获取验证码,如果能够获取到直接返回
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)) {
            return R.ok();
        }
        //3.如果获取不到,则进行阿里云短信发送
        //通过工具类,生成随机的数,传递给阿里云进行发送
        String randomCode = RandomUtil.getFourBitRandom();//生成随机数
        Map<String, Object> param = new HashMap<>();
        param.put("code", randomCode);

        //调用service中的方法进行短信的发送
        boolean isSend = msmService.send(param, phone);
        if (isSend) {
            System.out.println(isSend + "---------------------------------");

            //发送成功,把发送的验证码放到Redis中,并设置有效时间
            //randomCode:这里需要传进来生成的随机数,如果传code ,则可能为空
            redisTemplate.opsForValue().set(phone, randomCode, 5, TimeUnit.MINUTES);
            return R.ok();
        } else {
            return R.error().message("短信发送失败");
        }
    }
}

生成service代码
public interface MsmService {
    boolean send(Map<String, Object> param, String phone);
}
service 代码的实现类:在这里实现短信的发送功能
@Service
public class MsmServiceImpl implements MsmService {
    /**
     * 发送短信的方法: 
     *
     * @param param 包含验证码
     * @param phone 手机号
     * @return 返回Boolean值,True 则发送成功
     */
    @Override
    public boolean send(Map<String, Object> param, String phone) {
        if (StringUtils.isEmpty(phone)) return false; //判断电话是否为空
        DefaultProfile profile =
                DefaultProfile.getProfile("default", "LTAI5t5cpNhgU9e8PBo3nxqj", "VxmEJ1UnTi8jIwcPs1hd9vTlweyrz8");
        IAcsClient client = new DefaultAcsClient(profile);

        //设置一些相关的固定参数:
        CommonRequest request = new CommonRequest();
        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.POST); //默认提交方式
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");

        //设置发送相关的一些参数:
        request.putQueryParameter("PhoneNumbers", phone); //设置发送的手机号
        request.putQueryParameter("SignName", "阿里云短信测试"); //签名的名称
        request.putQueryParameter("TemplateCode", "SMS_154950909"); //模板的Code
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //设置验证码:JSON的格式

        //最终的发送
        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;
    }
}

**为什么使用Redis做短信验证的有效时间呢?** https://blog.csdn.net/weixin_53029342/article/details/127337567

标签:redis,短信,十二天,spring,request,param,-----,return
From: https://www.cnblogs.com/gz-xiaofan/p/16905045.html

相关文章

  • CSP-J2022
    D整活导致\(400\)变\(390\)哭。A.乘方其实枚举就能过,特判\(a=1\)就行了。但是考场上看这题太像快速幂了就码了个快速幂。普通的快速幂:(longlong)tot=1;whi......
  • 开发笔记1.0-配置Linux的必要开发环境
    1.连接云服务器使用工具:putty和Winscp2.安装JDKCentOS使用yum命令下载JDK8#安装JDK1.8yuminstalljava-1.8.0-openjdkjava-1.8.0openjdk-devel3.安装MySQL5.7......
  • 后端程序员必会的前端知识-03:Vue2
    三.Vue21.Vue基础1)环境准备安装脚手架npminstall-g@vue/cli-g参数表示全局安装,这样在任意目录都可以使用vue脚本创建项目创建项目vueui使用图形......
  • RTSP协议的处理--RECORD
        一、ABLMediaServer的过程1.没做过多的处理,只是对协议进行回复。2.Session是在ANNOUNCE命令中得到。二、ZLMediaKit的过程1.Session也是在ANNOUNCE命令中得......
  • 强化学习代码实战-08 PPO算法 (倒立摆)
    连续性问题处理"""@Date:2022/11/2@Fun:倒立摆控制"""importrandomimportgymimporttorchimportnumpyasnpfrommatplotlibimportpyplotaspltfromI......
  • router-link其他属性
             ......
  • javascript-代码随想录训练营day3
    203.移除链表元素题目链接:https://leetcode.cn/problems/remove-linked-list-elements/题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足No......
  • 2022-11-18学习内容
    1.案例-购物车-清空购物车1.1ShoppingCartActivity.javapackagecom.example.chapter06;importandroidx.appcompat.app.AppCompatActivity;importandroid.app.Ale......
  • RISC-V 特权指令结构
    机器模式机器模式(缩写为M模式,M-mode)是RISC-V中hart(hardwarethread,硬件线程)可以执行的最高权限模式。在M模式下运行的hart对内存,I/O和一些对于启动和配置系......
  • DSP+FPGA评估板 TI TMS320C6657 1.25GHz-DSP原理图
         TI公司的TMS320C6655/57是不定点/浮点数字信号处理器(DSP),基于KeyStone多核架构,内核速度高达1.25GHz,集成了各种包括C66x内核,存储器子系统,外设和加速器在内的各......