代码基本上都注释了详细的作用,不再多做解释
配置文件 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();
}
}
}
另外代码中用到了些工具类保证代码的规范
如果不使用只需稍微改动即可,注释也写明了工具类中方法和属性的调用结果
(没搞懂怎么上传文件,先空着)