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

前言

短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。
现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点:

  1. 服务商知名度高,业务流量大。(这样的平台可信度高)
  2. 服务稳定,不能经常宕机。(保证自身业务的流畅运行)
  3. 文档全面详细。(没文档怎么玩?)

最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能。本人也是对比几家后,直接选择阿里云通信的短信服务。(本身项目服务器也是部署在阿里云上,但之前并不知道阿里云有短信服务,早知道阿里有的话就不会浪费时间找其他平台了)。废话不多说,下面直接开始短信验证服务教程。

准备

  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;
}

总结

短信效果如图所示 
这里写图片描述 

以上就是阿里云通信短信验证码发送的方法。

原文地址:https://blog.csdn.net/Colton_Null/article/details/77283193

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在阿里云短信控制台中创建签名和模板,并获取到 AccessKeyId 和 AccessKeySecret。 接下来,在Spring Boot项目中添加阿里云 Java SDK的依赖: ``` <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> </dependency> ``` 然后,在项目的 application.properties 文件中添加阿里云短信服务的相关配置: ``` aliyun.sms.accessKeyId=yourAccessKeyId aliyun.sms.accessKeySecret=yourAccessKeySecret aliyun.sms.signName=yourSignName aliyun.sms.templateCode=yourTemplateCode ``` 在代码中,你可以使用以下示例代码发送国际短信: ```java import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sms.model.v20170628.SendSmsRequest; import com.aliyuncs.sms.model.v20170628.SendSmsResponse; import java.util.Arrays; public class SmsUtil { private String accessKeyId; private String accessKeySecret; private String signName; private String templateCode; public SmsUtil(String accessKeyId, String accessKeySecret, String signName, String templateCode) { this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; this.signName = signName; this.templateCode = templateCode; } public boolean sendSms(String phoneNumber, String message) { IClientProfile profile = DefaultProfile.getProfile("default", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("default", "default", "Dysmsapi", "dysmsapi.aliyuncs.com"); IAcsClient client = new DefaultAcsClient(profile); SendSmsRequest request = new SendSmsRequest(); request.setPhoneNumbers(phoneNumber); request.setSignName(signName); request.setTemplateCode(templateCode); request.setTemplateParam("{\"code\":\"" + message + "\"}"); try { SendSmsResponse response = client.getAcsResponse(request); if (response.getCode() != null && response.getCode().equals("OK")) { return true; } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } public static void main(String[] args) { // 使用示例 SmsUtil smsUtil = new SmsUtil( "yourAccessKeyId", "yourAccessKeySecret", "yourSignName", "yourTemplateCode" ); boolean result = smsUtil.sendSms("+86xxxxxxxxxxx", "yourMessage"); System.out.println(result); } } ``` 其中,phoneNumber 是接收短信的手机号码,message 是短信内容,可以根据模板中定义的变量替换。调用 sendSms 方法即可发送短信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值