注册部分
打开阿里云官网:https://www.aliyun.com/
点击左上角的登录,用手机支付宝扫码登录,第一次登录需要注册一个阿里云用户
登录上去之后点击左上角个人信息的头像
点击AccessKey 管理
点击开始使用子用户AccessKey
点击左边的用户组,在创建一个用户组
在点击创建好的用户组点击权限管理,添加一个权限
选择这个管理短信服务(SMS)的权限
点击确定
再选择用户,创建一个用户,和创建用户组差不多
记得勾选编程访问
之后回到用户组,点击添加成员,讲刚刚创建好的用户添加进去
点击用户,来到这个页面
点击创建AccessKey,我创建好了,所以这里是灰色的,这个需要手机短信验证一下就能创建好
创建好之后,记得将弹出的提示框里面的两个重要的AccessKey ID和AccessKey Secret保存下来
需要在代码用到这两个
再去中间最上面的搜索框搜索短信服务
进去之后点击左边的国内消息
左边有一个添加签名
这里选择验证码,因为我已经注册过了,里面的签名名称就写xxx学习网站什么的都可以,申请理由需谨慎填写,因为是人工审核,可以写,我们公司需要借助短信服务来做注册模块的验证,填写好确定之后,等待5分钟到2小时就差不多可以审核完毕,通过之后状态会显示
再点击模块管理
左边有一个添加模板
申请说明也是一样的,不要瞎填,时间跟上面一样的都是人工审核
申请通过之后,这个模板CODE
记得保存一下,写代码需要用到
到这里前面的东西就弄完了,审核通过之后就写代码了
代码部分
导入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
编写配置信息
spring:
# 数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/xiaomi?serverTimezone=UTC
username: root
password: 128106
# redis配置
redis:
host: 127.0.0.1
port: 6379
编写service
package com.myh.service;
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 org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author: Myh
* @date: 2020/12/8 20:53
*/
@Service
public class SendSms {
public boolean send(String phoneNum, String templateCode, Map<String,Object> code){
//accessKeyId和密码 在阿里云注册用户时保存下来即可
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("PhoneNumbers", phoneNum);//手机号码
request.putQueryParameter("SignName", "用户组名字");//用户组名字
request.putQueryParameter("TemplateCode", templateCode);//验证码模板
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;
}
}
编写Controller接口来接收请求
package com.myh.controller;
import com.myh.service.SendSms;
import com.myh.utils.ResponseMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* @author: Myh
* @date: 2020/12/8 20:53
*/
@RestController
@CrossOrigin
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/send/{phone}")
public ResponseMessage code(@PathVariable("phone") String phone, HttpSession session) {
//调用发送方法(使用redis)
String code = redisTemplate.opsForValue().get(phone);
if (!StringUtils.isEmpty(code)) {
return ResponseMessage.error().addObject("time",code+"已存在,还未过期!");
}
//生成验证码并存储到redis中
code = UUID.randomUUID().toString().substring(0, 4);
session.setAttribute("numCode",code);
Map<String, Object> param = new HashMap<>();
param.put("code", code);
boolean result = sendSms.send(phone, "模板CODE", param);
if (result) {
redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS);
return ResponseMessage.success();
}else {
return ResponseMessage.error();
}
}
}
通过postman测试也行,接口上面放的get请求,可以自己通过打开浏览器进行测试,实际业务中,使用post即可