必定要保管好这个accesskey
不要泄露,选择使用子用户的点击建立用户组,而后根据提示填写便可java
建立完成以后点击新建的用户组进去web
找到权限管理,添加权限redis
输入SMS点击管理短信服务,跳到有边,点击肯定便可spring
根据提示填写就能够编程
编程访问必定要勾选上,由于咱们是经过代码操做的json
点击肯定便可api
建立用户以后点击进入会看到这个用户的全部信息跨域
这里的accesskeyid accessSecret 必定要妥善保管,由于一旦建立了用户以后就看不到密码了,若是泄露,要即便禁用或者删除app
而后点击加入的组,将刚才建立好的用户组添加进去便可dom
该子用户会继承用户组的权限
短信服务
便可 ,点击进入根据提示填写就能够,必定不要乱写,填写正当理由,审核未经过接着审核就行
${code}
这个必定要有,不要修改他,要经过这个将验证码的变量传进去
第一次进去的时候验证码是能够选用的,选用验证码就行,由于我申请过了,因此不能在选择了
必定要等审核经过了才能够使用
这个帮助文档有api参考,能够自行了解
进入官方的demo中
pom.xml 在pom.xml中导入如下依赖
<!--导入依赖sms 发送短信的核心依赖--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <!--FastJson 对于数据的处理的依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> <!--redis 由于短信验证码都是几分钟后没法使用,因此放在redis中--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.3.2.RELEASE</version> </dependency>
先测试一下能不能使用,直接将官方的demo代码复制放到测试类中测试一下
/** * <accessKeyId> 你本身的 accessKeyId 至关于帐号 * accessSecret 在建立用户时的 accessSecret 至关于密码 */ @Test void contextLoads() { 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", "接受短信的手机号"); //签名名称 request.putQueryParameter("SignName", "刚才定义好的签名名称"); //模板code request.putQueryParameter("TemplateCode", "自定义短信模板的模板CODE编码"); //构建一个短信验证码 Map<String,Object> map = new HashMap<>(); map.put("code","1234"); //将定义好的验证码放入进去 //短信验证码 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); try { CommonResponse response = client.getCommonResponse(request); //控制台打印返回的信息 System.out.println(response.getData()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } }
在导包的时候必定不要导错了,导阿里云的,有些包是重名的
测试发送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}
在控制台看到这句话就证实短信发送成功了
是否是已经收到短信了!
发送短信的正式代码
controller
package com.mango.controller; import com.mango.Service.SendSmsService; 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.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.UUID; import java.util.concurrent.TimeUnit; /** * @Author: * @Date: 2020/8/9 22:11 * @CrossOrigin//跨域支持 */ @RestController @CrossOrigin public class SendSmsApiController { @Autowired private SendSmsService sendSmsService; /** * 使用redis的模板 */ @Autowired private RedisTemplate<String,String> redisTemplate; @GetMapping("/send/{phone}") public String sendSms(@PathVariable("phone")String phone){ //调用发送短信的方法(使用redis) //获取redis中的手机号 String code = redisTemplate.opsForValue().get(phone); //判断当前的code的不为空 if(!StringUtils.isEmpty(code)){ return phone+":"+code +"已存在,尚未过时"; } //不然就是没有验证码,生成验证码而且存储到redis中,设置他的过时时间 //生成随机验证码 code = UUID.randomUUID().toString().substring(0, 4); HashMap<String, Object> map = new HashMap<>(); map.put("code",code); //发送短信 boolean isSend = sendSmsService.sendSms(phone, "自定义短信模板的模板CODE编码", map); if(isSend){ //若是短信发送成功就放入到redis中,设置5分钟以后过时 redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES); return phone+":"+code +"发送成功"; }else { return "发送成功"; } } }
service
package com.mango.Service; import java.util.Map; /** * @Author: * @Date: 2020/8/9 22:12 */ public interface SendSmsService { /** * @param phoneNum 发送的手机号 * @param TemplateCode 短信模板的code * @param code 验证码 * @return */ public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code); }
servcieImpl
package com.mango.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.mango.Service.SendSmsService; import org.springframework.stereotype.Service; import java.util.Map; /** * @Author: * @Date: 2020/8/9 22:12 */ @Service public class SendSmsImpl implements SendSmsService { /** * @param phoneNum 发送的手机号 * @param TemplateCode 短信模板的code * @param code 验证码 * @return */ @Override public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) { 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", "刚才定义好的签名名称"); //模板code request.putQueryParameter("TemplateCode", TemplateCode); //短信验证码 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); try { CommonResponse response = client.getCommonResponse(request); //这个是他自带的判断他发送的是否成功,成功就直接返回 return response.getHttpResponse().isSuccess(); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } }
application.yml
server: port: 8090 # redis 我这里使用的是本地的redis spring: redis: host: 127.0.0.1 port: 6379
如今看下是否是已经发送成功了!