如何利用阿里云短信服务来发送验证码

一、短信发送

1.阿里云短信服务介绍:

在项目中,如果要实现短信发送功能,我们无需自己实现,也无需和运营商直接对接,只需要调用 第三方提供的短信服务即可。目前市面上有很多第三方提供的短信服务,这些第三方短信服务会和各个 运营商(移动、联通、电信)对接,我们只需要按照提供的开发文档进行调用就可 以发送短信。这些短信服务一般都是收费服务。

2.如何使用阿里云短信服务

  • 需要先注册一个阿里云的账号
  • 登陆后进入控制台,然后搜索短信服务,进入短信服务控制台,开通短信服务
  • 进入短信服务管理界面,选择国内消息菜单
  • 首先要添加一个资质认证,一般在1个小时左右就可以通过
  • 资质认证后,需要申请短信签名,并添加,短信签名是短信发送者的署名,可以表示发送者的身份。
  • 然后设置短信模板,在阿里云短信服务中也提供了很多的短信模板可以使用

3.设置AccessKey

AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限, 我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。 我们点击右上角的用户头像,选择"AccessKey管理",这时就可以进入到AccessKey的管理界面。

进入到AccessKey的管理界面之后, 提示两个选项 "继续使用AccessKey" 和 "开始使用子用户AccessKey",两个区别如下:

1.继续使用AccessKey 创建的是阿里云账号的AccessKey,是具有账户的完全权限,可以通过API调用阿里云的服务, 不仅是短信服务,其他服务(OSS,语音服务,内容安全服务,视频点播服务...等)也可以调用。 一旦AccessKey泄露,不太安全

2.开始使用子用户AccessKey 可以创建一个子用户,这个子用户我们可以分配比较低的权限,比如仅分配短信发送的权限, 不具备操作其他的服务的权限,即使这个AccessKey泄漏了,也不会影响其他的云服务, 相对安全。

在这里建议使用子用户Accesskey

如果在使用的过程中 AccessKey 不小心泄漏了,我们可以在阿里云控制台中, 禁用或者删除该AccessKey。 然后再创建一个新的AccessKey, 保存好AccessKeyId和AccessKeySecret(这里一定要保存好AccessKeyId和AccessKeySecret,如果删除该AccessKeyId,也需要AccessKeySecret进行验证)

二、代码开发

1.使用阿里云短信服务发送短信,可以参照官方提供的文档(官方文档:短信服务(SMS)-阿里云帮助中心 (aliyun.com)

2.根据官方文档的提示,引入相关依赖,然后再引入对应的java代码,就可以实现相应功能了。

三、代码

1.引入pom依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.16</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>

2.将官方提供的main方法封装为一个工具类

      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.IAcsClient;
      import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
      import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.profile.DefaultProfile;
/**
 * 短信发送工具类
 */
public class SMSUtils {
   /**
    * 发送短信
    * @param signName 签名
    * @param templateCode 模板
    * @param phoneNumbers 手机号
    * @param param 参数
    */
   public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
       //注意将<accessId>和<accessKey secret>换成你自己的
      DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","<accessId>", "<accessKey secret>");
      IAcsClient client = new DefaultAcsClient(profile);
      SendSmsRequest request = new SendSmsRequest();
      request.setSysRegionId("cn-hangzhou");
      request.setPhoneNumbers(phoneNumbers);
      request.setSignName(signName);
      request.setTemplateCode(templateCode);
      request.setTemplateParam("{"code":""+param+""}");
      try {
         SendSmsResponse response = client.getAcsResponse(request);
         System.out.println("短信发送成功");
      }catch (ClientException e) {
         e.printStackTrace();
      }
   }
}

3.验证码生成

/**
 * 随机生成验证码工具类
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length){
        Integer code =null;
        if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

四、简单示例,在一个类中实现

1.引入依赖

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.3.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.49</version>
        </dependency>
        <dependency>
package com.example.demomessage;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Random;

@SpringBootTest
class DemoMessageApplicationTests {

    //把这里的ACCESS_KEY_ID和ACCESS_KEY_SECRET 换成你自己的
    private static final String REGION_ID = "cn-hangzhou";
    private static final String ACCESS_KEY_ID = "<ACCESS_KEY_ID>";
    private static final String ACCESS_KEY_SECRET = "<ACCESS_KEY_SECRET>";


    private IAcsClient createClient() {
        DefaultProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        return new DefaultAcsClient(profile);
    }

    // 生成随机验证码的方法
    private String generateVerificationCode() {
        Random random = new Random();
        int code = 100000 + random.nextInt(900000); // 生成六位数验证码
        return String.valueOf(code);
    }

    private void sendSms(String phoneNumber, String signName, String templateCode, HashMap<String, Object> templateParam) {
        IAcsClient client = createClient();
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);

        request.putQueryParameter("PhoneNumbers", phoneNumber);
        request.putQueryParameter("SignName", signName);
        request.putQueryParameter("TemplateCode", templateCode);

        // 生成随机验证码并放入模板参数
        String verificationCode = generateVerificationCode();
        templateParam.put("code", verificationCode);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(templateParam));

        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
            System.err.println("Server Exception: " + e.getMessage());
        } catch (ClientException e) {
            e.printStackTrace();
            System.err.println("Client Exception: " + e.getMessage());
        }
    }

    @Test
    void contextLoads() {
        HashMap<String, Object> map = new HashMap<>();

        // 调用sendSms方法发送带有随机验证码的短信
        sendSms("你的电话", "签名", "模板code(SMS开头的)", map);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值