引言

短信服务现在在很多地方都用的到,我们最多接触到的可能就是验证码的发送了;现在很多大厂都提供由短信服务对应的api,直接调用就可以轻松实现短信发送;下面我以阿里云为例,演示一下如何短信发送验证码;

阿里云短信服务

首先是一些准备工作,注册阿里云账号就不说了;

打开自己的控制台,搜索找到短信服务:

点开后找到快速学习(现在阿里云短信服务正式使用开通需要营业执照什么的证明,但是它也提供了学习用的方法,实现起来都差不多):

在这里可以绑定一下自己的手机号,因为用来测试,所以只有绑定的手机号才能成功接收短信:

然后可以看到下面有个签名模板,这个是一些必要的参数,一会要用到:

这些都弄完后还有两个以外的步骤:

  • 在这里创建一个accessKey,这是你这个用户接口调用凭证:

记住保存好自己的AccessKey ID和secret;

  • 虽然是短信测试,但是毕竟发短信还是要钱的,所以还需要充点钱,很便宜,一条短信几分钱,我充了三块钱大概可以调用接口七十多次吧:

做完这些后,准备工作就完成了,可以发一条短信测试一下:

下面就是代码开发;

代码开发

其实阿里云已经提供好代码模板了,能力强的可以直接看它的模板,并不难:

这里代码有两种版本,我这里就用网上最多的老版的了(还是看需求,在java这一块老版本其实没有问题的);

下面就是具体代码开发:

先引入依赖:

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.2.1</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.2.0</version>
</dependency>

在application.yml中配置一些基本信息:

region_id就是服务地区,选择离自己近的就好;

另外两个参数就是刚才创建的accesskey;

然后创建一个工具类用来获取这三个参数:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class AliyunConstant implements InitializingBean {@Value("aliyun.sms.region_id")private String regionId;@Value("aliyun.sms.access_key_id")private String accessKeyId;@Value("aliyun.sms.secret")private String secret;public static String REGION_ID;public static String ACCESS_KEY_ID;public static String SECRET;@Overridepublic void afterPropertiesSet() throws Exception {REGION_ID = regionId;ACCESS_KEY_ID = accessKeyId;SECRET = secret;}
}

然后配置短信发送模板:

/**
* 短信发送方法
* @param map 短信内容
* @param phone 发送电话号码
* @return 发送信息结果
*/
public Boolean sendMessage(Map<String, Object> map, String phone) {if (StringUtils.isAnyBlank(phone)) {throw new BusinessException(StatusCode.NULL_ERROR, "手机号为空");}DefaultProfile profile =DefaultProfile.getProfile(AliyunConstant.REGION_ID, AliyunConstant.ACCESS_KEY_ID, AliyunConstant.SECRET);IAcsClient client = new DefaultAcsClient(profile);SendSmsRequest request = new SendSmsRequest();request.setSignName("阿里云短信测试"); // 短信签名request.setTemplateCode("SMS_154950909"); // 短信模板coderequest.setPhoneNumbers(phone); // 测试号的号码(其它号码需要添加测试号先)request.setTemplateParam(JSONObject.toJSONString(map)); // 发送短信信息内容(因为这里是验证码,格式为:{"code":"4-6位数字"})try {SendSmsResponse response = client.getAcsResponse(request);log.info(JSON.toJSONString(response));return response.getMessage().equals("OK"); // 短信发送成功时Message信息为OK(默认的)} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {log.error("ErrCode:" + e.getErrCode());log.error("ErrMsg:" + e.getErrMsg());log.error("RequestId:" + e.getRequestId());}return false;
}

注意:这里是验证码发送,所以map格式需要为:{“code”:“4-6位数字”},格式错误会发送失败;


在这里我在多说点验证码发送的细节吧;

首先验证码的获取可以通过后端生成一个随机数,这里提供一个生成四位或六位的随机数工具类:

