赞
踩
这里我采用的是阿里云提供的短信服务,且无需我们写几行代码,阿里云自动帮我们写好了代码,只需要拿来用即可
因为做测试用所以我是直接在官网上领的免费试用100条,公司有大需求的话也可以搜索短信服务购买短信套餐即可,一条短信也就几分钱。
创建用户组后会得到一个组,随后可以添加权限
点进用户组后我们进去权限管理搜索sms就会出现短信服务的权限,添加即可。
添加了用户组之后我们还需添加用户,填写好名称(自定义),我们重点是需要勾选上编程访问,
这是我们能够通过编写代码发送短信的前提。
随后我们就会生成一个AccessKey的账号密码,这个一定到记住(拿小本本记下来,关闭后就不会再显示密码了),程序中需要用到。
随后我们可以将用户添加到用户组里,他会继承用户组的权限,我们也可以自己添加权限。
用户测试完后我们就进入到短信模板阶段了,需要添加好签名(短信开头的名称部分)和模板(短信模板),这两个都是需要阿里云审核的所以理由要正当,一般几分钟就审核好了。
短信设置好后我们就可以开始编码环节了,首先我们需要查看一下帮组文档如何使用阿里云的短信服务。点进帮助文档选择SDK参考
里面就有每门编程语言的使用方法,我们选择java查看一下
这里面告诉我们需要有java环境并导入依赖就可使用了,如何使用的代码,阿里云也帮我们写好了我们只需要点进OpenAPI Explorer查看代码即可
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
OpenAPI Explorer是一个在线调试工具,可以真实测试发送短信功能,我们可以复制代码到idea中进行开发
我们在SpringBoot项目的测试方法中进行测试
首先我们需要导入阿里云的发送短信服务的依赖和json转换的依赖
(代码中密码和手机号涉及带个人隐私就没展示,可用你自己的)
<!--依赖安装阿里云Java SDK核心库。发送短信用-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--阿里云提供的json转换依赖 转换为json字符串-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
#开启redis服务
spring.redis.host=39.99.247.62
spring.redis.port=6379
//阿里云发送短信服务 代码由阿里云短信服务平台生成,拿来用即可 配置相关个人信息 @Test void smsMessage(){ //AccessKey ID 账号 AccessKey secret密码 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码"); 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", "156161123XX"); //发送给哪个手机号 request.putQueryParameter("SignName", "清峰小栈"); //自己配置的短信签名 request.putQueryParameter("TemplateCode", "SMS_205128031"); //自己配置的模板 模版CODE //构建一个短信验证码 HashMap<String, Object> map = new HashMap<>(); map.put("code",8456); request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); //转换成json字符串 try { CommonResponse response = client.getCommonResponse(request); //发送至客户端 System.out.println(response.getData()); } catch (ClientException e) { e.printStackTrace(); } }
运行代码即可收到验证码信息
在真实业务开发中,我们的验证码是随机生成(可使用UUID生成),并且验证码需要保存并且过一会就要过期(存储到redis中设置过期时间)
1、导入依赖
<!--依赖安装阿里云Java SDK核心库。发送短信用--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <!--阿里云提供的json转换依赖 转换为json字符串--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.74</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </dependency>
2、编写业务层代码
//接口 传入参数为电话号码,模板编号,验证码
public interface SendSms {
boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code);
}
@Service public class SendSmsImpl implements SendSms { @Override public boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code) { DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码"); 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", PhoneNumbers); //发送至手机号 request.putQueryParameter("SignName", "清峰小栈"); //自己配置的短信签名 request.putQueryParameter("TemplateCode", TemplateCode); //自己配置的模板 模版CODE //构建一个短信验证码 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); //转换成json字符串 try { CommonResponse response = client.getCommonResponse(request); //发送至客户端 System.out.println(response.getData()); return response.getHttpResponse().isSuccess();//返回是否发送成功 } catch (ClientException e) { e.printStackTrace(); } return false; } }
3、编写控制器代码
@RestController @CrossOrigin //跨域请求 public class SendSmsController { @Autowired SendSms sendSms; @Autowired RedisTemplate<String,String> redisTemplate; @GetMapping("/sms/{phone}") public String sendSms(@PathVariable("phone") String phone){ System.out.println(phone); //得到电话,先看查一下redis中有无存放验证码 String code = redisTemplate.opsForValue().get(phone); //有则返回已存在 if (!StringUtils.isEmpty(code)){ return phone+":"+code+"已存在,还没有过期!"; }else { //没有则生成验证码,uuid随机生成四位数验证码 code = UUID.randomUUID().toString().substring(0,4); //随机生成四个数形成验证码 HashMap<String, Object> map = new HashMap<>(); map.put("code",code); //调用方法发送信息 传入电话,模板,验证码 boolean send = sendSms.addSendSms(phone, "SMS_205128031", map); //返回ture则发送成功 if (send){ //存入redis中并设置过期时间 redisTemplate.opsForValue().set("phone",code,5, TimeUnit.SECONDS); return phone+":"+code+"发送成功!"; }else { //返回false则发送失败 return "发送失败"; } } } }
代码编写完成,接收前端传来的电话号码即可实现发送验证码到指定电话用户。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。