阿里云sms短信验证码服务
注册阿里云账号并登录
自己注册就好,此处不再阐述
获取AccessKey ID和SECRET的值,java代码中调接口需要
-
鼠标放到个人图像上选择AccessKey管理
-
选择开始使用子用户AccessKey
-
创建用户组
-
点击新创建的用户组名称进入下图页面,选择添加权限
-
添加下面两个权限
-
创建用户,下图中的编程访问一定要勾上
-
将新建的用户添加到新建的用户组中,用户就有了用户组的权限
-
进入阿里云的短信服务页面,添加签名和模板
签名名称和模板CODE在java代码中需要使用
java代码部分
-
controller中代码
@RestController @CrossOrigin public class SmsApiController { @Autowired private SendSms sendSms; @Autowired private RedisTemplate<String, String> redisTemplate; @GetMapping("/send/{phone}") public String code(@PathVariable("phone") String phone) { //从redis中获取短信验证码 String code = redisTemplate.opsForValue().get(phone); //如果redis中有,则短信验证码已发送并且有效,直接返回验证码已发送 if (StrUtil.isNotEmpty(code)) { return phone + ":" + code + "验证码已发送!"; } //如果redis中没有查到验证码,直接生成6位数验证码,此code和短信模板中的变量${code}保持一致 code = RandomUtil.randomNumbers(6); Map<String, Object> map = new HashMap<>(1); map.put("code", code); //发送验证码,参数中的模板CODE为阿里云模板管理中生成的模板CODE Boolean isSend = sendSms.send(phone, "模板CODE", map); //发送成功后将短信验证码存入redis中,设置有效期为50秒 if (isSend) { redisTemplate.opsForValue().set(phone, code, 50, TimeUnit.SECONDS); return phone + ":" + code + "发送成功!"; } else { return "发送失败!"; } } }
-
service层
public interface SendSms { /** * 发送短信验证码 * @param phoneNumber * @param templateCode * @param map * @return */ Boolean send(String phoneNumber, String templateCode, Map<String, Object> map); }
-
service实现类
@Service public class SendSmsImpl implements SendSms { @Override public Boolean send(String phoneNumber, String templateCode, Map<String, Object> map) { //连接阿里云,后两参数输入自己阿里云账号中生成的AccessKey ID和SECRET的值 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AccessKey ID", "SECRET"); 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", "签名名称"); request.putQueryParameter("TemplateCode", templateCode); //构建短信验证码 request.putQueryParameter("TemplateParam", JSONUtil.toJsonStr(map)); 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; } }
-
配置文件
server: port: 8090 spring: redis: host: 192.168.0.14 port: 6379 password: 123456
-
需要的jar包
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.1</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.7</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>