阿里云短信工具类2020.8.5

阿里云短信工具类2020.8.5

最近项目中需要整合阿里云的短信发送,发现使用方式有变化,封装了一套新版的阿里短信工具类,供大家参考和使用~

申请签名和模板

我们需要先登录阿里云官网,找到阿里云短信

短信模板和签名的申请不是本篇文章研究的重点,大家可以去官网自行申请~

获取Access Key

成功获取签名和模板后,我们点击右上角的头像,选择Access Key管理

如果出现安全提醒,我们可以暂时先忽略,如果对阿里云比较了解,可以申请子Access Key使用,更加安全。

点击显示,进行一个简单的短信验证,查看Access Key和Access Key Secret

导入maven依赖

新版的maven依赖:

        <!-- aliyun短信 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.1</version>
        </dependency>

工具类说明

工具类一共包含两部分内容SMSVO和SMSUtil,分别是返回值对象和工具类主体

方法说明:该工具类向外暴露下述两个方法

方法名 参数 返回值 说明
sendMessage String phoneNumber SMSVO 发送短信,返回自定义类,包含code(String,随机生产的六位验证码)、msg(String,成功或失败信息)和success状态(Boolean,是否成功发送)
isPhoneNumber String phoneNumber boolean 校验手机号码

需要修改的常量值,下面的常量需要修改为自己阿里云的信息:

    /**
     * 需要替换为自己的ACCESS_KEY_ID
     */
    private static final String ACCESS_KEY_ID = "";

    /**
     * 需要替换为自己的ACCESS_KEY_SECRET
     */
    private static final String ACCESS_KEY_SECRET = "";

    /**
     * 这里要修改为自己的短信签名
     */
    private static final String SIGN_NAME = "";

    /**
     * 修改为自己的模板CODE
     */
    private static final String TEMPLATE_CODE = "";

    /**
     * 模板中的变量名称 例如模板中为${code} 此处就填写code
     */
    private static final String TEMPLATE_PARAM = "";

SMSVO代码

package cn.rayfoo.common.util.sms;

import lombok.Data;

/**
 * @author rayfoo@qq.com
 * @version 1.0
 * @date 2020/8/5 21:20
 * @description 短信验证码返回结果
 */
@Data
public class SMSVO {

    /**
     * 验证码
     */
    private String code;

    /**
     * 是否发送成功
     */
    private boolean success;

    /**
     * 返回信息
     */
    private String msg;
}

完整的工具类SMSUtil代码:

package cn.rayfoo.common.util.sms;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author rayfoo@qq.com
 * @version 1.0
 * @date 2020/8/5 19:42
 * @description 阿里短信工具类 2020.8.5最新使用方式
 */
public class SMSUtil {

    /*********************************************  需要修改的部分start  *************************************************/

      /**
     * 需要替换为自己的ACCESS_KEY_ID
     */
    private static final String ACCESS_KEY_ID = "";

    /**
     * 需要替换为自己的ACCESS_KEY_SECRET
     */
    private static final String ACCESS_KEY_SECRET = "";

    /**
     * 这里要修改为自己的短信签名
     */
    private static final String SIGN_NAME = "";

    /**
     * 修改为自己的模板CODE
     */
    private static final String TEMPLATE_CODE = "";

    /**
     * 模板中的变量名称 例如模板中为${code} 此处就填写code
     */
    private static final String TEMPLATE_PARAM = "";

    /*********************************************  需要修改的部分end  *************************************************/

    /**
     * 下面是一些默认的配置,无需修改
     * REGION_ID 服务器大区   不建议修改
     * SYS_DOMAIN API地址   不可修改
     * SYS_VERSION 系统版本 不可修改
     * SYS_ACTION API接口名必须为SendSms 不可修改
     */
    private static final String REGION_ID = "cn-hangzhou";
    private static final String SYS_DOMAIN = "dysmsapi.aliyuncs.com";
    private static final String SYS_VERSION = "2017-05-25";
    private static final String SYS_ACTION = "SendSms";

    /**
     * 预编译正则,提高效率
     */
    private static final Pattern PATTERN = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$");

    /**
     * 创建profile对象
     */
    private static DefaultProfile profile = null;

    /**
     * 创建client对象
     */
    private static IAcsClient client = null;

    /**
     * 创建request对象
     */
    private static CommonRequest request = null;


    /**
     * 静态代码块中初始化一些参数
     */
    static {

        //初始化profile
        profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        client = new DefaultAcsClient(profile);

        //初始化一些参数
        request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain(SYS_DOMAIN);
        request.setSysVersion(SYS_VERSION);
        request.setSysAction(SYS_ACTION);
        request.putQueryParameter("RegionId", REGION_ID);
        request.putQueryParameter("SignName", SIGN_NAME);
        request.putQueryParameter("TemplateCode", TEMPLATE_CODE);
    }

    /**
     * 校验手机号是否合法
     * @param phoneNumber
     * @return
     */
    public static boolean isPhoneNumber(String phoneNumber) {
        Matcher m = PATTERN.matcher(phoneNumber);
        return m.matches();
    }


    /**
     * 发送短信的逻辑
     * @param phoneNumber 手机号码
     * @return
     */
    public static SMSVO sendMessage(String phoneNumber) {

        //创建result
        SMSVO result = new SMSVO();
        //默认为false,只有成功时为true
        result.setSuccess(false);
        //判断是否为手机号
        if(!isPhoneNumber(phoneNumber)){
            result.setMsg("手机号码不合法!");
            return result;
        }

        //获取六位随机数
        String code = (long) (Math.random() * (999999 - 100000) + 100000) + "";

        //初始化用户自定义参数
        request.putQueryParameter("PhoneNumbers", phoneNumber);
        //在短信内容中嵌入随机数
        request.putQueryParameter("TemplateParam", "{\"" + TEMPLATE_PARAM + "\":\"" + code + "\"}");


        //发送的业务逻辑
        try {
            CommonResponse response = client.getCommonResponse(request);
        } catch (Exception e) {
            result.setMsg("本次发送失败,请查看错误信息:" + e.getMessage());
            e.printStackTrace();
            return result;
        }
        //成功则返回正确的信息
        result.setCode(code);
        result.setMsg("短信发送成功!");
        result.setSuccess(true);
        return result;
    }

    /**
     * 私有化构造
     */
    private SMSUtil() {
    }

}

posted @ 2020-07-16 21:53  张瑞丰  阅读(1115)  评论(1编辑  收藏  举报