小言_互联网的博客

阿里云短信业务实战

502人阅读  评论(0)

我们经常会有注册手机号填验证码的需求,现在我们就通过阿里云短信业务来实现

一 准备

1. 创建用户组和用户

  • 我们登录到阿里云,先预先充值一些钱,测试的话充1块差不多了,因为短信不是免费的,计价如下:

  •  进入控制台,hover头像选择accesskey管理,进入到如下页面,选择右边的选项

  • 点击用户组管理,点击创建用户组,信息随便填,我之前已经创建过了

 

  • 创建完后点击进入用户组,选择权限管理,

  • 添加sms管理权限

 

  •  点击用户管理,创建用户,创建好后立即保存弹出key和secret

  • 创建完后进入,加入到刚创建的用户组,就自动继承了权限,要记住权限管理里accesskey

 

2. 开通短信服务,配置短信模板和签名 

  • 搜索进入短信服务页,选择同意开通
  • 选择国内消息的签名管理

点击【签名管理】 ,进入到如下编辑页,选择验证码,则下面都不需要填,签名和申请说明要正式

点击模板管理的【添加模板】 ,进入到如下页,模板名称最好正式一点,不要乱填,模板内容使用其示例即可,申请说明要正当,不然无法审核通过,如网站注册验证码测试使用。

审核都通过,就成功做好准备,可以进行开发了。

二  官方示例测试SMS

1. 先新建一个springboot项目

 2. 导入依赖,sms短信服务所需的sdk,fastjson和redis(因为短信验证码过几分钟会刷新)


  
  1. <!--导入sms依赖-->
  2. <dependency>
  3. <groupId>com.aliyun </groupId>
  4. <artifactId>aliyun-java-sdk-core </artifactId>
  5. <version>4.5.1 </version>
  6. </dependency>
  7. <!--导入fastjson-->
  8. <dependency>
  9. <groupId>com.alibaba </groupId>
  10. <artifactId>fastjson </artifactId>
  11. <version>1.2.61 </version>
  12. </dependency>
  13. <!--导入redis依赖-->
  14. <dependency>
  15. <groupId>org.springframework.boot </groupId>
  16. <artifactId>spring-boot-starter-data-redis </artifactId>
  17. </dependency>

 3. 测试使用,在test里加入如下官方示例:


  
  1. DefaultProfile profile = DefaultProfile.getProfile( "cn-hangzhou", "<accessKeyId>", "<accessSecret>");
  2. IAcsClient client = new DefaultAcsClient(profile);
  3. CommonRequest request = new CommonRequest();
  4. request.setSysMethod(MethodType.POST);
  5. request.setSysDomain( "dysmsapi.aliyuncs.com");
  6. request.setSysVersion( "2017-05-25");
  7. request.setSysAction( "SendSms");
  8. request.putQueryParameter( "RegionId", "cn-hangzhou");
  9. try {
  10. CommonResponse response = client.getCommonResponse(request);
  11. System.out.println(response.getData());
  12. } catch (ServerException e) {
  13. e.printStackTrace();
  14. } catch (ClientException e) {
  15. e.printStackTrace();
  16. }

其中accessKeyId和accessSecret换成自己的。

4. 我们需要添加自定义的一些参数,如发送的手机号、签名、模板和验证码,为了方便,验证码先写死,在request.setSysAction下添加


  
  1. //自定义参数
  2. request.putQueryParameter( "PhoneNumbers", "填手机号");
  3. request.putQueryParameter( "SignName", "填刚审核通过的签名");
  4. request.putQueryParameter( "TemplateCode", "填审核通过的模板code");
  5. //构建短信验证码
  6. Map<String,Object> map = new HashMap<>();
  7. map.put( "code", 1212);
  8. request.putQueryParameter( "TemplateParam", JSONObject.toJSONString( map));

5. 运行测试,即可受到短信(第一条)

 

 三 自己写一个发送验证码服务

