用阿里云短信服务--通过Web接口发送短信

本博客在上一篇博客:用阿里云短信服务--发送短信demo 的基础上进行!

 

实现功能:

1.通过Web接口请求调用发送短信方法发送短信验证码;

2.验证码保存在Redis中,并且设置有效时间为5分钟。

 

代码实现:

代码目录结构:

用阿里云短信服务--通过Web接口发送短信_第1张图片

修改pom.xml,添加redis依赖

        
        
            org.springframework.boot
            spring-boot-starter-data-redis
            2.2.2.RELEASE
        

修改application.properties,添加redis配置

spring.redis.host=127.0.0.1
spring.redis.port=6379

SendSms.java

package com.example.demo.service;

import java.util.Map;

public interface SendSms {
    boolean send(String phoneNum, String templateCode, Map code);
}

SendSmsImpl.java 

package com.example.demo.service.impl;

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 com.example.demo.service.SendSms;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class SendSmsImpl implements SendSms {

    public boolean send(String phoneNum, String templateCode, Map code) {
        //连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");//accessKeyId和accessSecret要替换成第一步申请到的值
        IAcsClient client = new DefaultAcsClient(profile);

        //构建请求
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");//不要修改
        request.setVersion("2017-05-25");//不要修改
        request.setAction("SendSms");

        request.putQueryParameter("PhoneNumbers", phoneNum);
        request.putQueryParameter("SignName", "老梁说java");//短信签名
        request.putQueryParameter("TemplateCode", templateCode);//短信模板号
        //构建一个短信验证码
//        HashMap map = new HashMap();
//        map.put("code",112233);
        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;
    }
}

注意:accessKeyId和accessSecret要替换成申请到的值 ;短信签名也要替换成自己的签名

SmsApiController.java

package com.example.demo.controller;

import com.aliyuncs.utils.StringUtils;
import com.example.demo.service.SendSms;
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.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin //跨域
public class SmsApiController {
    @Autowired
    private SendSms sendSms;

    //注入Redis
    @Autowired
    private RedisTemplate 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, 4);
        HashMap param = new HashMap();
        param.put("code", code);

        boolean isSend = sendSms.send(phone, "SMS_189762676", param);//第二个参数为短信模板号,注意替换

        if(isSend){//如果短信发送成功,将手机号和验证码发送到redis缓存起来,过期时间为5分钟
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
            return phone + ":" + code + " 发送成功";
        }
        return phone + ":" + code + " 发送失败";
    }
}

说明:发送短信到的号码是通过请求URL传来的

注意:sendSms.send(phone, "SMS_189762676", param);//第二个参数为短信模板号,注意替换

 

启动redis服务(需要先安装好redis)

进入cmd,输入如下命令,启动redis服务

redis-server

用阿里云短信服务--通过Web接口发送短信_第2张图片

启动项目

用阿里云短信服务--通过Web接口发送短信_第3张图片

浏览器发送请求,请求地址如下:

http://localhost:8080/send/手机号

注意:手机号注意替换为真实的手机号 

运行效果如下:验证码为1a06

用阿里云短信服务--通过Web接口发送短信_第4张图片

手机收到的短信效果如下:

用阿里云短信服务--通过Web接口发送短信_第5张图片

可以看到手机收到的验证码和浏览器的输出一致,都为1a06,

可以验证redis 有效期为5分钟

打开cmd命令行,输入进入redis客户端命令

redis-cli

通过get '手机号'来获取,是否有值

get '手机号'

正常情况是5分钟之内有能看到验证码的值,五分钟之后验证码过期后就看不到了。

 

 

参考链接:https://www.bilibili.com/video/BV1c64y1M7qN

 

完成! enjoy it!

你可能感兴趣的:(短信)