代码基本上都注释了详细的作用,不再多做解释

配置文件 application.yml

ali:
  # 阿里云短信
  sms:
    accessKeyId:  #AccessKey ID
    accessKeySecret:  #AccessKey Secret
    templateCode: SMS_154950909 #模板(默认)
    signName: 阿里云短信测试 #签名(默认)
    domain: dysmsapi.aliyuncs.com #短信产品域名(默认)
    version: 2017-05-25 #版本(默认)
    regionId: default #地区(默认)

配置文件的实体类 包含全部get set方法 类上方加注解

//从Spring3.0,@Configuration用于定义配置类,会被扫描,用于构建Bean定义,初始化spring容器
@Configuration
//prefix绑定属性(与yml中的属性绑定)
@ConfigurationProperties(prefix = "ali.sms")
public class AliYunConfig {...}

.AliYunService.java 

import com.alibaba.fastjson.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
//@component 把普通pojo实例化到spring容器中
@Component
public class AliYunService {
    //Logger初始化日志对象,方便输出的时候,可以打印出日志信息所属的类
    private static final Logger logger= LoggerFactory.getLogger(AliYunService.class);
    //@Autowired 自动注入
    //在使用@Autowired时,首先在容器中查询对应类型的bean
  //如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
  //如果查询的结果不止一个,那么@Autowired会根据名称来查找。
  //如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
    @Autowired
    private AliYunConfig aliYunConfig;
    //定义方法调用阿里云短信接口 sendSms发短信
    public String sendSms(String phone,String code){
        //配置短信发送相关属性
        Config config = new Config();
        config.setAccessKeyId(aliYunConfig.getAccessKeyId());
        config.setAccessKeySecret(aliYunConfig.getAccessKeySecret());
        //访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";


        //创建客户端(SDK客户端初始化)
        Client client=null;
        try {
             client = new Client(config);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //组装请求对象
        SendSmsRequest request = new SendSmsRequest();
        //必填:待发送手机号,支持逗号分割批量调用
        request.setPhoneNumbers(phone);
        //必填:短信签名
        request.setSignName(aliYunConfig.getSignName());
        //必填:短信模板
        request.setTemplateCode(aliYunConfig.getTemplateCode());

        //封装验证码
        Map<String,String> map=new HashMap<>();
        map.put("code",code);
        //模板中的变量替换JSON串
        request.setTemplateParam(JSON.toJSONString(map));
        //发送短信
        //返回数据:Code请求状态码 Message状态码描述 Bizld回执ID Requestld请求ID
        SendSmsResponse response=null;
        try {
             response = client.sendSms(request);
             logger.info("发送短信之后返回结果:{}",response.getBody().getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response.getBody().getMessage();
    }
}

UmsSmsServiceImpl.java

上级目录service中写接口

import包 根据代码情况调整

import cn.pet.constant.Constants;
import cn.pet.service.UmsSmsService;
import cn.pet.service.thirdparty.aliyun.sms.AliYunService;
import cn.pet.service.thirdparty.redis.RedisService;
import cn.pet.utils.MathUtils;
import cn.pet.utils.UmsUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
//声明为业务层,纳入spring管理
@Service
//声明式事务管理
@Transactional
public class UmsSmsServiceImpl implements UmsSmsService {
    private static final Logger logger= LoggerFactory.getLogger(AliYunService.class);
    @Autowired
    private AliYunService aliYunService;
    //@Override是伪代码,表示重写
    //编译器可以验证@Override下面的方法名是否是你父类中所有的,如果没有则报错
    @Override
    public Boolean sendSms(String phone, Integer codeType) {
        //需要生成验证码(调用工具类)
        String code = MathUtils.random();
        //info输出日志信息
        logger.info("手机号码:{} 短信验证码为:{}",phone,code);
        //发送短信,返回状态码描述
        String result = aliYunService.sendSms(phone, code);
        //对比状态码描述,ALI_SMS_RESULT:"OK"
        if (result.equals(Constants.Sms.ALI_SMS_RESULT)){
            return true;
        }
        return false;
    }
}

 UmsSmsController.java

控制器

//映射请求,指定控制器可以处理的URL请求
@RequestMapping("/api/ums/sms")
//等同于@Controller + @ResponseBody
@RestController
public class UmsSmsController {
    @Autowired
    private UmsSmsService umsSmsService;
    @PostMapping("/sendSms")
    public Result sendSms(String phone,Integer codeType){
        //判断手机号 isEmpty判断是否为空 checkPhone正则表达式判断是否为手机号格式
        if (StringUtils.isEmpty(phone) | !UmsUtils.checkPhone(phone)){
            //FAIL_UMS_PHONE_ERROR手机号错误
            return ResultUtils.returnResult(ResultEnum.FAIL_UMS_PHONE_ERROR);
        }
        //验证短信类型
        if (!UmsUtils.checkCodeType(codeType)){
            //FAIL_UMS_SMS_CODE_TYPE_ERROR短信类型错误
            return ResultUtils.returnResult(ResultEnum.FAIL_UMS_SMS_CODE_TYPE_ERROR);
        }
        //调用service接口
        Boolean aBoolean = umsSmsService.sendSms(phone, codeType);
        if (aBoolean){
            //返回成功的Result
            return ResultUtils.returnSuccess();
        }else {
            //返回失败的Result
            return ResultUtils.returnFail();
        }
    }
}

另外代码中用到了些工具类保证代码的规范

如果不使用只需稍微改动即可,注释也写明了工具类中方法和属性的调用结果

(没搞懂怎么上传文件,先空着)