1. 新建service,有send方法,参数分别为手机号,签名,短信模板code和验证码


  
  1. package com.example.demo.service;
  2. import org.springframework.stereotype.Service;
  3. import java.util.Map;
  4. @Service
  5. public interface SendSmsService {
  6. public boolean send(String phoneNumber,String signName, String templateCode, Map<String,Object> code);
  7. }

 2. 写service的实现类,写法参照官方示例,我们返回值时boolean来表示发送成功还是失败


  
  1. package com.example.demo.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyuncs.CommonRequest;
  4. import com.aliyuncs.CommonResponse;
  5. import com.aliyuncs.DefaultAcsClient;
  6. import com.aliyuncs.IAcsClient;
  7. import com.aliyuncs.exceptions.ClientException;
  8. import com.aliyuncs.exceptions.ServerException;
  9. import com.aliyuncs.http.MethodType;
  10. import com.aliyuncs.profile.DefaultProfile;
  11. import com.example.demo.service.SendSmsService;
  12. import org.springframework.stereotype.Service;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. @ Service
  16. public class SendSmsServiceImpl implements SendSmsService {
  17. @ Override
  18. public boolean send( String phoneNumber, String signName, String templateCode, Map< String, Object> code) {
  19. //连接阿里云
  20. DefaultProfile profile = DefaultProfile.getProfile( "cn-hangzhou", "LTAI4GABjAibZprzH3n5hEnw", "u86tmFbCLdfyYTLtesuLAPTkFXBjxT");
  21. IAcsClient client = new DefaultAcsClient(profile);
  22. //构建请求
  23. CommonRequest request = new CommonRequest();
  24. request.setSysMethod( MethodType. POST);
  25. request.setSysDomain( "dysmsapi.aliyuncs.com");
  26. request.setSysVersion( "2017-05-25");
  27. request.setSysAction( "SendSms");
  28. //自定义参数
  29. request.putQueryParameter( "PhoneNumbers", phoneNumber);
  30. request.putQueryParameter( "SignName",signName);
  31. request.putQueryParameter( "TemplateCode",templateCode);
  32. request.putQueryParameter( "TemplateParam", JSONObject.toJSONString(code));
  33. try {
  34. CommonResponse response = client.getCommonResponse(request);
  35. System.out. println(response.getData());
  36. return response.getHttpResponse().isSuccess();
  37. } catch ( ServerException e) {
  38. e.printStackTrace();
  39. } catch ( ClientException e) {
  40. e.printStackTrace();
  41. }
  42. return false;
  43. }
  44. }

3. 写一个controller控制层来控制,将随机生成的验证码缓存到redis中,并设置5分钟失效


  
  1. package com.example.demo.controller;
  2. import com.example.demo.service.SendSmsService;
  3. import org.apache.commons.codec.binary.StringUtils;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.web.bind.annotation.CrossOrigin;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. import java.util.UUID;
  13. import java.util.concurrent.TimeUnit;
  14. @RestController
  15. @CrossOrigin
  16. public class SmsController {
  17. @Autowired
  18. private SendSmsService sendSmsService;
  19. @Autowired
  20. private RedisTemplate<String,String> redisTemplate;
  21. @GetMapping( "/send/{phone}")
  22. public String sendCode(@PathVariable("phone") String phone){
  23. String code = redisTemplate.opsForValue().get(phone);
  24. if(code!= null&&!code.equals( "")){
  25. return "验证码还可使用";
  26. }
  27. code = UUID.randomUUID().toString().substring( 0, 4);
  28. //构建短信验证码
  29. Map<String,Object> map = new HashMap<>();
  30. map.put( "code",code);
  31. boolean isSend = sendSmsService.send( "手机号", "签名", "模板code",map);
  32. if(isSend){
  33. redisTemplate.opsForValue().set(phone,code, 5, TimeUnit.MINUTES);
  34. return "接受到验证码:"+code;
  35. }
  36. return "发送失败";
  37. }
  38. }

4. 访问这个地址,就能收到验证码了。


转载:https://blog.csdn.net/qq_41957257/article/details/106607036
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场