使用阿里云发送短信

news/2024/7/5 2:45:13

使用阿里云短信服务有两种方式
在这里插入图片描述
API 发送和 控制台发送,控制台发送到话有太多限制,这里我们使用API 通过 调用服务端代码进行发送。

整体结构如下:
在这里插入图片描述

导入依赖

<!--阿里云短信发送-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.2.6</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.0.0</version>
        </dependency>

外放接口

    /**
     * 发送手机验证码
     */
    @ApiOperation(value = "发送手机验证码", notes = "发送手机验证码")
    @PostMapping("/sendSMS")
    public ApiResult sendSMS(@RequestParam("phone") String phone) {
        //六位数随机数
        long rand = (long)(Math.random()*900000+100000);
        String mCode = String.valueOf(rand);
        boolean mS = SengSmsUtils.sendSMS(phone,mCode);
        //返回数据
        SmsReturnVO smsReturnVO = new SmsReturnVO();
        smsReturnVO.setSendSuccess(true);
        smsReturnVO.setMCode(MD5Utils.toMD5(mCode));
        if (!mS){
            smsReturnVO.setSendSuccess(false);
        }
        return ApiResult.ok(smsReturnVO);
    }

MD5加密

/**
 * Md5加密,加密规则与客户端一致*/
public class MD5Utils {

    public static String toMD5(String s){
        String mStr = "头部特殊字符" + s + "尾部特殊字符";
        try {
            mStr = DigestUtils.md5DigestAsHex(mStr.getBytes(StandardCharsets.UTF_8));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mStr;
    }

}

发送工具类

/**
 * 发送短信通知
 * 多发
 *List<String> mobiles = new ArrayList<>();
 *mobiles.add("15*******13");
 *mobiles.add("13*******27");
 *mobiles.add("17*******56");
 *String s= getSplitString(mobiles);
 */
public class SengSmsUtils {

    // 签名
    private static final String signName = "签名管理-签名名称";
    // 模板
    private static final String templateCode = "模板管理-模板CODE";
    // 阿里云短信配置信息
    private static final String accessKeyId = "AccessKey管理-创建AccessKey";
    private static final String accessKeySecret = "创建后会显示";
    private static final String REGION_ID = "cn-hangzhou"; //固定不用改
    private static final String PRODUCT = "Dysmsapi"; //固定不用改
    private static final String DOMAIN = "dysmsapi.aliyuncs.com"; //固定不用改


    public static boolean sendSMS(String mobile,String mCode) {
        try {
            IClientProfile profile = DefaultProfile.getProfile(REGION_ID, accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint(REGION_ID, REGION_ID, PRODUCT, DOMAIN);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            SendSmsRequest request = new SendSmsRequest();
            request.setMethod(MethodType.POST);
            // 手机号可以单个也可以多个(多个用逗号隔开,如:15*******13,13*******27,17*******56)
            request.setPhoneNumbers(mobile);
            request.setSignName(signName);
            request.setTemplateCode(templateCode);
            request.setTemplateParam("{\"code\":"+"'"+mCode+"'"+"}");
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            if ((sendSmsResponse.getCode() != null) && (sendSmsResponse.getCode().equals("OK"))) {
                return true;
            } else {
                return false;
            }
        } catch (ClientException e) {
            return false;
        }
    }

    /**
     * 获取逗号分隔的拼接字符串
     */
    public static String getSplitString(List<String> str) {
        StringBuilder newS = new StringBuilder();
        if (str != null && str.size() > 0) {
            for (String s : str) {
                newS.append(s).append(",");
            }
        }
        if (newS.length() > 0){
            newS.deleteCharAt(newS.length() - 1);// 删除最后一个多余的逗号
        }

        return newS.toString();
    }
}

接口返回数据

/**
 * 发送验证码返回数据类*/
@Data
public class SmsReturnVO {

    //是否发送成功
    private Boolean sendSuccess;

    //发送成功携带验证码
    private String mCode;

}
此时,调用接口后,会将加密后的验证码返回给接口调用端,接口调用端 在输入框数据验证码后进行MD5 加密,与服务端给的对比即可 (加密规则要与服务端对应)

补充,在发送工具类中的参数在阿里云中如何查看

签名管理-签名名称

在这里插入图片描述

模板管理-模板CODE

在这里插入图片描述

AccessKey管理-创建AccessKey

在这里插入图片描述
在这里插入图片描述

完结,撒花


http://lihuaxi.xjx100.cn/news/2036062.html

相关文章

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload&#xff0c;然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

牛客小白月赛87 D 小苯的IDE括号问题(hard)

原题链接&#xff1a;D-小苯的IDE括号问题&#xff08;hard&#xff09; 题目大意&#xff1a;给定一个长度为n的字符串&#xff0c;字符串由&#xff08;&#xff0c;&#xff09;和I构成&#xff0c;m组询问&#xff0c;如果输入backspace&#xff0c;如果I左右是&#xff0…

智能家居中可自行收集能量的无电池的无线设备

此图片来源于网络 1、背景 ZigBee是一种基于IEEE 802.15.4标准的低速短距离无线通信技术&#xff0c;用于创建个人区域网络。其名称来源于蜜蜂的八字舞&#xff0c;因为蜜蜂通过这种舞蹈来与同伴传递花粉的所在方位信息&#xff0c;从而构成了群体中的通信网络。ZigBee技术具…

ClickHouse 基础(一)

官网 以毫秒为单位查询数十亿行 ClickHouse是用于实时应用和分析的最快、资源效率最高的开源数据库。 安装ClickHouse 使用ClickHouse&#xff0c;你有三个选择: ClickHouse云:官方ClickHouse作为一项服务&#xff0c;-由ClickHouse的创建者构建&#xff0c;维护和支持快速安…

sensitive-word v0.13 特性版本发布 支持英文单词全词匹配

拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署&#xff1f; sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍 更多技术交流 业务背景 对于英文单词 Disburse 之类的&#xff0c;其中的 sb 字母会被…

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…

Vue报错,xxx is defined #变量未定义

vue.js:5129 [Vue warn]: Error in v-on handler: "ReferenceError: count is not defined" 浏览器将这个变量 当做全局变量了&#xff0c;事实上它只是实例中的变量 加上this指定&#xff0c;是vue实例中的变量

使用php实现pc端和移动端分离

使用php实现pc端和移动端分离 自适应技术可以实现根据浏览器的宽度来实现移动端和pc的自适应&#xff0c;但会影响用户的体验&#xff0c;以下代码实现在同一个链接下&#xff0c;移动端和pc分别有各自的html&#xff0c; $browser get_browser(null, true);// 获取设备宽度$d…