一、发送短信
在阿里云买完短信接口 ,按步骤测试
如果报错 很大可能是包导入错了!
import org.apache.http.HttpResponse; 这个包容易错
在会员工程中加入短信功能
1. 加入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
2. 发送短信的工具方法
/**
* 第三方短信接口工具方法
* @param host host 配置文件中取出
* @param path path 配置文件
* @param method 请求方式
* @param appCode 阿里云 appCode
* @param receive 电话号
* @return
*/
public static ResultEntity<String> sendShortMessage(
String host,
String path,
String method,
String appCode,
String receive
){
/*String host = "https://smssend.shumaidata.com";
String path = "/sms/send";
String method = "POST";
String appcode = "de0aca7b5135410fbaf40f047051d7b1";*/
Map<String, String> headers = new HashMap<String, String>(16);
// 最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appCode);
Map<String, String> querys = new HashMap<String, String>();
// 生成验证码
StringBuilder code = new StringBuilder();
for(int i = 0; i < 4; i++){
int random = (int) (Math.random() * 10);
code.append(random);
}
querys.put("receive", receive);
querys.put("tag", code.toString());
querys.put("templateId", "M09DD535F4");
Map<String, String> bodys = new HashMap<String, String>();
try {
/**
* 重要提示如下:
* HttpUtils请从
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下载
*
* 相应的依赖请参照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = (HttpResponse) HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
// 获取response的body
// System.out.println(EntityUtils.toString(response.getEntity()));
System.out.println(response.getStatusLine().getStatusCode());
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
return ResultEntity.successWithData(code.toString());
}else{
return ResultEntity.failed("短信未发送");
}
} catch (Exception e) {
e.printStackTrace();
return ResultEntity.failed(e.getMessage());
}
}
3. 目标
4. 代码:
1) 前端index页面点击注册 跳转到注册页面 view-controller
@Configuration
public class CrowdWebMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 添加index跳转到注册页面的view-controller
// viewName 会拼前后缀
String urlPathRegister = "/auth/member/to/register/page.html";
String viewName = "member-reg";
registry.addViewController(urlPathRegister).setViewName(viewName);
}
}
前端form表单里如果有button 需要先把button的type属性改成button 不然会提交页面跳转
2) 前端发送AJAX请求 请求验证码
坑:因为后端会调用第三方接口和redis 所以处理比较慢 需要添加一个 timeout 不然会报504处理超时错误
$(function () {
$("#sendBtn").click(function () {
// 1.接收验证码的短信
var phone = $.trim($("[name=phoneNum]").val());
// 2.发送ajax请求
$.ajax({
"url": "auth/member/send/short/message.json",
"timeout": 5000,
"type": "post",
"data": {
"phoneNum": phone
},
"dataType": "json",
"success": function (response) {
var result = response.result;
if(result == "SUCCESS"){
layer.msg("发送成功!");
}
if(result == "FAILED"){
layer.msg("发送失败!再试一次");
}
},
"error": function (response) {
layer.msg(response.status + " " + response.statusText);
},
})
})
})
5. 第三方短信接口参数配置类
/**
* @date: 2021/3/13 23:25
* @author: 易学习
* 保存第三方短信接口的配置类
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "short.message")
public class ShortMessageProperties {
private String host;
private String path;
private String method;
private String appcode;
}
6. 在yaml中绑定属性
short:
message:
appCode: de0aca7b5135410fbaf40f047051d7b1
host: https://smssend.shumaidata.com
path: /sms/send
method: POST
7. authentication-consumer 主启动类
启动方法的远程调用 【客户端】
@EnableFeignClients
@SpringBootApplication
public class CrowdMainClass {
public static void main(String[] args) {
SpringApplication.run(CrowdMainClass.class);
}
}
8. authentication-consumer controller方法
/**
* @date: 2021/3/13 23:15
* @author: 易学习
*/
@Controller
public class MemberController {
@Autowired
private ShortMessageProperties shortMessageProperties;
@Autowired
private RedisRemoteService redisRemoteService;
@ResponseBody
@RequestMapping(value = "/auth/member/send/short/message.json",method = RequestMethod.POST)
public ResultEntity<String> authMemberSendShortMessage(
@RequestParam("phoneNum") String phoneNum){
// 1.发送验证码到电话号
ResultEntity<String> stringResultEntity = CrowdUtil.sendShortMessage(
shortMessageProperties.getHost(),
shortMessageProperties.getPath(),
shortMessageProperties.getMethod(),
shortMessageProperties.getAppCode(),
phoneNum
);
// 2.判断结果是否发送成功
if (Objects.equals(ResultEntity.SUCCESS,stringResultEntity.getResult())){
String key = CrowdConstant.REDIS_CODE_PREFIX + phoneNum;
// 获取验证码
String value = stringResultEntity.getData();
long time = 5L;
// 发送成功把 验证码存到redis中 并设置5分钟过期时间
ResultEntity<String> saveCodeResultEntity =
redisRemoteService.setRedisKeyValueWithTimeOut(key, value, time, TimeUnit.MINUTES);
if(Objects.equals(ResultEntity.SUCCESS,saveCodeResultEntity.getResult())){
// redis执行成功 返回数据
return ResultEntity.successWithoutData();
}else{
return saveCodeResultEntity;
}
}else{
return stringResultEntity;
}
}
}