import lombok.extern.slf4j.Slf4j;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;/*** 生成随机短信验证码*/
@Slf4j
public class RandomUtils {private static final Random random = new Random();private static final DecimalFormat fourdf = new DecimalFormat("0000");private static final DecimalFormat sixdf = new DecimalFormat("000000");/*** 获取四位随机验证码*/public static String getFourBitRandom() {return fourdf.format(random.nextInt(10000));}/*** 获取六位随机验证码*/public static String getSixBitRandom() {return sixdf.format(random.nextInt(1000000));}/*** 给定数组,抽取n个数据*/public static ArrayList getRandom(List list, int n) {Random random = new Random();HashMap<Object, Object> hashMap = new HashMap<Object, Object>();// 生成随机数字并存入HashMapfor (int i = 0; i < list.size(); i++) {int number = random.nextInt(100) + 1;hashMap.put(number, i);}// 从HashMap导入数组Object[] robjs = hashMap.values().toArray();ArrayList r = new ArrayList();// 遍历数组并打印数据for (int i = 0; i < n; i++) {r.add(list.get((int) robjs[i]));log.info(list.get((int) robjs[i]) + "\t");}log.info("\n");return r;}}

然后通过该工具类生成验证码,然后就可以调用上面的短信发送模板,把验证码和发送给的手机号传过去;

短信发送成功后,将验证码存入redis中,key为该验证码发送到的手机号,还需要设置一个超时时间,比如5分钟:

redisTemplate.opsForValue().set("sms:phone:" + phone, verifyCode, 5, TimeUnit.MINUTES);

设置到redis目的就是为了防止用户短时间内多次调用短信发送接口,分分钟让你破产;

设置了redis,那么每次调用短信发送接口前都需要通过发送用户的手机号判断一下redis中是否有该用户的发送记录,如果有,就不要在调用短信发送逻辑;

这就是大致流程了,当然实际情况肯定比这个复杂,这只是一个大致思路;

大致接口实现如下:

@GetMapping("/{phone}")
public BaseResponse<String> sendMessage(@PathVariable String phone) {if (StringUtils.isAnyBlank(phone)) {throw new BusinessException(StatusCode.NULL_ERROR, "手机号为空");}// 从redis中查看有没有该手机号的验证码String verifyCode = (String) redisTemplate.opsForValue().get("sms:phone:" + phone);if (!StringUtils.isAnyBlank(verifyCode)) {return ResultUtils.success("验证码已发送");}// 如果redis没有该手机号验证码,则获取验证码并发送短信verifyCode = RandomUtils.getSixBitRandom(); // 获取六位验证码Map<String, Object> messageMap = new HashMap<>(); // 短信内容{"code":{验证码}}messageMap.put("code", verifyCode);Boolean isSend = smsService.sendMessage(messageMap, phone); // 调用短信发送模板if (isSend) { // 如果发送成功,则将对应手机号验证码存入redis中,设置5分钟内有效redisTemplate.opsForValue().set("sms:phone:" + phone, verifyCode, 5, TimeUnit.MINUTES);} else {throw new BusinessException(StatusCode.SYSTEM_ERROR, "短信发送失败");}return ResultUtils.success("短信发送成功");
}

总结

短信发送的学习是一个很简单的调用api接口的案例,阿里云也有很多其他的服务,可以尝试调用它的接口实现更多好玩的功能;

阿里云短信服务——短信发送验证码相关推荐

  1. 首批唯一!阿里云视频直播服务获信通院首批唯一认证

    简介:阿里云视频直播服务 7 月 28 日,由中国信息通信研究院主办的 2021 可信云大会上,阿里云凭借在视频直播 "云 - 边 - 端" 的产品技术优势,以最高标准通过了可信云 ...

  2. springboot集成阿里云短信服务,实现发送短信功能

    springboot集成阿里云短信服务,实现发送短信功能 准备工作: 1.登陆阿里云->进入控制台->开通短信服务(进入后根据提示开通) 2.充值(借人家平台发短信你以为不要钱的?我充了3 ...

  3. java对接阿里云短信服务详解(验证码,推广短信,通知短信)

    前言 小前提: - java:springboot框架,maven版本管理. - 阿里云:有账号,已经进行实名认证. java对接阿里云短信服务详解(验证码,推广短信,通知短信) 前言 1. 登录阿里 ...

  4. 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)

