Springboot实现阿里云通信短信服务有关短信验证码的发送功能

时间:2021-05-20

前言

短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。

现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点:

  • 服务商知名度高,业务流量大。(这样的平台可信度高)
  • 服务稳定,不能经常宕机。(保证自身业务的流畅运行)
  • 文档全面详细。(没文档怎么玩?)
  • 最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能。本人也是对比几家后,直接选择阿里云通信的短信服务。(本身项目服务器也是部署在阿里云上,但之前并不知道阿里云有短信服务,早知道阿里有的话就不会浪费时间找其他平台了)。废话不多说,下面直接开始短信验证服务教程。

    准备

    1.登录阿里云,开通阿里云通信短信服务。

    2.申请accessKey

    选择右上角accessKeys,创建一个access key

    3.进入控制台,申请短信签名。这个作用就是用于短信前面“【】”里面的名称。输入时不需要带“【】”

    注意申请规范,要不然审核不会过。符合规范的话一般一个小时左右就能通过了。

    我这里的签名是“喝酒不骑马”

    4.申请短信模版

    模板类型选择验证码。注意,选择验证码后,模板替代变量只支持验证码作为变量,且变量替换值<=6位数字或字母。

    我的模板如下图

    1.下载SDK包

    https://help.aliyun.com/document_detail/55284.html

    下载后,我们需要使用

    aliyun-java-sdk-core-3.2.2.jar

    aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar

    aliyun-sdk-mns-1.1.8.jar

    这三个包

    SpringBoot + Maven下的jar包配置

    1.在工程的resources目录下新建一个lib文件夹,将jar包复制进去。

    2.由于maven库中没有上述几个jar包的依赖,所以需要将本地lib目录下的jar包导入到maven中。并在pom.xml文件中填下如下依赖。

    <dependency> <groupId>aliyun-message-sdk-core</groupId> <artifactId>aliyun-message-sdk-core</artifactId> <version>3.2.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-core-3.2.2.jar</systemPath></dependency><dependency> <groupId>aliyun-message-sdk-mns</groupId> <artifactId>aliyun-message-sdk-mns</artifactId> <version>1.1.8</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-sdk-mns-1.1.8.jar</systemPath></dependency><dependency> <groupId>aliyun-java-sdk-dysmsapi</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar</systemPath></dependency>

    注意, <groupId>、<artifactId>、<version>随意填写。<scope>system</scope>必须要加,这表示导入本地的jar包。

    ${project.basedir}为项目的根路径。

    建立AliyunMessageUtil工具类

    public class AliyunMessageUtil { private static final String product = "Dysmsapi"; //产品域名,开发者无需替换 private static final String domain = "dysmsapi.aliyuncs.com"; // 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) private static final String accessKeyId = "这里替换你的accessKeyId"; private static final String accessKeySecret = "这里替换你的accessKeySecret"; public static SendSmsResponse sendSms(Map<String, String> paramMap) throws com.aliyuncs.exceptions.ClientException { //可自助调整超时时间 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化acsClient,暂不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); //组装请求对象-具体描述见控制台-文档部分内容 SendSmsRequest request = new SendSmsRequest(); //必填:待发送手机号 request.setPhoneNumbers(paramMap.get("phoneNumber")); //必填:短信签名-可在短信控制台中找到 request.setSignName(paramMap.get("msgSign")); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode(paramMap.get("templateCode")); //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为$[code]"时,此处的值为 request.setTemplateParam(paramMap.get("jsonContent")); //选填-上行短信扩展码(无特殊需求用户请忽略此字段)// request.setSmsUpExtendCode(paramMap.get("extendCode")); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者// request.setOutId(paramMap.get("outId")); //hint 此处可能会抛出异常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); return sendSmsResponse; }}

    sendSms(Map<String, String> paramMap)方法是我封装的方法。传入的参数是paramMap,其中包含以下属性:

    phoneNumber:接受者手机号

    msgSign:短信签名名称。在控制台的短信签名里能找到。

    templateCode:短信模版的code。见控制台中的模版code。

    jsonContent:需要替换的变量的JSON字符串。对于验证码来说,String jsonContent = "{\"number\":\"" + randomNum + "\"}";即可。其中randomNum是随机生成的6位验证码。

    extendCode:上行短信模板的验证码,不需要的话可以忽略

    outId:扩展字段,不需要则可以忽略

    调用demo

    public String sendMsg() throws LgdServiceException, ClientException { String phoneNumber = "18888888888"; String randomNum = createRandomNum(6); String jsonContent = "{\"number\":\"" + randomNum + "\"}"; Map<String, String> paramMap = new HashMap<>(); paramMap.put("phoneNumber", phoneNumber); paramMap.put("msgSign", "喝酒不骑马"); paramMap.put("templateCode", "xxxxxxxx"); paramMap.put("jsonContent", jsonContent); SendSmsResponse sendSmsResponse = AliyunMessageUtil.sendSms(paramMap); if(!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) { if(sendSmsResponse.getCode() == null) { //这里可以抛出自定义异常 } if(!sendSmsResponse.getCode().equals("OK")) { //这里可以抛出自定义异常 } }}/** * 生成随机数 * @param num 位数 * @return */public static String createRandomNum(int num){ String randomNumStr = ""; for(int i = 0; i < num;i ++){ int randomNum = (int)(Math.random() * 10); randomNumStr += randomNum; } return randomNumStr;}

    总结

    短信效果如图所示

    对于验证码的校验,可参见我的另一篇博文SpringBoot实现短信验证码校验.

    以上所述是小编给大家介绍的Springboot实现阿里云通信短信服务有关短信验证码的发送功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章