阿里云短信验证码服务
阿里云短信服务

了解阿里云用户权限操作
登录阿里云账号,然后悬停头像,会发现AccessKey 管理,点击去

这个时候为了安全,选择子用户的 AccessKey

创建用户组

然后填写,会验证验证码



开通阿里云短信服务
创建好用户组之后,需要点开用户组,然后添加权限

然后添加用户

创建好之后保存自己的密码和账户

用户登录名称 icanci@1829881847712669.onaliyun.comAccessKey ID LTAI4G4JptDwzhS624rapUz2SECRET jKrNsVyG1jhYkWN5g6V5v3IzQZoGZS
然后进入短信服务

然后添加一个模板

然后再添加签名

添加短信模板
- 短信的基本内容
- 等待审核通过 需要正当的理由
添加签名
- 公司的名称
- 等待审核通过 需要正当的理由
添加用户到组,否则没有权限操作

编写测试代码
新建SpringBoot项目
添加依赖
<!-- 阿里云短信业务 --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.4.3</version></dependency><!-- 如果有需要使用JSON --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency><!-- 整合 Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
package cn.icanci.sms.test;import com.alibaba.fastjson.JSON;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 java.util.HashMap;/*** @Author: icanci* @ProjectName: aliyun-sms* @PackageName: cn.icanci.sms.test* @Date: Created in 2020/7/18 22:16* @ClassAction:*/public class SendSms {public static void main(String[] args) {// 连接阿里云DefaultProfile profile =DefaultProfile.getProfile("cn-hangzhou","账户","密码");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", "15252067235");// 自定义签命request.putQueryParameter("SignName", "是小猪童鞋啦");// 自定义模板 Coderequest.putQueryParameter("TemplateCode", "SMS_196653273");// 构建短信验证码HashMap<String, Object> map = new HashMap<>();map.put("code",9711);// 自定义验证码request.putQueryParameter("TemplateParam", JSON.toJSONString(map));try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}}}
编写可复用的微服务接口、实现验证码的发送
// Service 接口public interface SendSms {/*** 短信发送业务* @param phoneNum 手机号* @param templateCode 模板Code* @param code 需要发送的信息* @return 返回是否发送成功*/boolean send(String phoneNum, String templateCode, Map<String, Object> code);}
// Service 实现类package cn.icanci.sms.service.impl;import cn.icanci.sms.service.SendSms;import com.alibaba.fastjson.JSON;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: icanci* @ProjectName: aliyun-sms* @PackageName: cn.icanci.sms.service.impl* @Date: Created in 2020/7/19 8:34* @ClassAction:*/@Servicepublic class SendSmsImpl implements SendSms {@Overridepublic boolean send(String phoneNum, String templateCode, Map<String, Object> code) {/*** 连接阿里云*/DefaultProfile profile =DefaultProfile.getProfile(// 不需要改"cn-hangzhou",// key"LTAI4G4JptDwzhS624rapUz2",// pwd"jKrNsVyG1jhYkWN5g6V5v3IzQZoGZS");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", "是小猪童鞋啦");// 自定义模板 Coderequest.putQueryParameter("TemplateCode", templateCode);// 自定义验证码request.putQueryParameter("TemplateParam", JSON.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;}}
# 本机 redis 配置spring:redis:port: 6379host: 127.0.0.1
// 发送短信的业务接口package cn.icanci.sms.controller;import cn.icanci.sms.service.SendSms;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*;import java.util.HashMap;import java.util.UUID;import java.util.concurrent.TimeUnit;/*** @Author: icanci* @ProjectName: aliyun-sms* @PackageName: cn.icanci.sms.controller* @Date: Created in 2020/7/19 8:39* @ClassAction: 发送短信业务的接口*/@RestController@CrossOriginpublic class SendSmsController {@Autowiredprivate SendSms sendSms;@Autowiredprivate RedisTemplate<String, String> redisTemplate;@GetMapping("/send/{phone}")public String getSmsCode(@PathVariable("phone") String phone) {// 调用方法发送 (模拟真实业务)String code = redisTemplate.opsForValue().get(phone);if (!StringUtils.isEmpty(code)) {// 已经存在,没有过期return phone + " : " + code;}// 生成验证码并且存储到Redis中code = UUID.randomUUID().toString().substring(0, 4);HashMap<String, Object> codeMap = new HashMap<>();codeMap.put("code", code);boolean isSend = sendSms.send(phone, "SMS_196653273", codeMap);if (isSend) {// 将手机号作为key,验证码作为 code,有效时间是5分钟redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);return phone + " : " + code + " 发送成功";} else {return "发送失败";}}}
启动项目,浏览器输入http://localhost:8080/send/15252067235
等待手机接受验证码即可
