• springboot 使用阿里云短信服务发送验证码


    一.申请阿里云短信服务

    1.申请签名

    2.申请模板

    3.创建accesskey(鼠标悬停在右上角头像)

    二.代码实现

    1.springboot引入maven依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>4.4.0</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
                <version>1.0.0</version>
            </dependency>
    

    2.application.yml(根据实际情况修改)

    server:
      port: 8001
    spring:
      application:
        name: aliyun-sms
      rabbitmq:
        host: 192.168.100.12
      redis:
        host: 192.168.100.12
    aliyun:
      sms:
        accessKeyId: #创建的accesskey中的AccessKey ID
        accessKeySecret: #创建的accesskey中的Access Key Secret
        template_code: #模板管理中的模板CODE
        sign_name: #签名管理中的签名
    

    3.controller

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @RequestMapping(value="/sendsms/{mobile}",method= RequestMethod.POST)
        public Result sendsms(@PathVariable String mobile ){
            userService.sendSms(mobile);
            return new Result(true, StatusCode.OK,"发送成功");
        }
    }
    

    4.service

    @Service
    public class UserService {
    
        @Autowired
        private RedisTemplate redisTemplate;
        @Autowired
        private RabbitTemplate rabbitTemplate;
        
        public void sendSms(String mobile) {
            //生成6位数验证码
            String checkcode = RandomStringUtils.randomNumeric(6);
            //验证码存入缓存,为了注册的时候校验验证码是否正确
            redisTemplate.opsForValue().set("checkcode"+mobile,checkcode,5, TimeUnit.MINUTES);
            //验证码放入消息队列
            Map<String,String> map = new HashMap();
            map.put("mobile",mobile);
            map.put("checkcode",checkcode);
            rabbitTemplate.convertAndSend("sms",map);
        }
    }
    

    5.短信工具类

    @Component
    public class SmsUtil {
    
        //产品名称:云通信短信API产品,开发者无需替换
        static final String product = "Dysmsapi";
        //产品域名,开发者无需替换
        static final String domain = "dysmsapi.aliyuncs.com";
    
        @Autowired
        private Environment env;
    
        // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    
        /**
         * 发送短信
         * @param mobile 手机号
         * @param template_code 模板号
         * @param sign_name 签名
         * @param param 参数
         * @return
         * @throws ClientException
         */
        public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
            String accessKeyId =env.getProperty("aliyun.sms.accessKeyId");
            String accessKeySecret = env.getProperty("aliyun.sms.accessKeySecret");
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(sign_name);
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(template_code);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(param);
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId("yourOutId");
            //hint 此处可能会抛出异常,注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            return sendSmsResponse;
        }
    
        public  QuerySendDetailsResponse querySendDetails(String mobile,String bizId) throws ClientException {
            String accessKeyId =env.getProperty("accessKeyId");
            String accessKeySecret = env.getProperty("accessKeySecret");
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
            //必填-号码
            request.setPhoneNumber(mobile);
            //可选-流水号
            request.setBizId(bizId);
            //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
            request.setSendDate(ft.format(new Date()));
            //必填-页大小
            request.setPageSize(10L);
            //必填-当前页码从1开始计数
            request.setCurrentPage(1L);
            //hint 此处可能会抛出异常,注意catch
            QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
            return querySendDetailsResponse;
        }
    }
    

    6.短信监听类

    @Component
    @RabbitListener(queues = "sms")
    public class SmsListener {
        
        @Autowired
        private SmsUtil smsUtil;
        @Value("${aliyun.sms.template_code}")
        private String template_code;
        @Value("${aliyun.sms.sign_name}")
        private String sign_name;
    
        @RabbitHandler
        public void executeSms(Map<String,String> map){
            String mobile = map.get("mobile");
            String checkcode = map.get("checkcode");
            try {
                smsUtil.sendSms(mobile,template_code,sign_name,"{"code":""+checkcode+""}");
            } catch (ClientException e) {
                e.printStackTrace();
            }
        }
    }
    

    三.测试

    使用postman访问测试

    成功发送

  • 相关阅读:
    Linux进程监控命令
    自学Java第九天
    自学Java第十天
    自学Java第八天
    自学Java第七天
    自学Java第六天
    Java第五天
    Java练习第四天
    自学Java第三天
    自学Java第二天
  • 原文地址:https://www.cnblogs.com/JohnDawson/p/11613637.html
Copyright © 2020-2023  润新知