我们经常会有注册手机号填验证码的需求,现在我们就通过阿里云短信业务来实现
一 准备
1. 创建用户组和用户
- 我们登录到阿里云,先预先充值一些钱,测试的话充1块差不多了,因为短信不是免费的,计价如下:
- 进入控制台,hover头像选择accesskey管理,进入到如下页面,选择右边的选项
- 点击用户组管理,点击创建用户组,信息随便填,我之前已经创建过了
- 创建完后点击进入用户组,选择权限管理,
- 添加sms管理权限
- 点击用户管理,创建用户,创建好后立即保存弹出key和secret
- 创建完后进入,加入到刚创建的用户组,就自动继承了权限,要记住权限管理里accesskey
2. 开通短信服务,配置短信模板和签名
- 搜索进入短信服务页,选择同意开通
- 选择国内消息的签名管理
点击【签名管理】 ,进入到如下编辑页,选择验证码,则下面都不需要填,签名和申请说明要正式
点击模板管理的【添加模板】 ,进入到如下页,模板名称最好正式一点,不要乱填,模板内容使用其示例即可,申请说明要正当,不然无法审核通过,如网站注册验证码测试使用。
审核都通过,就成功做好准备,可以进行开发了。
二 官方示例测试SMS
1. 先新建一个springboot项目
2. 导入依赖,sms短信服务所需的sdk,fastjson和redis(因为短信验证码过几分钟会刷新)
-
<!--导入sms依赖-->
-
<dependency>
-
<groupId>com.aliyun
</groupId>
-
<artifactId>aliyun-java-sdk-core
</artifactId>
-
<version>4.5.1
</version>
-
</dependency>
-
-
<!--导入fastjson-->
-
<dependency>
-
<groupId>com.alibaba
</groupId>
-
<artifactId>fastjson
</artifactId>
-
<version>1.2.61
</version>
-
</dependency>
-
-
<!--导入redis依赖-->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-data-redis
</artifactId>
-
</dependency>
3. 测试使用,在test里加入如下官方示例:
-
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(
"RegionId",
"cn-hangzhou");
-
try {
-
CommonResponse response = client.getCommonResponse(request);
-
System.out.println(response.getData());
-
}
catch (ServerException e) {
-
e.printStackTrace();
-
}
catch (ClientException e) {
-
e.printStackTrace();
-
}
其中accessKeyId和accessSecret换成自己的。
4. 我们需要添加自定义的一些参数,如发送的手机号、签名、模板和验证码,为了方便,验证码先写死,在request.setSysAction下添加
-
//自定义参数
-
-
request.putQueryParameter(
"PhoneNumbers",
"填手机号");
-
request.putQueryParameter(
"SignName",
"填刚审核通过的签名");
-
request.putQueryParameter(
"TemplateCode",
"填审核通过的模板code");
-
-
//构建短信验证码
-
Map<String,Object>
map =
new HashMap<>();
-
map.put(
"code",
1212);
-
request.putQueryParameter(
"TemplateParam", JSONObject.toJSONString(
map));
5. 运行测试,即可受到短信(第一条)
三 自己写一个发送验证码服务
1. 新建service,有send方法,参数分别为手机号,签名,短信模板code和验证码
-
package com.example.demo.service;
-
-
import org.springframework.stereotype.Service;
-
-
import java.util.Map;
-
-
@Service
-
public
interface SendSmsService {
-
-
public boolean send(String phoneNumber,String signName, String templateCode, Map<String,Object> code);
-
}
2. 写service的实现类,写法参照官方示例,我们返回值时boolean来表示发送成功还是失败
-
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.SendSmsService;
-
import org.springframework.stereotype.Service;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
@
Service
-
public
class SendSmsServiceImpl implements SendSmsService {
-
-
-
@
Override
-
public boolean send(
String phoneNumber,
String signName,
String templateCode,
Map<
String,
Object> code) {
-
//连接阿里云
-
DefaultProfile profile =
DefaultProfile.getProfile(
"cn-hangzhou",
"LTAI4GABjAibZprzH3n5hEnw",
"u86tmFbCLdfyYTLtesuLAPTkFXBjxT");
-
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", phoneNumber);
-
request.putQueryParameter(
"SignName",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;
-
}
-
}
3. 写一个controller控制层来控制,将随机生成的验证码缓存到redis中,并设置5分钟失效
-
package com.example.demo.controller;
-
-
import com.example.demo.service.SendSmsService;
-
import org.apache.commons.codec.binary.StringUtils;
-
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.Map;
-
import java.util.UUID;
-
import java.util.concurrent.TimeUnit;
-
-
@RestController
-
@CrossOrigin
-
public
class SmsController {
-
-
@Autowired
-
private SendSmsService sendSmsService;
-
-
@Autowired
-
private RedisTemplate<String,String> redisTemplate;
-
-
@GetMapping(
"/send/{phone}")
-
public String sendCode(@PathVariable("phone") String phone){
-
-
String code = redisTemplate.opsForValue().get(phone);
-
if(code!=
null&&!code.equals(
"")){
-
return
"验证码还可使用";
-
}
-
code = UUID.randomUUID().toString().substring(
0,
4);
-
//构建短信验证码
-
Map<String,Object> map =
new HashMap<>();
-
map.put(
"code",code);
-
-
boolean isSend = sendSmsService.send(
"手机号",
"签名",
"模板code",map);
-
if(isSend){
-
redisTemplate.opsForValue().set(phone,code,
5, TimeUnit.MINUTES);
-
return
"接受到验证码:"+code;
-
}
-
return
"发送失败";
-
}
-
-
}
4. 访问这个地址,就能收到验证码了。
转载:https://blog.csdn.net/qq_41957257/article/details/106607036
查看评论