SpringBoot使用阿里云短信服务

了解阿里云用户权限操作

spring boot rabbitmq消息发送不成功 springboot发送短信_验证码

1,开启子用户

spring boot rabbitmq消息发送不成功 springboot发送短信_验证码_02

spring boot rabbitmq消息发送不成功 springboot发送短信_验证码_03

2,新建一个用户组(设置添加权限sms)

spring boot rabbitmq消息发送不成功 springboot发送短信_阿里云_04

spring boot rabbitmq消息发送不成功 springboot发送短信_redis_05

3,创建一个用户(具体来操作的账号)

spring boot rabbitmq消息发送不成功 springboot发送短信_阿里云_06

4,得到AccessKey(id,密码)

spring boot rabbitmq消息发送不成功 springboot发送短信_java_07

注意:要将这个账号保存下来

开通阿里云短信服务

1,找到短信控制台面板

spring boot rabbitmq消息发送不成功 springboot发送短信_redis_08

【不清楚的地方,可以看一下帮助文档】

添加短信模块

1,短信的具体内容

2,等待审核通过(需要正当的理由)

spring boot rabbitmq消息发送不成功 springboot发送短信_spring boot_09

spring boot rabbitmq消息发送不成功 springboot发送短信_验证码_10

添加签名

1,公司的名称

2,等待审核通过(需要正当理由)

spring boot rabbitmq消息发送不成功 springboot发送短信_spring boot_11

编写测试代码

1,新建一个SpringBoot项目

2,导入依赖

<!--发送短信-->
<dependency>
    <groupId>com.aliyun </groupId>
	<sartifactId>aliyun-java-sdk-core</artifactId>
    <version>4.0.3</version>
</dependency>
</!--构建数据-->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>
</!--存用户的信息-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3,测试代码

void contextLoads(){
	//连接阿里云
	DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",  "用户的AccessKey ID", "密码");
	IAcsClient client = new DefaultAcsClient(profile)
        
	//构建请求!
	CommonRequest request = new CommonRequest();
	request.setMethod(MethodType.POST);
	request.setDomain("dysmsapi,aliyuncs.com");//不要动
	request.setversion("2017-05-25");//不要动
	request.setAction("SendSms");
    
	//自定义的参数(手机号,验证码,签名,模板!)
	request.putQueryParameter("PhoneNumbers", "手机号");
	request.putQueryParameter("SignName", "签名名称");//签名(要和之前申请的保持一致)
	request.putQueryParameter("TemplateCode", "模板的code");//模板管理里的模板CODE
    
	//构建一个短信的验证码
	HashMap<String, object> map = new HashMap<>();
	map.put ("code",2233)
	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();
	}
}

4,编写接口

public interface SendSms {
	public boolean send(String phoneNum, String templateCode, Map<String, Object> code);
}

5,实现接口

@Service
public class SendSmsImpl implements SendSms{
    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code){
        //连接阿里云
		DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",  "用户的AccessKey ID", "密码");
		IAcsClient client = new DefaultAcsClient(profile)
        
		//构建请求!
		CommonRequest request = new CommonRequest();
		request.setMethod(MethodType.POST);
		request.setDomain("dysmsapi,aliyuncs.com");//不要动
		request.setversion("2017-05-25");//不要动
		request.setAction("SendSms");
    
		//自定义的参数(手机号,验证码,签名,模板!)
		request.putQueryParameter("PhoneNumbers", "手机号");
		request.putQueryParameter("SignName", "签名名称");//签名(要和之前申请的保持一致)
		request.putQueryParameter("TemplateCode", "templateCode");//模板管理里的模板CODE
    
		//构建一个短信的验证码
		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;
		}
    }
}

6,调用接口实现业务

@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);
        if(!StringUtils.isEmpty(code)){
            return phone+":"+code+"已存在,还没过期";
        }
        
        //生成验证码并存储到redis中
        code = UUID.randomUUID().toString().substring(0,4);
        HashMap<String,Object> param = new HashMap<>();
        param.put("code",code);
        
        boolean isSend = sendSms.send(phone,"模板CODE",param);
        
        if(isSend){
            redisTemplate.opsForValue().set(phone,code,5,TimeUnit.SECONDS);
            return phone+":"+code+"发送成功!";
        }else{
            return "发送失败!";
        }
    }
}

7,配置Redis

server.port=9090

spring.redis.host=127.0.0.1
spring.redis.port=6379