    文章目录 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现) 1.打开腾讯云短信服务 2.创建短信签名 3.创建短信正文模板 4.等待全部审核完毕即可 5.发送短信 ...

  5. 秒懂云通信:如何用阿里云语音通知服务(小白指南)

    简介: 手把手教你如何使用阿里云语音通知服务,超详细控制台步骤解析,快速上手!更有1650元短信体验代金券和免费试用,点击速抢:https://yqh.aliyun.com/live/cloudcom ...

  6. 2022年阿里云企业初创服务套餐特惠低至2.8折

    2022年阿里云企业初创服务套餐特惠低至2.8折 最近有很多朋友问阿里云对于初创型企业没有优惠活动?近日阿里云推出阿里云企业创服务,套餐享特惠低至2.8折,阿里云基于用户的业务场景推荐专属服务,多款域 ...

  7. 阿里云邮件群发服务API

    这周系统有礼一个新的需求,要求短信或者邮件进行群发给指定人一些消息,然后就选择了阿里云的邮件服务 <a href="https://help.aliyun.com/document_d ...

  8. 阿里云高级技术专家林立翔:基于阿里云弹性GPU服务的神龙AI加速引擎,无缝提升AI训练性能

    2023 年 3 月 23 日 14:00,NVIDIA GTC 开发者大会阿里云开发者社区观看入口正式开放,阿里云高级技术专家林立翔带来了题为<基于阿里云弹性 GPU 服务的神龙 AI 加速引 ...

  9. 阿里云域名邮件服务配置

    阿里云域名邮件服务配置 laravel 下的阿里云域名邮件服务配置 laravel 下的阿里云域名邮件服务配置 使用阿里云的邮件推送服务,域名使用的cloudflare的加速策略.**正文** 登录阿 ...

  10. 一站式数据采集存储的利器:阿里云InfluxDB®️数据采集服务

    背景 随着时序数据的飞速增长,时序数据库不仅需要解决系统的稳定性和性能问题,还需实现数据从采集到分析的链路打通,才能让时序数据真正产生价值.在时序数据采集领域,一直缺少自动化的采集工具.虽然用户可以使 ...

最新文章

  1. xe ftp.config.php,用PHP实现一个高效安全的ftp服务器(一)
  2. 自己动手搭建DNS服务器
  3. 2019\Province_C_C++_B\试题A-组队
  4. NYOJ 311 完全背包
  5. 设计模式之静态代理模式实战
  6. java 去掉 t_java中的“\t”
  7. 信息学奥赛C++语言:for_求和2
  8. ashx文件 验证是否登录_汇总丨增值税综合服务平台登录常见问题解答
  9. 【Spring】Spring boot 可以通过集成jolokia来使用HTTP形式访问mbean
  10. java synoch 加锁_线程间通信 - HappyCowboy - 博客园
  11. 使用多线程进行网图下载
  12. L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
  13. Json文件格式化方法
  14. 从写博到出书:过程全记录
  15. android自定义计步器形状,Android自定义View仿QQ运动步数效果
  16. 计算机无法连接iphone,iphone6连接电脑没反应怎么回事?iphone6连接电脑没反应的解决方法...
  17. 解决:mysql报错ERROR 1049 (42000): Unknown database ‘数据库‘
  18. 点击高德地图标注没法弹窗_巴彦淖尔果农注意啦!林草局喊你上高德地图标注位置哦...
  19. 买什么房最合算(兼谈小产权房热销根源)
  20. html光标定位到文本框,js获取光标位置和设置文本框光标位置示例代码

热门文章

  1. kdj值应用口诀_KDJ指标应用口诀
  2. C语言_函数可变参数列表
  3. 【网络-实验】恐怖的网络环路
  4. 手把手教你配置苹果APNS推送服务
  5. java,判断一个整数是质数还是合数.
  6. 编译-POCO C++支持iOS平台的静态库
  7. 如何使用python下载B站视频
  8. window.onload的使用
  9. 2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结
  10. 【老九学堂】【C++】编码命名规范